FreeRTOS任务管理各过程算法总结

1开启任务调度器:在此函数包括创建空闲任务(优先级最低),创建定时器服务任务(软件定时器,该步骤是条件编译可以用宏关闭)。然后会先关闭中断,在SVC中断服务函数中再重新打开。配置时间统计功能的定时器(条件编译,一般调试时才会用)。还包括其他硬件的初始化如滴答定时器、FPU单元、PendSV中断等等(这些有相关函数去调用实现或是寄存器直接配置)。

2空闲任务的意义:保证系统任何时刻都有一个任务进行,其次是处理一些琐事如有任务删除时在这空闲任务里执行其内存释放又如运行用户设置的空闲任务钩子函数又或者是在低功耗模式下执行其他处理。(空闲任务不需要手动创建)

3任务创建:首先申请任务堆栈内存再申请任务控制块内存,然后进行任务控制块的堆栈那部分内容初始化(注意不是所有信息都初始化),若控制块内存不足则创建失败并且释放之前申请的所有内存,否则标记该任务是动态创建的然后继续初始化任务的大部分信息并添加到就绪列表(静态和动态的删除任务等处理不一样因此要标记区分)。、

4任务初始化:任务创建过程剩下任务堆栈和任务控制块所有未初始化信息在此初始化,此外(注意,标记任务堆栈栈顶,任务数组名必须以’\0’结尾,该任务列表项的value值是关系任务的优先级,因为列表插入列表项顺序是升序的,即数字越大越后面,执行优先级越低)。

5任务就绪表:不同状态都由对应的一个列表,就绪态的任务就被添加到任务就绪表。其次,任务就绪表是个数组列表,因为FreeRTOS允许任务相同优先级,因此每一个优先级需要一个相同的就绪列表。其中,有全局变量统计任务个数,创建列表时看是不是第一个任务,是则需要初始化列表。新建任务优先级比当前任务优先级高是,任务控制块要指向当前新建任务的任务控制块,且需要任务切换了

6删除任务:同样的也是调用相关函数,入口参数为任务句柄,函数开头需调用函数获取任务控制块。但分两种情况,一种是删除正在运行的任务,要先把这个任务添加到一个预备列表中,等待任务运行完再从其在的所有列表中删除任务并在空闲任务中释放内存,其他情况是直接在就绪列表以及其他相关列表中查找到该任务删除,内存释放也可以期间直接调用函数。任务数减一并重新计算到下一个任务需要时间。(这个过程可以调用运行任务删除钩子函数)之后强制任务切换。

7挂起任务:即任务暂停,操作过程与任务删除极其相似。它有两个函数可以使任务挂起,一个用于任务中一个用于中断中。也需要先进行删除任务操作,但不释放内存,而把任务添加到另一个状态列表——挂起列表。同样强制任务切换并重新计算到下一个任务需要时间。

8钩子函数:即在某个过程如任务挂起、创建、删除等一些操作期间需要响应的一些操作时用到的函数。每一个过程对应一个钩子函数(部分需用宏开启)。另外需用户自行定义,用户未定义内容时钩子函数都是空函数。

9任务恢复:先获取任务控制块(不存在恢复正在运行任务,所以任务控制块不能NULL即不用调用函数获取),在临界区完成把任务从挂起列表删除、添加到就绪列表、若优先级大于正在运行任务的优先级则进行任务切换

你可能感兴趣的:(FreeRTOS,基础学习,单片机学习)