FreeRTOS内核API速览

news2024/11/17 9:49:09

FreeRTOS内核API速览

  • 信号量
    • 创建信号量
      • 计数信号量
      • 互斥信号量
      • 二值信号量
    • 释放信号量
      • 任务模式
      • 中断模式
    • 获取信号量
      • 任务模式
      • 中断模式
  • 消息队列
    • 创建队列
    • 发送消息
      • 任务模式
      • 中断模式
    • 获取消息
      • 任务模式
      • 中断模式
  • 软件定时器
    • 创建定时器
    • 启动定时器
    • 停止定时器
    • 复位定时器
    • 删除定时器
    • 改变定时器周期
    • 其他操作函数
  • 任务通知
    • 发送通知
      • 任务模式
      • 中断模式
    • 获取通知
  • 错误排查
  • 其他
  • 汇总图


信号量

创建信号量

计数信号量

【动态】SemaphoreHandle_t xSemaphoreCreateCounting(uxMaxCount,uxInitialCount);
【静态】SemaphoreHandle_t xSemaphoreCreateCountingStatic(uxMaxCount,uxInitialCount,*pxSemaphoreBuffer);
uxMaxCount        : 最大计数值
uxInitialCount    : 初始计数值
pxSemaphoreBuffer : 计数信号量控制块缓存
xSemaphoreHandle  : 信号量句柄

互斥信号量

【动态】xSemaphoreHandle xSemaphoreCreateMutex(void);
【静态】SemaphoreHandle_t xSemaphoreCreateMutexStatic(*pxMutexBuffer);
pxMutexBuffer    : 互斥信号量控制块缓存
xSemaphoreHandle : 信号量句柄

二值信号量

【动态】void vSemaphoreCreateBinary(xSemaphore);//创建成功释放一次信号量
	    SemaphoreHandle_t xSemaphoreCreateBinary(void);
【静态】SemaphoreHandle_t xSemaphoreCreateBinaryStatic(*pxSemaphoreBuffer);
SemaphoreHandle_t xSemaphore : 信号量句柄
pxSemaphoreBuffer            : 二值信号量控制块缓存

释放信号量

任务模式

BaseType_t xSemaphoreGive(xSemaphore);
xSemaphore : 信号量句柄

中断模式

【互斥信号量不能使用该函数】
BaseType_t xSemaphoreGiveFromISR(xSemaphore,*pxHigherPriorityTaskWoken);
xSemaphore                : 信号量句柄
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换portSWITCH_CONTEXT()

获取信号量

任务模式

BaseType_t xSemaphoreTake(xSemaphore,xBlockTime);
xSemaphore : 信号量句柄
xBlockTime : 阻塞时间

中断模式

【互斥信号量不能使用该函数】
BaseType_t xSemaphoreTakeFromISR(xSemaphore, pxHigherPriorityTaskWoken);
xSemaphore                : 信号量句柄
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换portSWITCH_CONTEXT()



消息队列

创建队列

【动态】QueueHandle_t xQueueCreate(uxQueueLength,uxItemSize);
【静态】QueueHandle_t xQueueCreateStatic(uxQueueLength,uxItemSize,*pucQueueStorageBuffer,*pxQueueBuffer);
 uxQueueLength         : 队列最大存储量,即队列深度
 uxItemSize            : 队列数据大小,即队列项大小,单位字节
 pucQueueStorageBuffer : 队列元素存储缓存
 pxQueueBuffer         : 消息队列控制块缓存
 QueueHandle_t         : 队列句柄

发送消息

任务模式

BaseType_t xQueueSendToBack(xQueue,*pvItemToQueue,xTicksToWait);  //将消息发送到队列尾
BaseType_t xQueueSendToFront(xQueue,*pvItemToQueue,xTicksToWait); //将消息发送到队列首
BaseType_t xQueueSend(xQueue,*pvItemToQueue,xTicksToWait);        //将消息发送到队列尾
xQueue        : 队列句柄
pvItemToQueue : 发送数据(消息)指针
xTicksToWait  : 队列已满阻塞时间,为0不阻塞,为portMAX_DELAY一直阻塞直到队列不满

中断模式

xQueueSendToBackFromISR(xQueue,*pvItemToQueue,*pxHigherPriorityTaskWoken);  //将消息发送到队列尾
xQueueSendToFrontFromISR(xQueue,*pvItemToQueue,*pxHigherPriorityTaskWoken); //将消息发送到队列首
xQueue                    : 队列句柄
pvItemToQueue             : 发送数据指针
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换

