banner
Hi my new friend!

Freertos

Scroll down

FreeRTOS是一个开源的实时操作系统(RTOS),广泛应用于嵌入式开发, 提供了强大的功能来管理硬件资源和执行多任务处理,是为微控制器设计的小型、可预见的和高效的系统。

创建任务

任务是由 xTaskCreate() 函数创建的,该函数允许开发者定义执行的函数、任务名称、堆栈大小和任务优先级。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// xTaskCreate - 创建一个新的任务并添加到任务调度器的就绪列表。
// 参数:
// pvTaskCode - 指向任务入口函数的指针。
// pcName - 任务名称字符串。
// usStackDepth - 任务栈的深度,以字为单位。
// pvParameters - 传递给任务的参数。
// uxPriority - 任务的优先级。
// pxCreatedTask - 用于传出创建的任务的句柄。
// 返回:
// 如果任务创建成功,返回pdPASS;如果失败,返回错误代码。
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
// vTaskStartScheduler - 启动FreeRTOS调度器。调度器开始后,将执行优先级最高的就绪状态任务。
// 返回:无返回值。此函数通常不返回,除非系统内存不足导致调度器启动失败。
void vTaskStartScheduler(void);

任务管理

可以使用 vTaskDelete() 来删除一个任务,使用 vTaskSuspend()vTaskResume() 来挂起和恢复任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// vTaskDelete - 删除一个任务。
// 参数:
// xTaskToDelete - 要删除的任务的句柄。传递NULL将删除调用此函数的任务。
void vTaskDelete(TaskHandle_t xTaskToDelete);

// vTaskSuspend - 暂停一个任务。
// 参数:
// xTaskToSuspend - 要暂停的任务的句柄。传递NULL将暂停调用此函数的任务。
void vTaskSuspend(TaskHandle_t xTaskToSuspend);

// vTaskResume - 恢复一个已暂停的任务。
// 参数:
// xTaskToResume - 要恢复的任务的句柄。
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
// xQueueSend - 向队列发送一个项。
// 参数:
// xQueue - 队列的句柄。
// pvItemToQueue - 指向要发送的项的指针。
// xTicksToWait - 在队列满时等待空位的最大时钟节拍数。
// 返回:
// 如果成功将项发送到队列,返回pdTRUE;如果超时,返回pdFALSE。
BaseType_t xQueueSend(QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait);

// xQueueReceive - 从队列接收一个项。
// 参数:
// xQueue - 队列的句柄。
// pvBuffer - 接收数据的缓冲区指针。
// xTicksToWait - 在队列空时等待数据的最大时钟节拍数。
// 返回:
// 如果成功从队列接收到一个项,返回pdTRUE;如果超时,返回pdFALSE。
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
// xSemaphoreCreateBinary - 创建一个二元信号量。
// 返回:
// 新创建的信号量的句柄。如果内存不足无法创建,返回NULL。
SemaphoreHandle_t xSemaphoreCreateBinary(void);

// xSemaphoreTake - 请求获取一个信号量。
// 参数:
// xSemaphore - 要获取的信号量的句柄。
// xTicksToWait - 在信号量不可用时等待的最大时钟节拍数。
// 返回:
// 如果成功获取信号量,返回pdTRUE;如果超时,返回pdFALSE。
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,
TickType_t xTicksToWait);

// xSemaphoreGive - 释放一个信号量。
// 参数:
// xSemaphore - 要释放的信号量的句柄。
// 返回:
// 如果成功释放信号量,返回pdTRUE;如果发生错误,返回pdFALSE。
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore);

互斥量

互斥量是一种特殊类型的信号量,主要用于资源共享,使用 xSemaphoreCreateMutex() 创建。

1
2
3
4
// xSemaphoreCreateMutex - 创建一个互斥量。
// 返回:
// 新创建的互斥量的句柄。如果内存不足无法创建,返回NULL。
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
// xEventGroupCreate - 创建一个事件组。
// 返回:
// 新创建的事件组的句柄。如果内存不足无法创建,返回NULL。
EventGroupHandle_t xEventGroupCreate(void);

// xEventGroupSetBits - 设置事件组中的事件位。
// 参数:
// xEventGroup - 事件组的句柄。
// uxBitsToSet - 要设置的位掩码。
// 返回:
// 设置操作之前的事件位状态。
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet);

