FreeRTOS是一个开源的实时操作系统(RTOS),广泛应用于嵌入式开发, 提供了强大的功能来管理硬件资源和执行多任务处理,是为微控制器设计的小型、可预见的和高效的系统。
创建任务
任务是由 xTaskCreate()
函数创建的,该函数允许开发者定义执行的函数、任务名称、堆栈大小和任务优先级。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, const char * const pcName, const configSTACK_DEPTH_TYPE usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask);
|
启动流程
调用 vTaskStartScheduler()
启动任务调度器,此函数会启动RTOS的调度,允许任务开始执行。
1 2 3
|
void vTaskStartScheduler(void);
|
任务管理
可以使用 vTaskDelete()
来删除一个任务,使用 vTaskSuspend()
和 vTaskResume()
来挂起和恢复任务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
void vTaskDelete(TaskHandle_t xTaskToDelete);
void vTaskSuspend(TaskHandle_t xTaskToSuspend);
void vTaskResume(TaskHandle_t xTaskToResume);
|
消息队列
通过 xQueueSend()
,xQueueReceive()
等函数管理消息队列,允许任务之间的通信。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
BaseType_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait);
BaseType_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait);
|
信号量
信号量用于同步任务,主要通过 xSemaphoreCreateBinary()
、xSemaphoreTake()
和 xSemaphoreGive()
管理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
SemaphoreHandle_t xSemaphoreCreateBinary(void);
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait);
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore);
|
互斥量
互斥量是一种特殊类型的信号量,主要用于资源共享,使用 xSemaphoreCreateMutex()
创建。
1 2 3 4
|
SemaphoreHandle_t xSemaphoreCreateMutex(void);
|
事件
事件组通过 xEventGroupSetBits()
和 xEventGroupWaitBits()
管理,用于事件驱动的任务同步。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
EventGroupHandle_t xEventGroupCreate(void);
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet);
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait);
|
软件定时器
使用 xTimerCreate()
和 xTimerStart()
管理软件定时器,允许在设置的时间后执行回调函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
TimerHandle_t xTimerCreate(const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, TimerCallbackFunction_t pxCallbackFunction);
BaseType_t xTimerStart(TimerHandle_t xTimer, TickType_t xTicksToWait);
|
任务通知
任务通过 xTaskNotify()
和 xTaskNotifyWait()
发送和接收通知,用作轻量级的信号量或消息队列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
BaseType_t xTaskNotify(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction);
BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait);
|
内存管理
FreeRTOS 提供 pvPortMalloc()
和 vPortFree()
管理动态内存。
1 2 3 4 5 6 7 8 9 10 11
|
void *pvPortMalloc(size_t xSize);
void vPortFree(void *pv);
|
中断管理
使用 xTaskResumeFromISR()
和 xQueueSendFromISR()
在中断服务例程中安全地与任务交互。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume);
BaseType_t xQueueSendFromISR(QueueHandle_t xQueue, const void * pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken);
|
CPU使用率统计
vTaskGetRunTimeStats()
函数可以用来获取任务运行时间的统计信息,帮助优化程序性能。
1 2 3 4
|
void vTaskGetRunTimeStats(char *pcWriteBuffer);
|