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 */ }打印结果是