FreeRTOS api库函数之Task Creation 和 Task Control(任务创建和任务控制)

 

TaskHandle_t

引用任务的类型。 例如,对xTaskCreate的调用(通过指针参数)返回一个TaskHandle_t变量,该变量随后可以用作vTaskDelete的参数来删除任务。

xTaskCreate:
 BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, const char * const pcName,unsigned short usStackDepth,            void * pvParameters,   UBaseType_t uxPriority,  TaskHandle_t * pxCreatedTask );
创建一个新任务并将其添加到准备运行的任务列表中。在FreeRTOSConfig.h中,configSUPPORT_DYNAMIC_ALLOCATION必须设置为1,或者保留未定义(在这种情况下默认为1),以使此RTOS API函数可用。
每个任务都需要用于保存任务状态的RAM,并由任务用作其堆栈。如果使用xTaskCreate()创建任务,则会从FreeRTOS堆自动分配所需的RAM。如果使用xTaskCreateStatic()创建任务,则RAM由应用程序编写者提供,因此可以在编译时静态分配。
如果使用的是FreeRTOS-MPU,则建议使用xTaskCreateRestricted()代替xTaskCreate()。

参数:
    pvTaskCode 指向任务输入函数的指针(只是实现任务的函数的名称)。 任务通常实现为无限循环,并且绝不能尝试返回或退出其实现功能。但是,任务可以自行删除。
    pcName 任务的描述性名称。这主要用于方便调试,但也可用于获取任务句柄。
    使用FreeRTOSConfig.h中的configMAX_TASK_NAME_LEN参数设置任务名称的最大长度。
    usStackDepth 要分配用作任务堆栈的单词数(不是字节!)。例如,如果堆栈为16位宽且usStackDepth为100,则将分配200个字节用作任务的堆栈。再举一个例子,如果堆栈是32位宽,而usStackDepth是400,那么将分配1600个字节用作任务的堆栈。
    堆栈深度乘以堆栈宽度不得超过size_t类型的变量中可包含的最大值。
    pvParameters 将作为任务参数传递到创建任务的值。
    如果将pvParameters设置为变量的地址,则在创建的任务执行时该变量必须仍然存在 - 因此传递堆栈变量的地址无效。
    uxPriority创建的任务将执行的优先级。
    包含MPU支持的系统可以选择通过在uxPrriority中设置位portPRIVILEGE_BIT以特权(系统)模式创建任务。例如,要以优先级2创建特权任务,请将uxPriority设置为(2 | portPRIVILEGE_BIT)。
    pxCreatedTask用于将句柄传递给xTaskCreate()函数中创建的任务。 pxCreatedTask是可选的,可以设置为NULL。
返回值:
    如果任务已成功创建,则返回pdPASS。否则返回错误的COULD_NOT_ALLOCATE_REQUIRED_MEMORY。

xTaskCreateStatic
 TaskHandle_t xTaskCreateStatic(TaskFunction_t pxTaskCode,
                                 const char * const pcName,
                                 const uint32_t ulStackDepth,
                                 void * const pvParameters,
                                 UBaseType_t uxPriority,
                                 StackType_t * const puxStackBuffer,
                                 StaticTask_t * const pxTaskBuffer);

创建一个新任务并将其添加到准备运行的任务列表中。 FreeRTOSConfig.h中的configSUPPORT_STATIC_ALLOCATION必须设置为1才能使此RTOS API函数可用。

每个任务都需要用于保存任务状态的RAM,并由任务用作其堆栈。如果使用xTaskCreate()创建任务,则会从FreeRTOS堆自动分配所需的RAM。如果使用xTaskCreateStatic()创建任务,那么RAM由应用程序编写者提供,这会产生更多参数,但允许在编译时静态分配RAM。

如果使用的是FreeRTOS-MPU,则建议使用xTaskCreateRestricted()代替xTaskCreateStatic()。

