第六章 FreeRTOS任务相关API函数

warren
2025-03-17 / 0 评论 / 9 阅读 / 正在检测是否收录...

6.1 任务创建和删除API函数

FreeRTOS 最基本的功能就是任务管理。任务管理最基本的操作就是创建和删除。有关API函数如下:
m8d41iu3.png

6.1.1函数xTaxkCreate()

函数原型如下:

BaseType_t xTaskCreate(    TaskFunction_t pxTaskCode,
                        const char * const pcName,
                        const uint16_t usStackDepth,
                        void * const pvParameters,
                        UBaseType_t uxPriority,
                        TaskHandle_t * const pxCreatedTask )

pxTaskCode: 任务函数(函数指针)
pcName: 任务名称(字符串)
usStackDepth: 任务堆栈大小(单位:字 4Byte)
pvParameters: 传递给任务函数的参数(一般为NULL)
uxPriority: 任务优先级(0 - MAX-1)
pxCreatedTask: 任务句柄

返回值 pdPASS 表示 任务创建成功

  errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 表示 因堆栈内存不足导致任务创建失败

在xTaskCreate中有5个步骤来完成任务创建流程
1 申请堆栈内存
2 申请任务控制块内存
3 初始化任务控制块中的堆栈部分(将申请到的堆栈地址赋值给任务控制块中的pxStack)
4 调用prvInitialiseNewTask初始化任务控制块中的成员
4.1 初始化任务堆栈内存在0x5A
4.2 初始化任务控制块中栈顶的位置
4.3 初始化任务控制块中的任务名称
4.4 初始化任务控制块中的任务优先级
4.5 初始化任务控制块中的 状态列表项 和 时间列表项 并设置列表项中的 所属 任务控制块
4.6 设置列表项的值(列表为从小到大插入。所以用优先级MAX-优先级来实现优先级越高越靠前)
4.7 调用pxPortInitialiseStack初始化任务堆栈
4.8 任务句柄 = 任务控制块
5 调用prvAddNewTaskToReadyList添加新创建的任务到就绪列表中

6.4 任务挂起与恢复API函数

有时候我们需要暂停某一个任务的运行,过一段时间以后再重新运行它。如果使用删除和创建功能,则会造成任务中变量保存的值丢失。挂起任务类似与暂停,是可以恢复的,但删除就不一样的;类似‘人死两清’。
有以下三个函数用来实现任务的挂起和恢复的:
m8fzvj5q.png
【注】以FromISR结尾的API函数都是供用户在中断中调用的。

  1. 函数vTaskSuspend()
    此函数用来将某个任务设置为挂起状态,进入挂起态的任务永远都不会进入到就绪列表中。除非调用任务恢复函数来解挂。
    此函数要想使用,需要在配置为文件中将宏INCLUDE_vTaskSuspend配置为1
    函数的原型如下:

    void vTaskSuspend(TaskHandle_t xTaskToSuspend);

    需要传入的参数为:需要挂起的任务的任务句柄;任务句柄可以通过API xTaskGetHandle()来获取。无论该任务的优先级多高,只要被挂起,该任务就不会被执行,直到解挂。
    如果参数为NULL,则代表要挂起的任务为自己。
    任务挂起不支持嵌套,就是说同一个任务挂起一次和挂起N次的效果是一样的。

  2. 函数 vTaskResume()
    将一个任务从挂起状态恢复到就绪状态中。只有通过函数xTaskSuspend()设置为挂起态的任务才可以使用vTaskResume()恢复。
    注意任务无论被 vTaskSuspend() 挂起多少次,只需在任务中调用 vTakResume() 恢复一次,就可以继续运行。且被恢复的任务会进入就绪态!
    此函数要想使用,需要在配置为文件中将宏INCLUDE_vTaskSuspend配置为1;
    函数的原型如下:

    void vTaskResume(TaskHandle_t xTaskToResume);

    需要传入的参数为:需要挂起的任务的任务句柄。

  3. 函数xTaskResumeFromISR()
    xTaskResume()函数功能一样。不过这个函数实在中断中调用的版本,用于在中断服务函数中恢复一个任务。
    函数的原型如下:

    BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume);

    需要注意的是,这个函数具有返回值

    • pdTRUE:恢复运行的任务的任务优先级等于或者高于正在运行的任务(被中断打断的任务), 这意味着在退出中断服务函数以后必须进行一次上下文切换。
    • pdFALSE:恢复运行的任务的任务优先级低于当前正在运行的任务(被中断打断的任务),这意味着在退出中断服务函数的以后不需要进行上下文切换。

    使用该函数注意宏:INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为 1

注意:中断服务程序中要调用freeRTOS的API函数则中断优先级不能高于FreeRTOS所管理的最高优先级

0

评论 (0)

取消