FreeRTOS 按键程序代码笔记
在这里分享一个我写到基于 FreeRTOS 的按键程序,只是自己的一个思路,欢迎讨论。 数据结构定义123456789101112131415161718192021222324252627282930313233343536373839404142434445464748//// File: xtp_defines.h//#ifndef __XTP_DEFINES_H#define __XTP_DEFINES_H#include "at32f413.h"#include <stdbool.h>#include <stdio.h>#define USE_FREERTOS (1) // 1:使用 FreeRTOS 0:不使用 FreeRTOS#define AT32#define LED#if USE_FREERTOS#include "FreeRTOS.h"#include "task.h"#endif#ifdef LED#include...
FreeRTOS钩子函数
FreeRTOS 中的钩子函数和中断的回调函数很像,钩子函数的名字是固定的,在特定事件下会自动执行响应名字的钩子函数,并且钩子函数是可剪裁的,在 FreeRTOSConfig.h中配置是否启用特定的钩子函数。 vApplicationTickHook节拍中断可以选择是否回调一个钩子函数,这个钩子函数允许实现一些周期性的功能。 使用节拍中断钩子函数,需要将 configUSE_TICK_HOOK设置为1,同时钩子函数申明为如下原型: void vApplicationTickHook( void ) 这个钩子函数必须很短且占用堆栈空间很少,因为这是在中断中调用的函数,同时,只能调用以FromISR结尾的API函数。
KiCAD 官方库笔记
Symbol 一些标志丝印,如:CE/ESD/FCC/KiCad/OSHW 等Logo。 TerminalBlock_Altech P5.0mm 45度端子 TerminalBlock_Phoenix 5.08 绿色端子 TestPoint 测试点 Valve 电子管 Varistor 压敏电阻插件 Sensor 传感器 Rotary_Encoder 旋转编码器,EC11等 FR_Shielding 屏蔽罩 FR_Module 常见射频模块,如:ESP32模块等 Resistor_THT 插件电阻 Resistor_SMD 贴片电阻 Relay_THT 插件继电器 Relay_SMD 贴片继电器 Potentiometer_THT 插件电位器 Potentiometer_SMD 贴片电位器 Package_TO_SOT_THT TO和SOT系列封装插件版,TO-220等 Package_TO_SOT_SMD TO和SOT系列封装贴片版,SOT-223-5等 Package_SO SO封装 Package_SON SON封装 Package_SIP...
WPF 样式小记
WPF 中的 Style 和 html 中的 css 是类似的东西,都是定义UI样式,WPF 中的样式可以继承,下面就来了解下 WPF 中的样式使用方法。 定义一个简单的样式这里我们给所有的 Button 定义一个样式,类似与 CSS 中的元素选择器,这里我们选择的元素就是 WPF 中的 Button。 12345678910111213141516171819202122<Window x:Class="Style.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" ...
WPF 消息框例子
这篇文章记录了 WPF 中的 MessageBox 的使用,给出了详细的代码例子。 消息框1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071namespace Dialogs{ /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void messageBoxHandle(object sender,...
FreeRTOS 延时函数
vTaskDelay()任务延时函数,把当前任务从运行态(就绪列表),移到延时列表。 参数: xTicksToDelay > 延时的时间长度,单位是系统时钟节拍周期。 如果调用vTaskDelay()函数的任务在执行过程中被更高优先级的任务或者中断所打断,那么调用vTaskDelay()函数的任务将会受到影响,此时将不能保持一个固定的时间间隔运行。 使用例子12vTaskDelay(500/portTICK_PERIOD_MS);vTaskDelay(200); 函数定义12345678910111213141516171819202122232425262728293031323334353637383940414243#if ( INCLUDE_vTaskDelay == 1 ) void vTaskDelay( const TickType_t xTicksToDelay ) { BaseType_t xAlreadyYielded = pdFALSE; /* A delay time of zero just...
FreeRTOS 任务挂起与任务恢复
FreeRTOS 的任务有几种状态,并且这几种状态可以相互转换,下面是转换图: 任务的4个状态: 运行态 就绪态,指准备好了,可以随时运行 阻塞态 挂起态 运行态当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。 就绪态准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。 阻塞态如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。 处于阻塞状态的任务通常有一个”超时”期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。 阻塞状态下的任务不使用任何处理时间,不能 被选择进入运行状态。 挂起态 Blocked与阻塞状态下的任务一样, 挂起状态下的任务不能...
FreeRTOS 创建任务
1234567891011121314151617#include "FreeRTOS.h"#include "task.h"#define USER_LED_TASK_PRIO 2 /* 定义任务优先级,数字越大优先级越高 */#define USER_LED_TASK_STACK_SIZE 120 /* 定义任务堆栈大小,单位为:字 */TaskHandle_t user_led_handle; /* 定义任务句柄 */void xtp_create_task(void){ xTaskCreate( (TaskFunction_t)led_task, (const char *)"led_task", (uint16_t)USER_LED_TASK_STACK_SIZE, (void *)NULL, (UBaseType_t)USER_LED_TASK_PRIO, ...
Rust 笔记之错误处理
12345678910111213141516171819202122fn result_test(i: i32) -> Result<&'static str, &'static str> { if i > 0 { Err("Error") } else { Ok("ok") }}fn main() { println!("Hello, world!"); let a = result_test(-1); assert_eq!(a.is_ok(), true); match a { Ok(v) => {println!("v: {v}")}, Err(e) => {println!("e:...
Rust 笔记之常量与变量
Rust 中变量和常量的概念,变量分为可变变量和不可变变量,常量用 const 定义。 1234567891011121314151617181920212223fn main() { println!("/////////////////////////////////////////"); println!("==============Hello, world!=============="); println!("/////////////////////////////////////////"); let x = 5; // x 不可变,自动类型推导为 i32 let y: f64 = 12.325; // y 不可变,显式指定类型为 f64, 带小数点的默认自动为 f64 let mut z: f64; // z 可变,值可变,在定义时不给初始化则必须指定变量的类型 println!("x: {x}"); ...