参数:
    pvTaskCode 指向任务输入函数的指针(只是实现任务的函数的名称)。任务通常实现为无限循环,并且绝不能尝试返回或退出其实现功能。但是,任务可以自行删除。
    pcName 任务的描述性名称。这主要用于方便调试,但也可用于获取任务句柄。

    使用FreeRTOSConfig.h中的configMAX_TASK_NAME_LEN参数设置任务名称的最大长度。
    ulStackDepth puxStackBuffer 参数用于将StackType_t变量数组传递给xTaskCreateStatic()。 ulStackDepth必须设置为数组中的索引数。

    pvParameters 将作为任务参数传递到创建任务的值。

    如果将pvParameters设置为变量的地址,则在创建的任务执行时该变量必须仍然存在 - 因此传递堆栈变量的地址无效。
    uxPriority 创建的任务将执行的优先级。

    包含MPU支持的系统可以选择通过在uxPrriority中设置位portPRIVILEGE_BIT以特权(系统)模式创建任务。例如,要以优先级2创建特权任务,请将uxPriority设置为(2 | portPRIVILEGE_BIT)。
    puxStackBuffe 必须指向至少具有ulStackDepth索引的StackType_t数组(请参阅上面的ulStackDepth参数) - 该数组将用作任务的堆栈,因此必须是持久的(未在函数堆栈中声明)。
    pxTaskBuffer 必须指向StaticTask_t类型的变量。该变量将用于保存新任务的数据结构(TCB),因此它必须是持久的(不在函数的堆栈上声明)。

返回:
    如果puxStackBuffer或pxTaskBuffer都不为NULL,则将创建任务,并返回任务的句柄。如果puxStackBuffer或pxTaskBuffer为NULL,则不会创建任务并返回NULL。

vTaskDelete
void vTaskDelete(TaskHandle_t xTask);

必须将INCLUDE_vTaskDelete定义为1才能使此功能可用。
从RTOS内核管理中删除任务。 正在删除的任务将从所有就绪,阻止,暂停和事件列表中删除。
注意:idle任务负责从已删除的任务中释放RTOS内核分配的内存。 因此,如果应用程序对vTaskDelete()进行任何调用,则空闲任务不会缺少微控制器处理时间。 任务代码分配的内存不会自动释放,应在删除任务之前释放。
参数:
     xTask 要删除的任务的句柄。 传递NULL将导致当前调用任务被删除。

vTaskDelay
void vTaskDelay(const TickType_t xTicksToDelay);

必须将INCLUDE_vTaskDelay定义为1才能使此功能可用。 。
延迟给定数量的滴答的任务。任务保持阻塞的实际时间取决于滴答速率。常量portTICK_PERIOD_MS可用于根据滴答速率计算实时 - 具有一个滴答周期的分辨率。
vTaskDelay()指定任务希望相对于调用vTaskDelay()的时间取消阻止的时间。例如,指定100个刻度的块周期将导致任务在调用vTaskDelay()后取消阻止100个刻度。因此,vTaskDelay()不提供控制周期性任务频率的好方法,因为通过代码的路径以及其他任务和中断活动将影响调用vTaskDelay()的频率,从而影响时间下一个任务执行的位置。请参阅vTaskDelayUntil()以获取旨在促进固定频率执行的替代API函数。它通过指定调用任务应解除阻塞的绝对时间(而不是相对时间)来完成此操作。
参数:
    xTicksToDelay 调用任务应阻止的时间段(以滴答周期为单位)。

vTaskDelayUntil
void vTaskDelayUntil(TickType_t * pxPreviousWakeTime, const TickType_t xTimeIncrement);

将任务延迟到指定时间。周期性任务可以使用此功能来确保恒定的执行频率。INCLUDE_vTaskDelayUntil必须定义为1才能使此功能可用。
此函数在一个重要方面与vTaskDelay()不同:vTaskDelay()指定任务希望相对于调用vTaskDelay()的时间取消阻止的时间,而vTaskDelayUntil()指定任务希望的绝对时间打开。
vTaskDelay()将导致任务在调用vTaskDelay()时阻塞指定的滴答数。因此,很难使用vTaskDelay()来生成固定的执行频率,因为调用vTaskDelay()之后的任务解除阻塞和下一次调用vTaskDelay()的任务之间的时间可能不会被修复[任务可能会有所不同通过调用之间的代码路径,或者每次执行时可能会被中断或抢占不同的次数]。
而vTaskDelay()指定相对于调用函数的时间的唤醒时间,而vTaskDelayUntil()指定它希望解除阻塞的绝对(准确)时间。
应该注意的是,如果vTaskDelayUntil()用于指定已经过去的唤醒时间,则它将立即返回(不阻塞)。因此,使用vTaskDelayUntil()定期执行的任务将不得不重新计算其所需的唤醒时间,如果由于任何原因暂停执行定期执行(例如,任务暂时置于Suspended状态)导致任务错过一个或更多的定期执行。这可以通过检查通过引用传递的变量作为针对当前滴答计数的pxPreviousWakeTime参数来检测。然而,在大多数使用场景下,这不是必需的。
常量portTICK_PERIOD_MS可用于根据滴答速率计算实时 - 具有一个滴答周期的分辨率。
通过调用vTaskSuspendAll()暂停RTOS调度程序时,不得调用此函数。
参数:
    pxPreviousWakeTime 指向一个变量的指针,该变量保存上次解除阻塞任务的时间。必须在首次使用之前使用当前时间初始化变量(请参见下面的示例)。在此之后,变量在vTaskDelayUntil()中自动更新。
    xTimeIncrement 循环时间段。该任务将在时间解锁(* pxPreviousWakeTime + xTimeIncrement)。使用相同的    xTimeIncrement参数值调用vTaskDelayUntil将导致任务以固定的间隔周期执行。

