本文主要是介绍FreeRTOS API速查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 0 常用类型
- 1. 任务
- 1.1 xTaskCreate 创建任务
- 1.2 vTaskDelay 延时函数
- 1.3 vTaskDelayUntil 精准延时函数
- 1.4 vTaskDelete 任务删除函数
- 1.5 vApplicationIdleHook 空闲任务钩子函数
- 1.6 vTaskPrioritySet 任务优先级修改
- 1.7 任务优先级获取
- 2. 队列
- 2.1 xQueueCreate 创建队列
- 2.2 xQueueSendToFront 从队首向队列插入数据
- 2.3 xQueueSendToBack 从队尾向队列插入数据
- 2.4 xQueueReceive 出队
- 2.5 uxQueueMessagesWaiting 查询队列中的条目数
- 2.6 xQueueCreateSet 创建队列集
- 2.7 xQueueAddToSet 向队列集添加队列或信号量
- 2.8 xQueueSelectFromSet 从队列集中读取队列句柄
- 2.9 xQueueOverwrite(FromISR) 强制向队列写入数据
- 2.10 xQueuePeek(FromISR) 读取队列数据(不出队)
- 3. 软件计时器
- 3.1 xTimerCreate 创建和启动软件计时器
- 3.2 xTimerStart(FromISR) 启动软件定时器
- 3.3 vTimerSetTimerID 修改软件定时器ID
- 3.4 pvTimerGetTimerID 获取软件定时器ID
- 3.5 xTimerChangePeriod(FromISR) 更改软件定时器的周期
- 3.6 xTimerReset 重置/唤醒 软件定时器
- 4 资源管理
- 4.1 进入/退出临界区
- 4.2 vTaskSuspendAll 暂停调度器
- 4.3 xTaskResumeAll 回复调度器
- 4.4 xSemaphoreCreateMutex 创建互斥量
- 4.5 xSemaphoreTake获取信号线
- 4.6 xSemaphoreGive 释放信号线
- 5. 事件组
- 5.1 xEventGroupCreate 创建事件组
- 5.2 xEventGroupSetBits 设置事件组中的一个或多个位
- 5.3 xEventGroupSetBitsFromISR 设置事件组中的一个或多个位(中断版本)
- 5.4 xEventGroupWaitBits读取事件组的值
- 5.5 xEventGroupSync 允许多个任务使用一个事件组相互同步
- 6. 任务通知
- 6.1 ulTaskNotifyTake 等待任务通知
- 6.2 xTaskNotifyGive(FromISR)向任务发送通知
0 常用类型
学习FreeRTOS可以看看中文版的手册,翻译者翻译的很不错
FreeRTOS手册译文.pdf
BaseType_t //其实就是long类型,typedef long BaseType_t;
UBaseType_t //无符号long类型,typedef unsigned long UBaseType_t;
TaskHandle_t //任务句柄
TickType_t //表示时间tick数。其实就是u32,typedef uint32_t TickType_t;QueueHandle_t //队列句柄
QueueSetMemberHandle_t //其实就是空指针类型。typedef void * QueueSetMemberHandle_t;TimerCallbackFunction_t //软件定时器句柄SemaphoreHandle_t //信号量EventGroupHandle_t //事件组句柄EventBits_t //事件组标志
1. 任务
1.1 xTaskCreate 创建任务
BaseType_t xTaskCreate(TaskFunction_t pvTaskCode, /* 功能函数 */ const char * const pcName, /* 给人看的参数,无作用 */uint16_t usStackDepth, /* 堆栈深度,以字为单位 */ void *pvParameters, /* 参数,必须空类型 */UBaseType_t uxPriority, /* 任务优先级,1-31,超过则31 */TaskHandle_t *pxCreatedTask /* 任务句柄指针 */);
1.2 vTaskDelay 延时函数
void vTaskDelay( TickType_t xTicksToDelay /* 延时时间,tick个数 */
);
1.3 vTaskDelayUntil 精准延时函数
void vTaskDelayUntil( TickType_t * pxPreviousWakeTime, /* 一个时间点,如16:25 */TickType_t xTimeIncrement /* 经过多久,如30min */
);
1.4 vTaskDelete 任务删除函数
可以填写 NULL,删除自己
void vTaskDelete ( TaskHandle_t pxTaskToDelete, /* 任务句柄 */
);
1.5 vApplicationIdleHook 空闲任务钩子函数
函数命名固定,并且需要在FreeRTOSConfig.h中修改 钩子函数的宏定义
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1/* 类似中断,必须如此命名 */
void vApplicationIdleHook( void );
1.6 vTaskPrioritySet 任务优先级修改
void vTaskPrioritySet(TaskHandle_t pxTask, /* 任务句柄 */UBaseType_t uxNewPriority /* 新的优先级 */);
1.7 任务优先级获取
UBaseType_t uxTaskPriorityGet(TaskHandle_t pxTask /*任务句柄*/);
2. 队列
2.1 xQueueCreate 创建队列
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, /* 队列长度 */UBaseType_t uxItemSize /* 每个队列项的大小,单位为字节 */
);/* 返回值:队列句柄。 */
2.2 xQueueSendToFront 从队首向队列插入数据
BaseType_t xQueueSendToFront(QueueHandle_t xQueue, /* 队列句柄 */const void * pvItemToQueue, /* 指针,要复制的数组的头指针 */TickType_t xTicksToWait /* 阻塞时间(队列可能满了,需要等待) */
);/*
返回值:
pdPASS:成功
errQUEUE_FULL:队满
*/
2.3 xQueueSendToBack 从队尾向队列插入数据
BaseType_t xQueueSendToBack( QueueHandle_t xQueue,const void * pvItemToQueue,TickType_t xTicksToWait
);
/*
返回值:
pdPASS:成功
errQUEUE_FULL:队满
*/
2.4 xQueueReceive 出队
中断中使用,要使用 xQueueReceiveFromISR()
BaseType_t xQueueReceive(QueueHandle_t xQueue, /* 队列句柄 */void * const pvBuffer, /* */TickType_t xTicksToWait /* 阻塞时间 */
);
2.5 uxQueueMessagesWaiting 查询队列中的条目数
UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue /* 队列句柄 */
);
2.6 xQueueCreateSet 创建队列集
就是你想的那样,一个队列数组,里面存放了很多个队列句柄
QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength /* 队列集长度 */
);/* 返回参数:队列集句柄 */
2.7 xQueueAddToSet 向队列集添加队列或信号量
BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, /* 队列句柄或信号量 */QueueSetHandle_t xQueueSet /* 需要添加的队列集 */
);
2.8 xQueueSelectFromSet 从队列集中读取队列句柄
QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, /* 队列集 */const TickType_t xTicksToWait /* 阻塞时间 */
);
2.9 xQueueOverwrite(FromISR) 强制向队列写入数据
如果在中断中调用,需要使用中断安全版本xQueueOverwriteFromISR
BaseType_t xQueueOverwrite( QueueHandle_t xQueue, /* 队列句柄 */const void * pvItemToQueue /* 要复制到队列中的数据的指针 */
);
2.10 xQueuePeek(FromISR) 读取队列数据(不出队)
如果在中断中调用,需要使用中断安全版本xQueuePeekFromISR
BaseType_t xQueuePeek( QueueHandle_t xQueue, /* 队列句柄 */void * const pvBuffer, /* 接收的数组首地址 */TickType_t xTicksToWait /* 阻塞时间 */
);
3. 软件计时器
其原型必须返回 void,并将软件定时器的句柄作为唯一参数。
软件定时器回调函数自始至终执行,并以正常方式退出。这些函数应保持简短,且不得进
入阻塞状态。
3.1 xTimerCreate 创建和启动软件计时器
TimerHandle_t xTimerCreate( const char * const pcTimerName, /* 给人看的,没啥用 */ TickType_t xTimerPeriodInTicks, /* 计时器的周期,单位tick */UBaseType_t uxAutoReload, /*pdTRUE/pdFALSE : 是否自动重装载*/void * pvTimerID, /* 每个软件定时器都有一个ID值,略有用处 */TimerCallbackFunction_t pxCallbackFunction /*回调函数的函数名*/
);
3.2 xTimerStart(FromISR) 启动软件定时器
注意 : 切勿从中断服务例程调用 xTimerStart() 。应使用中断安全版本 xTimerStartFromISR() 代替它。
BaseType_t xTimerStart( TimerHandle_t xTimer, /* 定时器句柄 */TickType_t xTicksToWait /* 阻塞时间 */
);
3.3 vTimerSetTimerID 修改软件定时器ID
void vTimerSetTimerID( const TimerHandle_t xTimer, /* 定时器句柄 */void *pvNewID /* 新的ID指针 */
);
3.4 pvTimerGetTimerID 获取软件定时器ID
void *pvTimerGetTimerID( TimerHandle_t xTimer /* 定时器句柄 */
);
3.5 xTimerChangePeriod(FromISR) 更改软件定时器的周期
中断中使用 xTimerChangePeriodFromISR()
BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, /* 定时器句柄 */TickType_t xNewTimerPeriodInTicks, /* 新的周期,单位是ticks */TickType_t xTicksToWait /* 阻塞时间 */
);
3.6 xTimerReset 重置/唤醒 软件定时器
可以重置软件定时器,也可以唤醒软件定时器
BaseType_t xTimerReset( TimerHandle_t xTimer, /* 定时器句柄 */TickType_t xTicksToWait /* 阻塞时间 */
);
4 资源管理
4.1 进入/退出临界区
严格意义来说是宏不是函数
非中断中使用:
taskENTER_CRITICAL();
/* 你的代码 */
taskEXIT_CRITICAL();
中断中使用:
taskENTER_CRITICAL_FROM_ISR()
/* 你的代码 */
taskEXIT_CRITICAL_FROM_ISR();
4.2 vTaskSuspendAll 暂停调度器
void vTaskSuspendAll( void );
4.3 xTaskResumeAll 回复调度器
BaseType_t xTaskResumeAll( void );
4.4 xSemaphoreCreateMutex 创建互斥量
SemaphoreHandle_t xSemaphoreCreateMutex( void );
4.5 xSemaphoreTake获取信号线
xSemaphoreTake(SemaphoreHandle_t xMutex );
4.6 xSemaphoreGive 释放信号线
xSemaphoreGive(SemaphoreHandle_t xMutex );
5. 事件组
信号量和队列,具有以下特性:
- 允许任务在阻塞状态下等待单个事件的发生。
- 当事件发生时,会解除对单个任务的阻塞——被解除阻塞的任务是等待事件发生
时优先级最高的任务。
事件组是 FreeRTOS 的另一项功能,它允许将事件传递给任务。与队列和信号量不同:
- 事件组允许任务在阻塞状态下等待一个或多个事件的组合发生。
- 当事件发生时,事件组会解除对等待同一事件或事件组合的所有任务的阻塞。
5.1 xEventGroupCreate 创建事件组
EventGroupHandle_t xEventGroupCreate( void );
5.2 xEventGroupSetBits 设置事件组中的一个或多个位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, /* 事件组句柄 */const EventBits_t uxBitsToSet /* 一个或多个事件位 */
);/*例如,将 uxBitsToSet 设置为 0x04(二进制 0100)后,事件组中的
事件位 3 将被设置(如果尚未被设置),而事件组中的所有其他事件位
则保持不变。*/
5.3 xEventGroupSetBitsFromISR 设置事件组中的一个或多个位(中断版本)
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,/* 事件组句柄 */const EventBits_t uxBitsToSet, /* 一个或多个事件位 */BaseType_t *pxHigherPriorityTaskWoken
);
5.4 xEventGroupWaitBits读取事件组的值
EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup, /*事件组句柄*/const EventBits_t uxBitsToWaitFor, /* 指定要测试事件组中的哪些事件位 */const BaseType_t xClearOnExit, /* 指定使用位或运算还是位与运算 */const BaseType_t xWaitForAllBits, /* 指 定 要 在 事 件 组 中 测 试 的 事 件 位 */TickType_t xTicksToWait /* 阻塞时间 */
);
5.5 xEventGroupSync 允许多个任务使用一个事件组相互同步
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, /*事件组句柄*/const EventBits_t uxBitsToSet,/* 指定要测试事件组中的哪些事件位 */const EventBits_t uxBitsToWaitFor,/* 指 定 要 在 事 件 组 中 测 试 的 事 件 位 */TickType_t xTicksToWait /* 阻塞时间 */
);
6. 任务通知
与使用队列、信号量或事件组执行同等操作相比,使用任务通知向任务发送事件或数据的速度要快得多。
6.1 ulTaskNotifyTake 等待任务通知
允许任务在阻塞状态下等待其通知值大于零,并在返回前递减(减去一个)或清除任务的通知值。
uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait);
6.2 xTaskNotifyGive(FromISR)向任务发送通知
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify);
这篇关于FreeRTOS API速查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!