逻辑代码写在开始任务函数内部
非常重要,看完这篇内容,可以理解任务执行的流程
在开始任务内部创建应用任务。
可以看到在开始任务函数内部,有一个临界区,在临界区内执行的函数,调度器不会打断临界区内执行的函数,临界区内的执行顺序为顺序执行
分析一下程序的运行过程:
首先进入main函数,进行硬件的初始化,然后创建开始任务,开始任务创建完成后,就会添加到就绪列表中。(此时就绪列表中有开始任务(优先级1)、空闲任务(优先级0)、软件定时器任务(优先级31)(软件定时任务需要使用才会打开))
然后开启任务调度器,按照优先级高的执行,所以执行开始任务。因为开始任务函数中创建了临界区,所以执行的时候,不会打断。随后将各个应用任务添加到就绪列表中,直到退出临界区后。就会由调度器来执行任务。(此时就序列表中有应用任务(任务的优先级)、空闲任务(优先级0)、软件定时器任务(优先级31)(软件定时任务需要使用才会打开)) 此时调度器会根据优先级来执行任务。
在执行任务的时候,任务当中可能会有阻塞,此时调度器会接着从接续列表中寻找优先级最高的任务继续执行
假设开始函数中没有临界区
程序执行的情况有三种
- 应用任务优先级>开始任务优先级
当开启任务调度器,由于开始任务优先级比空闲任务优先级高,所以会执行开始任务,然后再开始任务内,创建任务一,任务一的优先级比开始任务优先级高,所以会执行任务一函数,当任务一函数内有阻塞的时候,会暂停任务一,转去执行开始任务,继续往下执行(不太明白是接着执行,还是重新执行,猜测应该是接着执行,相当于是有阻塞,然后跳转到其他任务内了),比如创建任务二,任务二的优先级比开始任务的哟优先级高,此时就会区执行任务二。
- 应用任务优先级=开始任务优先级
FreeRTOS支持时间片轮转调度的,当优先级相同的时候,会根据时间片的大小,来逐个执行。首先创建开始任务,然后开启任务调度器,开始任务优先级大于空闲任务优先级,执行开始任务函数,开始任务函数内部创建应用任务一,应用任务一的优先级与开始任务优先级相同,然后去执行应用任务一,执行一个时间片,然后跳到开始任务,开始任务也执行一个时间片,然后再跳到应用程序一执行一个时间片,以此来循环执行。
- 应用任务优先级<开始任务优先级
首先创建开始任务,然后开启任务调度器,执行开始任务函数,由于开始任务函数内创建的应用任务的优先级低于开始任务,因此会将开始任务执行完,然后最后一行是删除开始任务,然后再去根据优先级执行应用任务