1、任务创建
1.1、任务创建函数
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
功能:创建新的任务并将任务加入就绪列表
参数描述:
pxTaskCode——指针,指向任务函数。任务永远不会返回(位于死循环内)。该参数类型TaskFunction_t定义在文件 projdefs.h中,定义为:typedef void(* TaskFunction_t)(void *)。
pcName——任务描述性名称。主要用于调试。字符串的最大长度由宏configMAX_TASK_ NAME_LEN指定,该宏位于FreeRTOSConfig.h文件中。
usStackDepth——指定任务堆栈深度,能够支持的堆栈变量字数,而不是字节数。例如,在16位宽度的堆栈下,usStackDepth定义为100,则实际使用200字节堆栈存储空间。堆栈的宽度乘以深度必须不超过 size_t类型所能表示的最大值。例如,size_t为16位,则可以表示的最大值是65535。
pvParameters——指针,任务创建时,作为一个参数传递给任务。
uxPriority——任务的优先级。具有MPU支持的系统,可以通过设置位优先级参数的portPRIVILEGE_BIT位,随意地在特权(系统)模式下创建任务。例如,创建一个优先级为2的特权任务,参数uxPriority可以设置为(2portPRIVILEGE BIT)。
pvCreatedTask——用于回传一个句柄,创建任务后可以使用这个句柄引用任务。
返回值:如果任务成功创建并加人就绪列表函数则返回PASS,否则函数返回错误码,具体参见 projdefs.h。
1.2、启动调度器函数
函数原型:
void vTaskStartScheduler( void );
功能:启动 RTOS 调度器,之后 RTOS内核控制哪个任务执行以及何时执行。
当调用 vTaskStartScheduler()后,空闲任务被自动创建。如果configUSE TIMERS被设置为1,那么定时器后台任务也会被创建。
1.3、开发示例
#include "stm32f4xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
#include "RCC.h"
#include "LED.h"
TaskHandle_t LED_Handle;//创建任务句柄
void LED_Task(void);//函数声明
int main()
{
HAL_Init();
HSE_CLK_Init();
LED_Init(); //初始化LED
xTaskCreate(LED_Task, //任务指针
"LED_Task", //任务描述
200, //堆栈深度
NULL, //给任务传递的参数
1, //任务优先级
&LED_Handle //任务句柄
);
vTaskStartScheduler(); //启动任务调度器
while(1)
{
}
}
void LED_Task(void)
{
LED_ON;
}
运行结果:LED灯点亮
2、任务删除
2.1、任务删除函数
void vTaskDelete( TaskHandle_t xTaskToDelete )
功能:从 RTOS内核管理中删除任务。为了使任务删除函数可用,必须将FreeRTOSConfig.h中include_vTaskDelete定义为1。要删除的任务将从所有就绪、阻塞、挂起和事件列表中删除。一般在初始化任务中使用任务删除,节约内存。被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),则必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。
参数描述:xTask——被删除任务的句柄,为NULL表示删除当前任务。
3、任务挂起
3.1、任务挂起函数
void vTaskSuspend( TaskHandle_t xTaskToSuspend )
功能:挂起指定任务。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 必须设置成1,任务挂起函数才有效。被挂起的任务不会得到处理器时间,不管该任务具有什么优先级。调用 vTaskSuspend函数是不会累计的,即使多次调用vTaskSuspend()函数将一个任务挂起,也只需调用一次 vTaskResume()函数就能使挂起的任务解除挂起状态。挂起当前任务时,FreeRTOS会切换到任务就绪列表中下一个要执行的优先级最高的任务。
参数描述:xTaskToSuspend——要挂起的任务句柄,为NULL表示挂起当前任务。
3.2、任务恢复挂起函数
void vTaskResume( TaskHandle_t xTaskToResume )
功能:恢复挂起的任务。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须置1,任务恢复挂起函数才有效。无论调用一次或多次vTaskSuspend()挂起的任务,都可以调用一次 vTaskResume()函数来再次恢复运行。此函数用于任务代码中,不可以用于中断服务函数中。
参数描述:xTaskToResume——要恢复运行的任务句柄,
3.3、任务从中断中恢复挂起函数
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
功能:在中断里恢复一个挂起的任务。在文件FreeRTOSConfig.h中,宏INCLUDEvlaskSuspend 和 INCLUDE_xIaskResumeFromISR 必须设置成1,从中断中恢复挂起函数才有效通过调用一次或多次 vTaskSuspend()函数挂起的任务,只需调用一次 xTaskResumeFromISR()函数即可恢复运行。xIaskResumeFromISR()不可用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,则会导致一次中断丢失(任务还没有挂起,调用xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。在这种情况下,可以使用信号量作为同步机制。
参数描述:xTaskToResume——要恢复运行的任务句柄
返回值:如果恢复任务应用导致上下文切换,返回pdFALSE。
3.4、调度暂停函数
void vTaskSuspendAll( void )
功能:暂停任务调度器。开启调度暂停后,只是禁止了任务调度并没有关闭任何中断开启调度暂停后,滴答定时器也将被挂起。在vTaskSuspendAll与xTaskResumeAll函数之间不可以使用引起任务切换的 API,例如 vTaskDelayUntil()、xQueueSend()等。注意:此函数并不是挂起所有任务,而是暂停任务调度。暂停任务调度器要和恢复任务调度器成对使用
3.5、恢复调度函数
BaseType_t xTaskResumeAll(void)
功能:恢复任务调度器。恢复调度运行后,只是恢复了任务调度并没有恢复挂起的任务,
返回值:如果需要任务切换,此函数返回pdTRUE,否则返回pdFALSE
4、任务切换
4.1、任务切换函数
void taskYIED(void);
调用taskYIELD()函数后,任务会主动让出CPU。这个函数常用于控制相同优先级任务间的切换,配合宏定义configUSE TIMESLICING使用,可以让使用者在抢占式调度模式下控制相同优先级任务之间的切换。cOnfigUSETIMESLICING是控制时间片调度的宏定义,如果在 FreeRTOSConfig.h中未定义或者宏定义为1,那么处于就绪态的多个相同优先级任务将会以时间片切换的方式共享处理器,为0时关闭时间片调度,处于就绪态的多个相同优先级任务之间不会进行切换。这个宏定义是默认开启的。
5、任务信息
5.1、任务信息函数
void vTaskList(char * pcWriteBuffer);
功能:获取任务信息。用户如果需要使用任务信息获取函数需要将FreeRTOSConfig.h中的COnfgUSE _TRACE FORTS_FORTTS FORTS_Functions 和 configUSE_TRACE_FACILITY宏定义为1。vTaskList()调用uxTaskGetSystemState(),然后将uxTaskGetSystemState()生成的原始数据格式化为可读的表,该表显示每个任务的状态,包括任务的堆栈剩余空间。在获取的表中B表示阻塞、R表示就绪、D表示删除、S表示挂起。注意:调用这个函数会挂起所有任务,这一过程可能持续较长时间,因此本函数仅在调试时使用。
参数描述:pcWriteBuffer——以ASCII格式写人任务详细信息的缓冲区。假定此缓冲区足够大,足以包含生成的报表。每个任务大约有40字节就足够了。
5.2、任务运行时间信息函数
void vTaskGetRunTineStats(char * pcWriteBuffer);
功能:获取任务运行时间。用户如果需要使用任务运行时间函数需要将FreeRTOSConfig.h中的configGENERATE_RUN_TIME_STATS 和 configUSE_STATS_Formatting_Funds宏定义为1。vTaskGetRunTimeStats()调用uxTaskGetSystemState(),然后将 uxTaskGetSystemState()生成的原始数据格式化为可读的表,该表显示每个任务在运行状态中所花费的时间(每个任务消耗的CPU时间)。数据作为绝对值和百分比值提供。绝对值的分辨率取决于应用程序提供的运行时状态时钟的频率。要使用这个函数,就必须有一个用于时间统计的定时器或计数器,此定时器或计数器的精度要至少大于10倍的系统节拍频率。这个定时器或计数器的配置以及获取定时时间是由两个宏定义实现的,这两个宏一般在文件 FreeRTOSConfig.h中定义。配置定时器或计数器的宏为pOrtCONFIGURE_TIMERFOR_RUN_TIME_STATS(),获取定时时间的宏为POrtGET_RUN_TIME_COUNTERVALUE()。注意:调用这个函数会挂起所有任务,这一过程可能持续较长时间,因此本函数仅在调试时使用。
参数描述:pcWriteBuffer——任务的运行时间信息会写人这个缓冲区,为ASCII表单形式。这个缓冲区要足够大,以容纳生成的报告,每个任务大约需要40字节。
6、任务优先级
6.1、任务优先级设置函数
void vTaskPrioritySet( TaskHandle_t xTask,
UBaseType_t uxNewPriority )
功能:设置任务的优先级。如果需要使用此函数,则需要将FreeRTOSConfig.h中的INCLUDE_vTaskPrioritySet宏定义为1。如果设置的优先级高于当前运行的任务,则在函数返目前会进行一次上下文切换。
参数描述:
xTask——要设置优先级任务的句柄,为NULL表示设置当前运行的任务。
uxNewPriority——要设置的新优先级
6.2、任务优先级获取函数
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )
功能:获取任务的优先级。如果需要使用此函数,则需要将FreeRTOSConfig.h中的INCLUDE _uxTaskPriorityGet 宏定义为1.
参数描述:xTask--要查询的任务的句柄。传递空句柄将导致返回调用任务的优先级
返回值:返回任务的优先级。