获取消息

任务模式

xQueueReceive(xQueue,*pvBuffer,xTicksToWait); //从队列中获取消息(删除数据)
xQueuePeek(xQueue,*pvBuffer,xTicksToWait);    //从队列中获取消息(不删除数据)
xQueue       : 队列句柄
pvBuffer     : 接收消息缓存
xTicksToWait : 阻塞时间

中断模式

xQueueReceiveFromISR(xQueue,*pvBuffer,*pxHigherPriorityTaskWoken);//在中断服务从队列中获取消息(删除数据)
xQueue                    : 队列句柄
pvBuffer                  : 接收消息缓存
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换



软件定时器

创建定时器

【动态】TimerHandle_t xTimerCreate(*pcTimerName,xTimerPeriodInTicks,uxAutoReload,*pvTimerID,pxCallbackFunction);
【静态】TimerHandle_t xTimerCreateStatic(*pcTimerName,xTimerPeriodInTicks,uxAutoReload,*pvTimerID,pxCallbackFunction,*pxTimerBuffer);
pcTimerName         : 名称                                                         
xTimerPeriodInTicks : 周期
uxAutoReload        : 模式,pdTRUE周期,pdFALSE单次            
pvTimerID           : ID,在多个定时器使用同一个回调函数中使用
pxCallbackFunction  : 回调函数                                          
pxTimerBuffer       : 定时器控制块指针
TimerHandle_t       : 定时器句柄

启动定时器

【任务模式】BaseType_t xTimerStart(xTimer,xTicksToWait);
【中断模式】BaseType_t xTimerStartFromISR(xTimer,*pxHigherPriorityTaskWoken);
xTimer                    : 定时器句柄
xTicksToWait              : 阻塞时间
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换

停止定时器

【任务模式】BaseType_t xTimerStop(xTimer,xTicksToWait);
【中断模式】BaseType_t xTimerStopFromISR(xTimer,*pxHigherPriorityTaskWoken);
xTimer                    : 定时器句柄
xTicksToWait              : 阻塞时间
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换

复位定时器

【任务模式】BaseType_t xTimerReset(xTimer,xTicksToWait);
【中断模式】BaseType_t xTimerResetFromISR(xTimer,*pxHigherPriorityTaskWoken);
xTimer                    : 定时器句柄
xTicksToWait              : 阻塞时间
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换

删除定时器

【任务模式】BaseType_t xTimerDelete(xTimer,xTicksToWait);
xTimer       : 定时器句柄
xTicksToWait : 阻塞时间

改变定时器周期

【任务模式】BaseType_t xTimerChangePeriod(xTimer,xNewPeriod,xTicksToWait);
【中断模式】BaseType_t xTimerChangePeriodFromISR(xTimer,xNewPeriod,*pxHigherPriorityTaskWoken);
xTimer                    : 定时器句柄
xTicksToWait              : 阻塞时间
pxHigherPriorityTaskWoken : 高优先级任务,为TRUE退出中断前进行上下文切换

其他操作函数

BaseType_t xTimerIsTimerActive(xTimer);  //查询定时器状态        
void *pvTimerGetTimerID(xTimer);         //获取定时器ID
void vTimerSetTimerID(xTimer,*pvNewID);  //设置定时器ID
const char * pcTimerGetName(xTimer);     //获取定时器名称
TickType_t xTimerGetPeriod(xTimer);      //获取定时器周期
TickType_t xTimerGetExpiryTime(xTimer);  //获取定时器执行回调函数的时刻
BaseType_t  xTimerGetReloadMode(xTimer); //获取定时器模式
UBaseType_t uxTimerGetReloadMode(xTimer);



任务通知

发送通知

任务模式

【任务模式】BaseType_t xTaskNotifyGive(xTaskToNotify);//向任务发送通知 目标任务的通知值自增1
【任务模式】BaseType_t xTaskNotify(xTaskToNotify,ulValue,eAction);//向任务发送通知
xTaskToNotify             : 目标任务句柄
ulValue                   : 更新目标任务的通知值
eAction                   : 通知值操作方式。
eNoAction                 :不更新通知值,不使用ulValue(模拟二值信号量)
eSetBits                  : 目标任务的通知值与ulValue按位或运算(模拟事件标志组)
eIncrement                : 目标任务的通知值自增1,不使用ulValue(模拟计数信号量)
eSetValueWithOverwrite    : 将目标任务的通知值设置为ulValue(模拟消息队列)
eSetValueWithoutOrwrite   : 若目标任务没有挂起通知通知值设置为ulValue,若目标任务挂起不会更新通知值。