uxTaskPriorityGet
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask);

获取任何任务的优先级。
INCLUDE_uxTaskPriorityGet必须定义为1才能使此功能可用。
参数:
     xTask要查询的任务的句柄。 传递NULL句柄会导致返回调用任务的优先级。
返回值:
     xTask的优先级。

vTaskPrioritySet
void vTaskPrioritySet(TaskHandle_t xTask,UBaseType_t uxNewPriority);

设置任何任务的优先级。
必须将INCLUDE_vTaskPrioritySet定义为1才能使此功能可用。
如果设置的优先级高于当前正在执行的任务,则在函数返回之前将发生上下文切换。
参数:
     xTask 处理正在设置优先级的任务。 传递NULL句柄会导致设置调用任务的优先级。
     uxNewPriority  将设置任务的优先级。

vTaskSuspend
void vTaskSuspend(TaskHandle_t xTaskToSuspend);

暂停任何任务。 暂停任务时,永远不会获得任何微控制器处理时间,无论其优先级如何。
必须将INCLUDE_vTaskSuspend定义为1才能使此功能可用。
对vTaskSuspend的调用不是累积的 - 即在同一任务上调用vTaskSuspend()两次仍然只需要调用vTaskResume()来准备挂起的任务。
参数:
     xTaskToSuspend 处理被挂起的任务。 传递NULL句柄将导致调用任务被挂起。

vTaskResume
void vTaskResume(TaskHandle_t xTaskToResume);

恢复暂停的任务。
必须将INCLUDE_vTaskSuspend定义为1才能使此功能可用。 有关更多信息,请参阅RTOS配置文档。
通过对vTaskSuspend()的一次或多次调用暂停的任务将通过单次调用vTaskResume()再次运行。
参数:
     xTaskToResume处理正在准备的任务。

xTaskResumeFromISR
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume);

用于恢复可以在ISR中调用的挂起任务的函数。
INCLUDE_vTaskSuspend和INCLUDE_xTaskResumeFromISR必须定义为1才能使此功能可用。
通过对xTaskResumeFromISR()的单次调用,可以再次运行已被一个或多个对vTaskSuspend()的调用暂停的任务。
xTaskResumeFromISR()通常被认为是一个危险的函数,因为它的动作没有被锁存。因此,如果中断有可能在任务被挂起之前到达,那么它绝对不应该用于将任务与中断同步,因此中断会丢失。使用信号量,或者更好的直接到任务通知,将避免这种可能性。提供了使用直接到任务通知的工作示例。
参数:
    xTaskToResume 处理正在准备的任务。
返回值:
    pdTRUE。如果恢复任务应导致上下文切换,否则为pdFALSE。 ISR使用它来确定ISR之后是否需要上下文切换。

xTaskAbortDelay
BaseType_t xTaskAbortDelay(TaskHandle_t xTask);

强制任务退出阻止状态,并进入就绪状态,即使任务处于阻塞状态等待的事件尚未发生,并且任何指定的超时未到期。
必须将INCLUDE_xTaskAbortDelay定义为1才能使此功能可用。
参数:
     xTask 将被强制退出阻止状态的任务句柄。
     要获取任务的句柄,请使用xTaskCreate()创建任务并使用pxCreatedTask参数,或使用xTaskCreateStatic()创建任务并存储返回的值,或者在调用xTaskGetHandle()时使用任务的名称。
返回:
     如果xTask引用的任务未处于阻塞状态,则返回pdFAIL。 否则返回pdPASS。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值