本文介绍嵌入式实时操作系统FreeRTO的常用API,freertos基本功能包括 任务调度、内存管理、中断管理、定时器管理、消息队列、信号量、互斥锁等。
1. FreeRTOS 任务相关API:
1.1 任务结构 void Task (void *pvParameters)
void Task (void *pvParameters)
{
for (; ;)
{
}
}
1.2 任务创建 xTaskCreate()
xTaskCreate( Task, //任务函数指针
"testtask" , //任务文本名字
1000, //任务堆栈深度
NULL, //任务参数 (void *类型)
1, //任务优先级(freertos 优先级数据越大,优先级越高)
NULL); //任务句柄(xTaskHandle *类型)
1.3 任务延时 vTaskDelay()、vTaskDelayUntil() 用于周期行任务的精准延时
vTaskDelay(250/portTICK_RATE_MS) ; //延时250ms
void Task(void *pvParameters)
{
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount(); //获取当前心跳计数值void
//周期行任务
vTaskDelayUntil(&xLastWakeTime,250/portTICK_RATE_MS);
}
}
1.3 空闲任务回调函数 void vApplicationIdleHook(void)
1.4 心跳回调函数 void vApplicationTickHook(void)
1.5 任务优先级获取&&设置 vTaskPrioritySet() 、uxTaskPriorityGet()
unsigned portBASE_TYPE priority;
priority = uxTaskPriorityGet(NULL); //NULL 表示获取当前任务优先级
vTaskPrioritySet(NULL, priority-2); //NULL 表示设置当前任务优先级
1.6 删除任务 vTaskDelete()
vTaskDelete(NULL); //表示删除任务自身
1.7 立即进行任务切换 taskYIELD()
2. FreeRTOS 消息队列相关API
2.1 创建队列 xQueueCreate()
xQueueHandle xQueue;
xQueue = xQueueCreate(5, sizeof(long)); //参数分别表示队列存储单元数量、队列单元数据长度
2.2 队列发送 xQueueSendToBack() 、xQueueSendToFront() //发送到队列尾和队列头
portBASE_TYPE xStatus;
long int msg;
xStatus = xQueueSendToBack(xQueue, //队列句柄
&msg, //队列消息指针
0); //队列发送超时时间,超时以系统心跳为单位,设置为0表示不等待立即返回,
//设置为portMAX_DELAY 表示一直等待。
2.3 队列接收 xQueueReceive () 、xQueuePeek() //前者读取消息后,删除消息,后者读取消息后,不删除消息
long int msg;
port_BASE_TYPE xStatus;
const portTickType xTicksToWait = 100/portTICK_RATE_MS;
xStatus = xQueueReceive(xQueue,
&msg,
xTickToWait);
2.4 队列查询 uxQueueMessageWaiting() //查询队列种有效数据单元个数
返回值 = 0 表示队列为空
2.5 在中断中使用队列 xQueueSendToFrontFromISR()、xQueueSendToBackFromISR() 、xQueueReceiveFromISR()
3. FreeRTOS 信号量相关API
3.1 二值信号量创建 vSemaphoreCreateBinary()
xSemphoreHandle xSemaphore;
vSemphoreCreateBinary(xSemaphore);
3.2 计数信号量创建 xSemphoreCreateCounting()
xSemphoreHandle xSemphore;
xSemphore = xSemphoreCreateCounting(10, //计数信号量最大值为10
0); 计数信号量初始值为 0
3.3 互斥信号量创建 xSemphoreCreateMutex()
xSemphoreHandle xMutex = xSemphoreCreateMutex();
3.4 信号量获取 xSemphoreTake() //适用于所有信号量类型
xSemphoreTake(xSemphore, // 二值信号量句柄
portMAX_DELAY); //获取信号量超时时间,此处表示一直等待
3.5 信号量给与 xSemphoreGive() 、xSemphoreGiveFromISR() //使用与所有信号量类型
xSemphoreGive(xSemphore, //二值信号量句柄
0); //超时时间,此处0表示立即返回
4. FreeRTOS 临界区相关API
4.1 taskENTER_CRITICAL() taskEXIT_CRITICAL() //进入、退出临界区
5. FreeRTOS 调度器相关API
5.1 xTaskSuspendAll() 、xTaskResumeAll() //挂起、唤醒 调度器
6. FreeRTOS 内存分配相关API
6.1 pvPortMalloc () 、vPortFree()