// xEventGroupWaitBits - 等待事件组中的一组事件位。
// 参数:
// xEventGroup - 事件组的句柄。
// uxBitsToWaitFor - 等待的事件位掩码。
// xClearOnExit - 如果为pdTRUE,退出时清除等待的事件位。
// xWaitForAllBits - 如果为pdTRUE,等待所有指定的位,否则等待任何一位。
// xTicksToWait - 等待指定事件位的最大时钟节拍数。
// 返回:
// 实际等待的事件位的状态。
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
// xTimerCreate - 创建一个新的软件定时器。
// 参数:
// pcTimerName - 定时器的名称。
// xTimerPeriodInTicks - 定时器的周期,以时钟节拍为单位。
// uxAutoReload - 如果为pdTRUE,定时器在超时后自动重新加载。
// pvTimerID - 用户定义的定时器标识。
// pxCallbackFunction - 定时器超时时调用的回调函数。
// 返回:
// 新创建的定时器的句柄。如果内存不足无法创建,返回NULL。
TimerHandle_t xTimerCreate(const char * const pcTimerName,
const TickType_t xTimerPeriodInTicks,
const UBaseType_t uxAutoReload,
void * const pvTimerID,
TimerCallbackFunction_t pxCallbackFunction);

// xTimerStart - 启动一个软件定时器。
// 参数:
// xTimer - 要启动的定时器的句柄。
// xTicksToWait - 在启动定时器时等待操作完成的最大时钟节拍数。
// 返回:
// 如果定时器成功启动,返回pdPASS;如果定时器队列满或其他错误,返回pdFAIL。
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
// xTaskNotify - 向任务发送通知。
// 参数:
// xTaskToNotify - 要通知的任务的句柄。
// ulValue - 发送给任务的通知值。
// eAction - 通知的操作类型,如eSetValueWithOverwrite, eSetValueWithoutOverwrite等。
// 返回:
// 如果通知被成功发送,返回pdPASS;如果任务句柄无效,返回pdFAIL。
BaseType_t xTaskNotify(TaskHandle_t xTaskToNotify,
uint32_t ulValue,
eNotifyAction eAction);

// xTaskNotifyWait - 等待任务通知。
// 参数:
// ulBitsToClearOnEntry - 在等待前清除的通知值位。
// ulBitsToClearOnExit - 在退出前清除的通知值位。
// pulNotificationValue - 指向接收通知值的变量的指针。
// xTicksToWait - 等待通知的最大时钟节拍数。
// 返回:
// 如果收到通知,返回pdTRUE;如果超时未收到通知,返回pdFALSE。
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
// pvPortMalloc - 分配指定大小的内存块。
// 参数:
// xSize - 要分配的内存块的大小,以字节为单位。
// 返回:
// 指向分配的内存块的指针。如果分配失败,返回NULL。
void *pvPortMalloc(size_t xSize);

// vPortFree - 释放先前分配的内存块。
// 参数:
// pv - 指向要释放的内存块的指针。
void vPortFree(void *pv);

中断管理

使用 xTaskResumeFromISR()xQueueSendFromISR() 在中断服务例程中安全地与任务交互。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// xTaskResumeFromISR - 从中断服务例程(ISR)中恢复一个任务。
// 参数:
// xTaskToResume - 要恢复的任务的句柄。
// 返回:
// 如果恢复任务后需要进行上下文切换,返回pdTRUE;否则返回pdFALSE。
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume);

// xQueueSendFromISR - 从中断服务例程(ISR)向队列发送一个项。
// 参数:
// xQueue - 目标队列的句柄。
// pvItemToQueue - 指向要发送的项的指针。
// pxHigherPriorityTaskWoken - 指向一个变量的指针,该变量在函数返回时被设置为pdTRUE,
// 如果发送操作导致一个优先级更高的任务被唤醒准备运行,否则为pdFALSE。
// 返回:
// 如果项成功发送到队列,返回pdTRUE;如果队列已满,返回pdFALSE。
BaseType_t xQueueSendFromISR(QueueHandle_t xQueue,
const void * pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken);

CPU使用率统计

vTaskGetRunTimeStats() 函数可以用来获取任务运行时间的统计信息,帮助优化程序性能。

1
2
3
4
// vTaskGetRunTimeStats - 获取任务运行时间的统计信息,以帮助优化程序性能。
// 参数:
// pcWriteBuffer - 用于接收运行时间统计信息的字符缓冲区。
void vTaskGetRunTimeStats(char *pcWriteBuffer);
其他文章
目录导航 置顶
  1. 1. 创建任务
  2. 2. 启动流程
  3. 3. 任务管理
  4. 4. 消息队列
  5. 5. 信号量
  6. 6. 互斥量
  7. 7. 事件
  8. 8. 软件定时器
  9. 9. 任务通知
  10. 10. 内存管理
  11. 11. 中断管理
  12. 12. CPU使用率统计
请输入关键词进行搜索