这个是全网最详细的STM32项目教学视频。
第一篇在这里:
视频在这里
V3:HAL库开发、手把手教学下面功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、openmv视觉控制、电磁循迹、FreeRTOS、K210视觉智能车(更新中)、K230视觉智能车(更新中)、MSPM0G3507视觉智能车(更新中)
讲解任务的常见几种 状态和如何切换的
单核CPU的多任务运行机制可以得到,任何时刻,只能有一个任务占用CPU并运行,这个任务的状态称为运行(running)状态,其他未占用CPU的任务状态称之为非运行(notruning)状态。非运行态又可以细分为三个状态,任务的各个状态及其状态之间的转化关系如何:
freeRTOS任务调度有抢占式和合作式两种方式,一般使用基于任务优先级的抢占式任务调度方法。任务调度的各种方法在后面有详细介绍,这里我们以抢占任务调度方法讲解。
- 就绪状态
任务被创建后就处于就绪状态,freeRTOS的任务调度器在基础时钟每次中断是进行一次任务调度申请,根据抢占式任务调度的特点,任务调度的结果。
如果当前没有其他处于运行状态的任务,处于就绪状态的任务进入运行状态。
如果就绪任务的优先级高于或者等于当前任务的优先级,处于就绪状态的任务进入运行状态。
如果就绪任务的优先级低于当前任务的优先级,就绪状态的任务无法获得CPU使用权,继续处于就绪状态。
- 运行状态
在单核处理器上,占有CPU并运行的任务就处于运行状态。处于运行状态的高优先级任务如果一直运行,将一直占用CPU,在任务调度时,低优先级的就绪任务就无法获得CPU的使用权,无法实现多任务的运行。因此,处于运行状态的任务,应该在空闲的时候让出CPU的使用权。
处于运行状态的任务,有两种主动让出CPU 使用权的方法,一种是执行函数 vTaskSuspend进入挂起状态,另一种是执行阻塞式函数进入阻塞状态。这两种状态都是非运行状态,运行的任务就交出了CPU的使用权,任务调度器可以使其他就绪状态的任务进入运行状态。
- 阻塞状态
阻塞(blocked)状态就是任务暂时让出CPU的使用权,处于等待的状态。运行状态的任务可以调用两类函数进入阻塞状态。
一类是时间延迟函数,如vTaskDelay())或vTaskDelayUntil()。处于运行状态的任务调用这类函数后,就进入阻塞状态,并延迟指定的时间。延迟时间到了后,又进入就绪状态,参与任务调度后,又可以进入运行状态。
另一类是用于进程间通信的事件请求函数,例如,请求信号量的函数 xSemaphoreTake().处于运行状态的任务执行函数xSemaphoreTake()后,就进入阻塞状态,如果其他任务释放了信号量,或等待的超时时间到了,任务就从阻塞状态进入就绪状态状态
在运行状态的任务中调用函数vTaskSuspend(),可以将一个处于阻塞状态的任务转入挂起。
- 挂起状态
挂起(suspended)状态的任务就是暂停的任务,不参与调度器的调度。其他 3 种状态的任务都可以通过函数vTaskSuspend()进入挂起状态。处于挂起状态的任务不能自动退出挂起状态,需要在其他任务里调用函数vTaskResume(),才能使一个挂起的任务变为就绪状态。