FreeRTOS API速查

2024-06-12 17:20
文章标签 freertos api 速查

本文主要是介绍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速查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054846

相关文章

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

SDAutoLayout/UIView+SDAutoLayout.h 的基本使用,记住这4个Api就足够了~

1.1 > leftSpaceToView(self.view, 10) 方法名中带有“SpaceToView”的方法表示到某个参照view的间距,需要传递2个参数:(UIView)参照view 和 (CGFloat)间距数值 1.2 > widthRatioToView(self.view, 1) 方法名中带有“RatioToView”的方法表示view的宽度或者高度等属性相对于参

linux常用API接口

linux常用API接口 文章目录 linux常用API接口1.应用层内存映射mmap取消内存映射munmap终端打印可用方式1.puts 函数2.文件操作函数 fprintf3.字符输出函数 putchar4.fwrite 函数 2.内核层 1.应用层 内存映射mmap mmap 是一个用于内存映射的系统调用,它可以将一个文件或设备中的内容映射到进程的地址空间中,允许程

深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用

title: 深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用 date: 2024/6/23 updated: 2024/6/23 author: cmdragon excerpt: 摘要:“本文深入探讨了Nuxt3 Composables,重点介绍了其目录架构和内置API的高效应用。通过学习本文,读者将能够更好地理解和利用Nuxt3 Composabl

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子,介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm=1001.2014.3001.5501文章浏览阅读323次,点赞4次,收藏2次。搞3D几何内核算法研究,必须学习NURBS样条曲线曲面。看《非均匀有理B样条 第2版》这本书,学习起来,事半功倍。在《插件化算法研究平台

使用ig507金融数据库的股票API接口经验有感:Java与Python

一、Java技术: 1. Java调用ig507金融数据库(ig507.com)股票API接口 引言: 随着金融科技的不断发展,数据驱动的投资策略变得越来越重要。本文将介绍如何使用Java语言调用ig507金融数据库的股票API接口,以获取实时股票数据,并展示基本的编程步骤和注意事项。 步骤一:引入依赖库 在Java项目中,首先需要引入用于处理HTTP请求和网络通信的库,如Apache

【进阶篇-Day5:JAVA常用API的使用(Math、BigDecimal、Object、包装类等)】

目录 1、API的概念2、Object类2.1 Object类的介绍2.2 Object的toString()方法2.3 Object的equals()方法2.4 Objects概述 3、Math类4、System类5、BigDecimal类6、包装类6.1 包装类的概念6.2 几种包装类(1)手动转换包装类:(2)自动转换包装类:(3)Integet常用方法:(4)练习: 1

android 中文api (84) —— TrafficStats

android 中文api (84) —— TrafficStats   前言   本章内容是android.net.TrafficStats,译为"流量统计",版本为Android 2.3 r1 ,翻译参考“Android开发网”的这篇文章,欢迎访问他们的网址:“http://android123.com.cn/”。期待你一起参与Android API 的中文翻译,联系我over140@g