FreeRTOS API速查

目录

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);
  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoT_H2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值