学习任务:
>如何实现一个任务。
> 如何创建一个或多个任务的实例。
> 如何使用任务参数。
> 如何改变一个已创建任务的优先级。
> 如何删除任务。
> 如何实现周期性处理。
> 空闲任务何时运行,可以用来干什么。
创建任务函数:
BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, //任务函数名(指针)永不退出程序,退出要删除回收资源。
const charchar * const pcName, //提示名(作用是识别任务函数是什么作用)
unsigned short usStackDepth, /*栈空间大小(usStackDepth*域宽word)configMINIMAL_STACK_SIZE系统建议最小值,不能超过size_t最大值,一般为unsigned int,64位为long unsigned int*/
void *pvParameters,// 任务函数传递的形式参数 (转换成void*传递(要改变就取地址))
UBaseType_t uxPriority, //优先级(0~configMAX_PRIORITIES – 1)
TaskHandle_t * pvCreatedTask //任务操作句柄(是个句柄地址)(删除、修改优先级)
); /*有两个可能的返回值:
1. pdTRUE 表明任务创建成功。
2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 由于内存堆空间不足,FreeRTOS无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。*/
延时阻塞状态:
void vTaskDelay( portTickType xTicksToDelay );
/*常数 portTICK_RATE_MS 可以用来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。*/
准确延时阻塞状态:
void vTaskDelayUntil( portTickType * pxPreviousWakeTime,//上次阻塞时间
portTickType xTimeIncrement //阻塞心跳周期(55秒/portTICK_RATE_MS)
);
pxPreviousWakeTime = xTaskGetTickCount()//阻塞时间需要在第一次(循环前)初始化,
vTaskDelay和vTaskDelayUntil两个对比:
vTaskDelay没有将程序运行时间计入时间,用作循环运行时间不准确,记录的是vTaskDelay调用到退出阻塞时间;
vTaskDelayUntil记录的是上一次退出阻塞状态到这次这次退出,时间准确,适合用作循环任务。
任务调度器:
vTaskStartScheduler();//会自动穿件一个最低权限的空闲任务(权限0),保证有任务在跑。
空闲函数钩子函数:
void vApplicationIdleHook( void )//必须定义成这样。没有函数形式参数和返回值,用来操作空闲函数。
作用:
1、执行低优先级或者后台、需要不停处理的功能函数;
2、测试系统处理裕量;
3、将处理器配置成低功耗模式。
FreeRTOSConfig.h 中的配置常量 configUSE_IDLE_HOOK 必须定义为 1,这样空
闲任务钩子函数才会被调用。
优先级改变:
void vTaskPrioritySet( xTaskHandle pxTask, //句柄 NULL 改变自身,
unsigned portBASE_TYPE uxNewPriority //优先级
);//在调试器启动后改变优先级
查询优先级:
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask //句柄 NULL查询自身,
);//返回值:查询的优先级。
删除任务:
void vTaskDelete( xTaskHandle pxTaskToDelete );