FreeRTOS 常用函数——任务相关

  1. 创建任务函数

portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode , 
			   const signed portCHAR * const pcName , 
			   unsigned portSHORT usStackDepth , 
			   void *pvParameters,
			   unsigned portBASE_TYPE uxPriority ,
			   xTaskHandle *pxCreatedTask );
参数名 描述
pvTaskCode 一个指向任务的实现函数的指针(效果上仅仅是函数名)。
pcName 具有描述性的任务名,这个参数不会被 FreeRTOS 使用,其作用只是单纯地用于辅助调试。
usStackDepth 内核为任务分配的栈空间大小,以位宽为单位。比如说,在32位宽的栈空间,传入参数为100,则将会分配400字节的栈空间(100*4 Bytes)。
pvParameters 一个指向 void 的指针(void*),用来将参数传递到任务中。
uxPriority 指定任务执行的优先级,取值范围可以从最低优先级0到最高优先级(configMAX_PRIORITIES–1)。
pxCreatedTask 传出任务的句柄,用于改变任务优先级、删除任务。如果应用程序中不会用到这个任务的句柄,则可以被设为 NULL。
返回值 有两个可能的返回值:1. pdTRUE,表明任务创建成功。2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY,由于内存堆空间不足, FreeRTOS 无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。
  1. 延时函数

void vTaskDelay( portTickType xTicksToDelay );
参数名 描述
xTicksToDelay 延迟多少个心跳周期。可以用常数 portTICK_RATE_MS 来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。
  1. 精确延时函数

从任务离开阻塞态进入就绪态那一刻的精确心跳计数值开始进行延时,使得任务以固定频率周期性执行。比调用 vTaskDelay()可以实现更精确的周期性。

void vTaskDelayUntil( portTickType * pxPreviousWakeTime , portTickType xTimeIncrement );
参数名 描述
pxPreviousWakeTime 保存了任务上一次离开阻塞态(被唤醒)的时刻,用来计算该任务下一次离开阻塞态的时刻。
xTimeIncrement 用于实现任务以固定频率周期性执行,可以用常数 portTICK_RATE_MS 来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。
  1. 空闲任务钩子函数

空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。

通常空闲任务钩子函数被用于:

  1. 执行低优先级、后台或需要不停处理的功能代码。
  2. 测试处系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时间)。
  3. 将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能需要处理的时候,系统自动进入省电模式。

空闲任务钩子函数必须遵从以下规则:

  1. 绝不能阻塞或挂起。空闲任务只会在其它任务都不运行时才会被执行(除非有应用任务共享空闲任务优先级)。以任何方式阻塞空闲任务都可能导致没有任务能够进入运行态!
  2. 如果应用程序用到了 vTaskDelete(),则空闲钩子函数必须能够尽快返回。因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直运行在钩子函数中,则无法进行回收工作。
void vApplicationIdleHook( void );
  1. 改变任务优先级函数

用于在调度器启动后改变任何任务的优先级。

void vTaskPrioritySet( xTaskHandle pxTask , unsigned portBASE_TYPE uxNewPriority );
参数名 描述
pxTask 被修改优先级的任务句柄(即目标任务),可以通过传入 NULL 值来修改自己的优先级。
uxNewPriority 目标任务将被设置到哪个优先级上。
  1. 查询任务优先级函数

用于查询一个任务的优先级。

unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
参数名 描述
pxTask 被查询任务的句柄(目标任务) ,可以通过传入 NULL 值来查询自己的优先级。
返回值 被查询任务的当前优先级。
  1. 删除任务函数

用于删除自己或其它任务。
任务被删除后就不复存在,也不会再进入运行态。
空闲任务的责任是要将分配给已删除任务的内存释放掉。因此有一点很重要,那就是使用 vTaskDelete() API 函数的任务千万不能把空闲任务的执行时间饿死。

void vTaskDelete( xTaskHandle pxTaskToDelete );
参数名 描述
pxTaskToDelete 被删除任务的句柄(目标任务),可以通过传入 NULL 值来删除自己。

你可能感兴趣的:(学习笔记)