中断模式

【中断模式】void vTaskNotifyGiveFromISR(xTaskToNotify, *pxHigherPriorityTaskWoken);//向任务发送通知
xTaskToNotify             : 目标任务句柄
pxHigherPriorityTaskWoken : 高优先级任务切换,为pdTRUE退出中断前进行上下文切换portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);

获取通知

uint32_t ulTaskNotifyTake(xClearCountOnExit,xTicksToWait);//从当前任务获取任务通知
xClearCountOnExit : 退出清除通知。若收到任务通知且为pdFALSE,则退出之前递减通知值,等同于递减计数信号量值,若收到任务通知且为pdTRUE,则退出之前清除通知值,等同于二进制信号量。
xTicksToWait      : 在阻塞状态下等待接收通知的最长时间
//等待任务通知的函数(模拟事件标志组)
BaseType_t xTaskNotifyWait(ulBitsToClearOnEntry,ulBitsToClearOnExit,*pulNotificationValue,xTicksToWait);
ulBitsToClearOnEntry : 进入函数时需要清除的通知位
ulBitsToClearOnExit  : 退出函数时需要清除的通知位
pulNotificationValue : 指向一个变量的指针,用于获取通知值
xTicksToWait         : 等待通知的超时时间,单位为Tick



错误排查

获取任务栈剩余大小
UBaseType_t uxTaskGetStackHighWaterMark(xTask);
xTask       : 任务句柄
UBaseType_t : 剩余大小,单位4字节,typedef unsigned long UBaseType_t;
栈溢出钩子函数
void vApplicationStackOverflowHook(xTask,*pcTaskName);
xTask      : 任务句柄
pcTaskName : 任务名称
TickType_t xTaskGetTickCount(void);           //获取FreeRTOS SysTick
TaskHandle_t xTaskGetCurrentTaskHandle(void); //获取当前运行任务句柄
void vTaskGetRunTimeStats(*pcWriteBuffer);    //获取所有任务运行统计信息



其他

当前任务控制块指针
pxCurrentTCB
临界区代码保护
taskENTER_CRITICAL() //进入临界区
taskEXIT_CRITICAL()  //退出临界区
上下文切换 
portSWITCH_CONTEXT();
portYIELD_FROM_ISR();

汇总图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的创作纪念日:从前那个看文章的人,如今已经成为了写文章的人.

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 金句分享:…

【高级飞行功能】DJI AIR 2S

一、飞行动作 1.1飞行动作 螺旋飞行动作 如果风速比较大,可以采用螺旋飞行动作 环绕飞行(飞机云台是对着主体的) 环绕飞行与速度和环绕半径有关; 环绕半径越小,要求速度越慢环绕时,偏离主体中心&#xff0…

douyin23.9 deviceid和iid设备注册分析

使用23.9版本进行注册(版本多少 其实没有那么重要) 老生常谈,老规矩注册接口device_register不能少吧,然后要检测设备app_alert_check吧,之后要发app_log日志包吧。 当然除了只有这些接口肯定是不行啦,加密…

nmcli命令练习

一、为一个网卡添加或者删除另外一个IP地址 #为ens160这张网卡添加另一个ip nmcli connection modify ens160 ipv4.address 192.168.33.136/24#使添加或者删除的IP生效 nmcli connection up ens160#删除ens160这张网卡的IP nmcli connection modify ens160 -ipv4.address 192.…

Java程序会产生死锁?如何定位、修复?

文章目录 死锁的概念死锁定位实战模拟问题定位使用 jstack使用JConsole使用 Java 提供的标准管理 API 死锁的概念 死锁是一种特定的程序状态,在实体之间,由于循环依赖导致彼此一直处于等待之中,没有任何个体可以继续前进。死锁不仅仅是在线程…

Redis - Reactor 模式的事件驱动源码解析

前言 本篇将介绍 redis 服务器中 I/O 复用的具体应用。 redis 服务器将所有需处理的事件抽象为两种事件: 文件事件。redis 服务器是通过 Socket 与客户端进行连接和通信的。文件事件就是服务器对 Socket 的 I/O 操作的一种抽象,包括 accept、recv、sen…

Windows 解决cmd/dos窗口中文乱码问题

