RTOS实践笔记_1
RTOS实践笔记_1
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_8);
osDelay(1);
代码解释:
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_8);- 功能:翻转PD8引脚的电平
- 效果:高变低/低变高
- 用途:最常用在LED闪烁、方波输出、状态切换
osDelay(1);- RTOS(实时操作系统)的延时函数
- 单位:1个系统时钟节拍(tick),不是1ms!
- 作用:让当前任务暂停1个tick,让 CPU 去执行别的任务
- osDelay() 和 HAL_Delay() 的区别:
- HAL_Delay(1) 阻塞1ms,CPU空转
- osDelay(1) 让出CPU,RTOS调度其他任务,更高效
一点小知识:
系统节拍默认配置(STM32CubeMX)
configTICK_RATE_HZ = 1000- 意思:1 tick = 1ms
- 所以:
osDelay(1)→ 1msosDelay(500)→ 500msosDelay(1000)→ 1s
关于给默认线程配置任务的方法:
1、头部任务函数的声明 void StartDefaultTask(void const * argument);
2、FreeRTOS 任务声明宏,格式如下:
/* definition and creation of defaultTask */
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
代码解释:
osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);osThreadDef(任务名,任务函数,优先级,栈参数,栈大小);任务名:这个可以随便起,比如defaultTask任务函数:要跑的函数名,比如StartDefaultTask优先级:osPriorityNormal是默认优先级,还可以用osPriorityAboveNormal等栈参数:一般填0即可栈大小:单位是字(word),128就是128*4=512字节,足够用来跑简单任务
3、编写任务函数:
/* USER CODE BEGIN Header_StartDefaultTask */
/**
* @brief Function implementing the defaultTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
/* 在这里编写运行灯闪烁程序 */
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_8); // 翻转PD8引脚电平,常用在 LED 闪烁、方波输出、状态切换
osDelay(500); // 让当前任务暂停 1 个 tick,让 CPU 去执行别的任务,不是1ms
// 一般系统时钟节拍配置是 1ms = 1 tick
}
/* USER CODE END StartDefaultTask */
4、创建并启动任务的函数 osThreadCreate()
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
任务句柄 = osThreadCreate(osThread(任务名), NULL);
osThread(任务名):对应上面osThreadDef定义的任务NULL:任务函数的参数,一般不用任务句柄:用来后续控制任务(比如挂起、删除),也可以不保存

练习:按照上面的流程创建新任务StartLED_Task
1、声明
/* USER CODE BEGIN FunctionPrototypes */
// LED任务函数声明
void StartLED_Task(void const * argument);
/* USER CODE END FunctionPrototypes */
2、声明宏
osThreadDef(LED_Task,StartLED_Task,osPriorityNormal,0,128);
3、编写任务函数
void StartLED_Task(void const * argument)
{
/* USER CODE BEGIN StartLED_Task */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7); // LED 翻转(PB7)
osDelay(200); // 200ms 翻转一次,比LED1闪得快
}
}
4、创建并启动任务
osThreadCreate(osThread(LED_Task), NULL);

PS:两个任务不能同时跑
- 每个任务都是一个
for(;;)死循环 osDelay(xxx)会让当前任务挂起,让出 CPU- FreeRTOS 会自动调度 CPU,轮流执行两个任务,实现 “同时闪烁” 的效果
浙公网安备 33010602011771号