任务函数
函数原型: void ATaskFunction(void *pvParameters);
void ATaskFunction(void *pvParameters)
{
int iVariableExample = 0;
for( ; ; )
{
//任务实现代码
}
//如果任务的具体实现会跳出上面的死循环,
//则此任务必需在函数运行完之前删除。
vTaskDelete( NULL );
}
顶层任务状态
创建任务
函数原型:
portBASE_TYPE xTaskCreate( pbTASK_CODE pvTaskcode,
const signed portCHAR * const pcName,
unsigned portSHORT usStackDepth,
void *pvParameters,
undigned portBASE_TYPE uxPriority,
xTaskHandle *pxCreatedTask );
函数调用:
xTaskCreate( Task1,/*指向任务函数的指针*/
"Task 1",/*任务文本名字,只在调试中用到*/
1000,/*栈深度*/
1,/*此任务运行在优先级1上*/
NULL );/*不会用到任务句柄
任务优先级
优先级数目配置: configMAX_PRIORITIES 优先级频率配置: configTICK_RATE_HZ portTICK_RATE_MS 将以心跳为单位的时间值转化成以毫秒为单位
扩充非运行状态
1.定时(时间)相关事件
void vTaskDelay( portTickType xTicksToDelay );
//实现任务精确的周期性调用
void vTaskDelayUntil( portTickType * pxPreviousWakeTime,
portTickType xTimeIncrement );
2.同步事件
void ATaskFunction(void *pvParameters)
{
char *pcTaskName;
for( ; ; )
{
vPrintString(pcTaskName);
//250ms的循环周期时间,让任务在延时期间保持挂起态。
vTaskDelay250/portTICK_RATE_MS);
}
}
空闲务与空闲任务钩子函数
启用调度器: vTaskStartScheduler();
函数原型: void vApplicationIdleHook( void ); 配置: configUSE_IDLE_HOOK
在函数被删除后,空闲函数回收内核资源;如果空闲函数被饿死将无法进行回收工作。
改变任务优先级
改变任务优先级: void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); 获取任务优先级: unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
void ATaskFunction(void *pvParameters)
{
unsigned portBASE_TYPE uxPriority;
//获取自身优先级
uxPriority = uxTaskPriorityGet( NULL );
for( ; ; )
{
vPrintString("Task1 is runing./n/r");
//改变任务2的优先级,用到了任务句柄,在创建任务时需定义。
vTaskPrioritySet( xTask2Handle, (uxPriority + 1));
//250ms的循环周期时间,让任务在延时期间保持挂起态。
vTaskDelay250/portTICK_RATE_MS);
}
}
删除任务
函数原型: void vTaskDelete( xTaskHandle pxTaskToDelete );
void ATaskFunction(void *pvParameters)
{
int iVariableExample = 0;
for( ; ; )
{
//任务实现代码
}
//如果任务的具体实现会跳出上面的死循环,
//则此任务必需在函数运行完之前删除。
vTaskDelete( NULL );
}
思维导图