FreeRTOS学习-任务的创建与管理
转载自https://blog.csdn.net/weixin_43866583/article/details/125505717?spm=1001.2014.3001.5502
FreeRTOS学习-任务的创建与管理
FreeRTOS的任务
任务的状态
FreeRTOS中,任务在运行时,可能出现以下几种状态:
1)运行态。任务当前正在运行中,占有cpu的使用权。
2)就绪态。满足了运行条件,但是当前没有运行,可能是有高优先级任务在执行或者在中断,处于等待获得cpu使用权然后运行的状态中 。
3)阻塞态。在某些条件下被阻塞了,不能得到运行。比如等待某些信号量,消息队列或者调用了延迟函数。
4)挂起态。任务被通过调用挂起操作被终止执行了,直到被从挂起状态中恢复为止,否则将一直处于挂起的状态中。
任务的优先级
FreeRTOS的任务优先级是数值越大,任务的优先级越高。
FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的configMAX_PRIORITIES进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。
FreeRTOS 的任务切换的实现
PendSV中断
freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。
PendSV是一种不精确的异常处理,优先级和挂起状态可以通过编程实现,一般在实时操作系统中 PendSV 的优先级都会被设置为最低,在其他所有的异常中断处理完以后才执行,对上下文的切换非常有用。
Systick中断
Systick中断服务函数中会进行任务切换。
FreeRTOS的任务管理的API函数
FreeRTOS任务创建
在freeRTOS中,可以根据实际使用的需要创建一定数量的任务(线程),任务只有被成功创建了,才有可能被执行到。
在FreeRTOS实时操作系统中,创建任务可以使用如下的API:
1 |
|
创建一个任务的示例如下:
1 |
|
任务的优先级要根据 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES进行设置的,可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1,如果创建的任务所选的任务优先级超过了这个设置的范围,会被忽略掉,不会被执行。
FreeRTOS任务挂起
当任务在系统运行过程中,因为某些条件或者有其他的更加重要的事情要做的时候,可以考虑把某些任务先挂起,等候条件到达之后再恢复任务继续调度运行。
挂起任务的函数为:
1 |
|
要使用这个函数,需要在 FreeRTOSConfig.h中将宏定义 INCLUDE_vTaskSuspend 定义为 1
此外,如果要挂起、恢复整个系统所有的任务,freeRTOS也提供了一个API函数
1 |
|
FreeRTOS任务删除
如果有某些任务只是需要存在于某些条件,当条件满足之后就不再需要这个任务参与运行,这个时候可以选择删除掉这个任务,释放该任务所占用的堆栈空间。
删除任务可以使用函数:
1 |
|
要使用这个函数,需要将宏定义 INCLUDE_vTaskDelete 设置为 1 。