☰
FreeRTOS跑马灯实验和优先级任务执行揭秘
2026/10/18 7:06:38 网站建设 项目流程

1.实现操作系统版的跑马灯实验

高/低速始终调成外部晶振模式

默认任务的定义

1.复制工程模板出FreeRTOS_LED_TEST

2.新建任务(任务级编程,中断级编程):个数-- 一个外设一个任务

3.如何新建?cubmx配置或者写代码。

4.编写两个任务函数,基于裸机实现效果,两个灯每隔500ms闪一次

2 测试优先级高的任务先运行

调试:用printf去调试

2.1 闪烁的同时打印led0/led1

将串口进行重定向

//串口重定向,放到main.c #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY); return ch; } #endif

哪里使用哪里引入,即加上头文件(在BEGIN 到 END Includes内部)

然后再task1和task2里加入printf来观察任务执行顺序

void led0Task_Function(void *argument) { /* USER CODE BEGIN led0Task_Function */ //该任务实现LED0闪烁,依照裸机思路 /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); printf("led0\r\n"); osDelay(250); } /* USER CODE END led0Task_Function */ }
void led1Task_Function(void *argument) { /* USER CODE BEGIN led1Task_Function */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); printf("led1\r\n"); osDelay(250); } /* USER CODE END led1Task_Function */ }

观察xcom结果

因为前边设置的led1的优先级比led0高,所以led1的任务会先运行。

2.2 具象化优先级任务顺序展示

只打印一次111或者222

void led0Task_Function(void *argument) { /* USER CODE BEGIN led0Task_Function */ //该任务实现LED0闪烁,依照裸机思路 /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); for(;flag1==0;flag1++){ printf("111\r\n"); } osDelay(250); } /* USER CODE END led0Task_Function */ }
void led1Task_Function(void *argument) { /* USER CODE BEGIN led1Task_Function */ /* Infinite loop */ for(;;) { HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); for(;flag2==0;flag2++){ printf("222\r\n"); } osDelay(250); } /* USER CODE END led1Task_Function */ }

打印结果是

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询