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) → 1ms
    • osDelay(500) → 500ms
    • osDelay(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:任务函数的参数,一般不用
  • 任务句柄:用来后续控制任务(比如挂起、删除),也可以不保存

image-20260509141001496

练习:按照上面的流程创建新任务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);

image-20260509141910978

PS:两个任务不能同时跑

  • 每个任务都是一个 for(;;) 死循环
  • osDelay(xxx) 会让当前任务挂起,让出 CPU
  • FreeRTOS 会自动调度 CPU,轮流执行两个任务,实现 “同时闪烁” 的效果
posted @ 2026-05-09 14:20  Q&25  阅读(18)  评论(1)    收藏  举报