FreeRTOS API速查

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

本文主要是介绍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

相关文章

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.