首先FreeRTOS可以通过抢占式/时间片方式进行任务调度,这可以通过配置FreeRTOSConfig.h文件中的对应的宏值configUSE_PREEMPTION/configUSE_TIME_SLICING来完成。我使用了抢占式调度的方式,在FreeRTOS中的任务基本满足如下方式:
当我们创建一个任务后,这个任务就处于就绪态,处于就绪态的所有任务,挂在同一条任务链表上,当任务开始调度,进行任务切换时,就绪态的任务中具有最高优先级的任务就进入运行态。而运行态的任务在任务执行过程中,可能需要等待某个内容,若一直等待将会占用处理器资源,此时可以令其进入阻塞态,阻塞态可以通过使用等待队列阻塞/延时阻塞/等待互斥信号阻塞等方式进入,而进入阻塞态的任务一旦等待的事件触发,则进入就绪态,等待下次任务调度继续执行。当我们不需要一个任务,而且又不希望删除任务的时候,可以利用创建任务时生成的任务句柄,让任务进入挂起态,且当我们需要任务回归时,只需要重新注册一下这个任务句柄就好。所有提到的阻塞态、就绪态、挂起态均有一个链表,大家有兴趣可以看一下内核代码实现。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在FreeRTOS中,当开始任务调度后,内核通过滴答时钟中断实现任务调度,而滴答时钟可以通过配置FreeRTOSConfig.h文件中的宏configTICK_RATE_HZ来实现,当滴答中断发生时,内核会查询就绪任务表,并使就绪任务表中具有最高优