这个是全网最详细的STM32项目教学视频。
第一篇在这里:
视频在这里
V3:HAL库开发、手把手教学下面功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、openmv视觉控制、电磁循迹、FreeRTOS、K210视觉智能车(更新中)、K230视觉智能车(更新中)、MSPM0G3507视觉智能车(更新中)
22.4-任务优先级与中断优先级
前面我们创建任务的时候,需要设置任务的优先级,那么任务的优先级是什么意思? 和中断优先级有什么区别那?我们新建多个任务时候又应该如何确定任务的优先级那?
22.4.1-任务优先级相关
任务优先级概念(了解)
任务优先级决定了哪个任务先执行,哪个任务后执行。当系统中有多个任务需要运行时,FreeRTOS 会根据任务优先级来决定哪一个任务获得 CPU 时间片。
- 高优先级任务 会抢占低优先级任务。
- 每个任务可以设置一个优先级,优先级的值越大,任务的优先级越高。
任务优先级设置和最高优先级设置(了解)
任务优先级设置
任务优先级在每次新建任务可以在NewTask的Priority中设置优先级
如果自己写代码新建任务可以在 xTaskCreate
函数中的 uxPriority
参数设置的。
xTaskCreate(TaskFunction, "TaskName", STACK_SIZE, NULL, PRIORITY, NULL);
任务优先级的动态调整
FreeRTOS 提供了调整任务优先级的 API,如 vTaskPrioritySet()
,可以动态改变任务的优先级。例如,某些情况下,任务的优先级可能需要在运行时进行调整。
vTaskPrioritySet(taskHandle, newPriority);//taskHandle:任务句柄、newPriority:新的要设置的优先级
任务最高优先级设置
FreeRTOS 的优先级是一个 无符号整数,通常是从 0
(最低优先级)到 configMAX_PRIORITIES-1
(最高优先级)。
configMAX_PRIORITIES 在STM32Cubemx中设置或者代码中设置(建议STM32Cbuemx设置然后生成代码)
一般不用设置太大够用就可以,比如设置5-7等
任务优先级分配分配方案!(重点掌握)
对于初学者,有时候会纠结任务优先级设置为多少合适,因为任务优先级设置多少是没有标准的。对于这个问题,这里为大家推荐一个标准,任务优先级设置推荐方式如下图:
- IRQ 任务:IRQ 任务是指通过中断服务程序进行触发的任务,此类任务应该设置为所有任务里面优先级最高的。比如中断触发的数据处理解析、中断触发的报警和急停等任务。
- 高优先级后台任务:比如按键检测,触摸检测,USB 消息处理,串口消息处理等,都可以归为这一类任务。
- 低优先级的时间片调度任务:比如 emWin 的界面显示,LED 数码管的显示等不需要实时执行的都可以归为这一类任务。实际应用中用户不必拘泥于将这些任务都设置为优先级 1 的同优先级任务,可以设置多个优先级,只需注意这类任务不需要高实时性。
- 空闲任务:空闲任务是系统任务。
- 特别注意:IRQ 任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数即可),只有这样,高优先级任务才会释放 CPU 的使用权,,从而低优先级任务才有机会得到执行。
这里可以增加后面所做任务优先级的计划,和为什么那么做?
这个是已经新增任务的优先级,默认任务和led任务设置正常优先级,OLED刷新任务设置低于正常优先级,这就是因为:OLED的刷新并不需要实时执行,所以设置低一些。
后面章节我们会新增一些任务这里写出对他们优先级的设置规划
最高优先级是电机停止任务,因为这个任务我们是等待按键中断的二值信号量的属于IRQ 任务(通过中断服务程序进行触发的任务)
其次是123456就是用来完成裸机时候的1和2和3和4和5和6模式的任务。
再然后是LED闪烁任务
最后是OLED刷新任务,OLED刷新和LED灯闪烁都是属于提示显示任务设置比较低的优先级就可以