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);
|