文章目录 一、问题描述二、解决方案1. 更改DOS窗口代码页方式1:更改dos窗口代码页(临时有效)方式2:修改注册表CodePage项(永久有效)方式3:修改 .lnk 快捷方式的文件属性(永久有效&am…

Minkube部署单节点kubernetes-1.23.7

minikube是一个快速构建单节点kubernetes的一个工具,用于快速构建本地测试和开发环境。 1、关闭防火墙和selinux systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i /SELINUX/s/enforcing/disabled/g /etc/selinux/config 2…

Vue 项目中使用WebSocket 消息推送

一、功能需求 1.这是我在后台管理项目中使用到的,主要的作用是搞一个消息提醒的功能。 2.主要有右上角的提示和有下角的消息弹框。 3.主要实现的功能是如果用户有未读的消息,那么首次登录就弹框,如果用户关闭了页面,那么再次刷新…

手把手教学使用宝塔面板部署前后端分离项目(全面详细)

前言:平日里我们的前后端项目基本上都是通过linux系统提供的dos命令去部署,有没有一种更简单的方式去部署我们自己的项目呢,答案是有的,本篇博客就是手把手教学如何通过一个可视化的页面去部署我们自己开发的前后端分离项目。 目录…

【Java项目】解决请求路径上明文ID传输导致可能被攻击的方法

文章目录 问题思路解决 问题 这个问题是我公司的一个小业务问题,问题来源于我们发送请求的时候,请求路径上携带的是明文,比如http://xxx/xxx/id12345,那么别有用心的人就可能会推测出id的生成策略,导致遍历id&#xf…

【需求实现】Tensorflow2的曲线拟合(一):数据集分割

神经网络中输入多少数据就输出多少数据的情况如何实现 导读数据集长什么样?怎么分割数据集?时间窗口分析模板我知道你很急,但你先别急 换个思路 导读 在实习的过程中遇到了这样一种需求:给定一条序列,并另外给定一条期…

vue如何封装一个上传多张图片的组件

上传图片不管是后台还是前端小程序,上传图片都是一个比不可少的功能有时候需要好几个页面都要上传图片,每个页面都写一个非常不方便,这时候就没有封装起来用的方便。跟上我的步伐带你了解如何封装 首先:创建一个文件夹在component…

【FFmpeg实战】过滤器 ---- h264_mp4toannexb

原文地址:https://www.cnblogs.com/vczf/p/13818609.html H264有两种封装方式:字节流AnnexB格式 AVCC格式。 1. AnnexB格式 ---- 用于实时播放 开始前缀(00000001或000001)+NALU数据  绝大部分编码器的默认输出格式…

leetcode题目1481. 不同整数的最少数目

题目 不同整数的最少数目 给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。 示例 1: 输入:arr [5,5,4], k 1 输出:1 解释:移除 1 个 4 &#xff0c…

初识消息队列

消息队列 字面意思就是存放消息的队列(Message Queue 简称MQ),最简单的消息队列模型包括了三个角色: 消息队列:存储和管理信息,也被称为消息代理生产者:发送消息到消息队列消费者:从消息队列中获取消息并…

基于TensorFlow和Keras的狗猫数据集的分类实验

文章目录 前言一、环境配置1、anaconda安装2、修改jupyter notebook工作目录3、配置TensorFlow、Keras 二、数据集分类1、分类源码2、训练流程 三、模型调整1.图像增强2、网络模型添加dropout层 四、使用VGG19优化提高猫狗图像分类1、构建网络模型2、初始化一个VGG19网络实例3、…

C语言--消失的数字

文章目录 1.法一&#xff1a;映射法2.法二&#xff1a;异或法3.法三&#xff1a;差值法4.法四&#xff1a;排序查找 1.法一&#xff1a;映射法 时间复杂度&#xff1a;O&#xff08;N&#xff09; 空间复杂度&#xff1a;O&#xff08;N&#xff09; #include<stdio.h>…

第4章 信息系统管理

文章目录 4.1.1 管理基础1 层次结构2 系统管理 4.1.2 规划和组织1 规划模型2 组织模型1&#xff09;业务战略&#xff08;竞争力优势模型&#xff1a;差异化、总成本领先、专注 战略&#xff09;2&#xff09;组织机制战略&#xff08;莱维特钻石模型&#xff1a;信息与控制、人…

【C++学习】类和对象 | 再谈构造函数 | 构造函数中的隐式类型转换 | static静态成员

目录 1. 再谈构造函数 2. 构造函数中的隐式类型转换 3. static静态成员 写在最后&#xff1a; 1. 再谈构造函数 我们之前使用构造函数初始化&#xff1a; #include <iostream> using namespace std;class Date { public:Date(int year 2023, int month 7, int da…