2016年12月20日
创建任务
portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode, //指向任务的实现函数的指针
constsigned portCHAR * const pcName, //任务名,长度有限制
unsignedportSHORT usStackDepth, //分配多大的栈空间。字(word)
void * pvParameters, //接受一个指向 void 的指针(void*)
unsignedportBASE_TYPE uxPriority, //任务执行的优先级 //取值范围可以从最低优先级 0 到最高优先级(configMAX_PRIORI
tiES – 1)
xTaskHandle*pxCreatedTask //传出任务的句柄,如果应用程序中不会用到这个任务的句柄,则 pxCreatedTask 可以被设为 NULL。
);
返回值 有两个可能的返回值:
1.pdTRUE
表明任务创建成功。
2.errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
由于内存堆空间不足, FreeRTOS 无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。
例子:
xTaskCreate( cli_def_task,
"cli",
1024,
NULL,
4,
NULL
);
任务调度函数
/*启动调度器,任务开始执行 */
vTaskStartScheduler();
任务优先级
xTaskCreate()API 函数的参数 uxPriority 为创建的任务赋予了一个初始优先级。这个侁先级可以在调度器启动后调用 vTaskPrioritySet() API 函数进行修改
FreeRTOSConfig.h中 设 定 的 编 译 时 配 置 常 量configMAX_PRIORITIES 的值,即是最多可具有的优先级数目
范围从 0 到(configMAX_PRIORITES – 1)。
每个任务都执行一个”时间片” 任务在时间片起始时刻进入运行态,在时间片结束时刻又退出运行态,调度器需要在每个时间片的结束时刻运行自己本
身 ,时间片的长度通过心跳中断的频率进行设定 Tick (时钟滴答)
心跳中断频率由FreeRTOSConfig.h 中的编译时配置常量configTICK_RATE_HZ 进行配置
configTICK_RATE_HZ 设为 100(HZ),则时间片长度为 10ms
执行流程
图中底部的箭头表示从t1起始的运行时刻。彩色的线段表示在每个时间点上正
在运行的任务——比如 t1 与 t2 之间运行的是任务 1。
在任何时刻只可能有一个任务处于运行态。所以一个任务进入运行态后(切入),另
一个任务就会进入非运行态(切出)。
心跳计数(tick count)值表示的是从调度器启动开始,心跳中断的总数,并假定心跳计数器不会溢出。用户程序在指定延迟周期时不必考虑心跳计数溢出问题,因为时间连贯性在内核中进行管理。
图中红色的线段表时内核本身在运行。黑色箭头表示任务到中断,中断再到另一
个任务的执行顺序
任务优先级测试
打印结果:
调度器总是选择具有最高优先级的可运行任务来执行。任务 2 的优先级比任务 1
高,并且总是可运行,因此任务 2 是唯一一个一直处于运行态的任务。而任务 1 不可能
进入运行态,所以不可能输出字符串。
下载时有时提示这个错误:
Error: Flash Download failed -"Cortex-M4"
解决方法:
检查这里的配置,配置正确后重新上电