1任务管理
portBASE_TYPE xTaskCreate(
pdTASK_CODE pvTaskCode, /* 指向任务函数的指针 */
const portCHAR * const pcName, /* 任务的文本名字,只会在调试中用到 */
unsigned portSHORT usStackDepth, /* 栈深度 */
void *pvParameters, /* 传参*/
unsigned portBASE_TYPE uxPriority, /* 优先级 */
xTaskHandle *pvCreatedTask /* 不会用到任务句柄 */
);
kCode : 指向任务的入口函数.实现常通常是一个死循环.
pcName: 任务名.
usStackDepth: usStackDepth 值用于告诉内核为它分配多大的栈空间。
这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。
比如说,如果是 32 位宽的栈空间,传入的 usStackDepth值为 100,则将会分配 400 字节的栈空间(100 * 4bytes)。栈深度乘以栈宽度的结果千万不能超过一个 size_t 类型变量所能表达的最大值。
pvParameters: 传递到任务中的值
uxPriority: 优先级
pxCreatedTask:用于传出任务的句柄.
vTaskSuspend() //挂起
vTaskResume() 或 vTaskResumeFromISR() //唤醒
vTaskDelayUntil(portTickType * pxPreviousWakeTime, portTickType xTimeIncrement)
//周期任务转换
vTaskDelay() // 延迟
vTaskPrioritySet(xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority) //修改优先级
uxTaskPriorityGet()xTaskHandle pxTask //查询优先级
vTaskDelete(xTaskHandle pxTask) // 删除任务
vTaskDelete(NULL); //表示删除自己本身
调度任务简述
优先级抢占式调度
1,每个任务都赋予了一个优先级。
2,每个任务都可以存在于一个或多个状态。
3,在任何时候都只有一个任务可以处于运行状态。
4,调度器总是在所有处于就绪态的任务中选择具有最高优先级的任务来执行。
2 队列管理
由于队列可以被多个任务读取,所以对单个队列而言,也可能有多个任务处于阻塞
状态以等待队列数据有效。这种情况下,一旦队列数据有效,只会有一个任务会被解除
阻塞,这个任务就是所有等待任务中优先级最高的任务。而如果所有等待任务的优先级
相同,那么被解除阻塞的任务将是等待最久的任务。
xQueueCreate(unsigned uxQueueLength, unsigned uxItemSize)
uxQueueLength: 队列深度
uxItemSize: 队列中数据单元的长度,以字节为单位.
返回值为队列操作句柄.
xQueueSendToBack() //将数据发送到队列尾
xQueueSendToFront()//将数据发送到队列首
portBASE_TYPE xQueueSendToFront(
xQueueHandle xQueue, /*队列句柄*/
const void * pvItemToQueue, /*发送数据的指针*/
portTickType xTicksToWait ); /*阻塞超时时间 */
如 果 xTicksToWait 设 为 0 , 并 且 队 列 已 满 , 则xQueueSendToFront()与 xQueueSendToBack()均会立即返回。
如 果 把 xTicksToWait 设 置 为 portMAX_DELAY , 并 且 在FreeRTOSConig.h 中设定 INCLUDE_vTaskSuspend 为 1,那么阻塞等待将没有超时限制。
xQueueReceive()与 xQueuePeek() API 函数
portBASE_TYPE xQueueReceive (
xQueueHandle xQueue, /*队列句柄*/
const void * pvBuffer, /*发送数据的指针*/
portTickType xTicksToWait ); /*阻塞超时时间 */
xQueueReceive()用于从队列中接收(读取)数据单元。接收到的单元同时会从队列中删除。
xQueuePeek()也是从从队列中接收数据单元,不同的是并不从队列中删出接收到的单元。xQueuePeek()从队列首接收到数据后,不会修改队列中的数据,也不会改变数据在队列中的存储序顺。
切记不要在中断服务例程中调用 xQueueRceive()和 xQueuePeek()。中断安全版本 的替代 API 函数
xQueueReceiveFromISR()
unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue );
用于查询队列中当前有效数据单元个数。
切记不要在中断服务例程中调用 uxQueueMessagesWaiting()。应当在中断服务中 使用其中断安全版本uxQueueMessagesWaitingFromISR()。