FreeRTOS内核API速览

news/2024/11/29 23:37:35/

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.ppmy.cn/news/676258.html

相关文章

CH543乐得瑞单C口显示器方案(LDR6020)

首先显示器的种类很多,有桌面显示器,便携显示器,智能显示器,甚至AR眼镜也可以算是一个微型显示器。以往的显示器传输视频信号多为VGA和HDMI,当然DP也有,只是占少数,再早之前还有模拟信号接口等等&#xff0…

家庭网络,怎么给每个房间装一个无线路由器?

20多年从业经验的网络工程师来回答你,千万不要每个房间安装一个路由器,管理非常不方便,而且没办法漫游:你从A房间走到B房间,只要手机还能接收到A房间的信号,就不会自动切换到B房间的路由器上,从…

EasyUefi安装教程

EasyBCD只适合efi的系统进行引导启动选项,不适合uefi的系统,但是现在大多数电脑都是uefi的,这样可以更加快速启动电脑,所以我们需要EasyUefi来引导。 这里我准备好了需要的EasyUefi提取码:k3dr 开始我们的安装教程! 解…

vue-router路由(概念、作用、安装、示例)

一、 vue-router概念: 这里的路由并不是指我们平时所说的硬件路由器,这里的路由就是SPA(single page application单页应用)的路径管理器。再通俗的说,vue-router就是WebApp的链接路径管理系统。 vue-router是Vue.js官…

路由器的连接——图解

导读 现如今路由器的使用越来越普遍,路由器有很多网线口,你知道这些网线口该如何连接吗? ❂ 路由器后面都有哪些口 下图为一张最常用的路由器接口示意图 我们可以看到,除了电源接口外,路由器一般有两种颜色的口&…

Vue 路由: vue-router安装和使用

1、介绍(由来) vue-router是Vue.js的路由插件。 2、 使用场景(优劣)原理 适合用于构建单页面应用,基于路由和组件;路由用于设定访问路径,将路径和组件映射起来。 路径之间的切换实际上就是组件…

Vue 安装router路由

步骤 一、安装命令:npm install vue-router 二、配置: 1、在mian.js文件中加入代码 import router from “./router”; new Vue({ router, render: (h) > h(App), }).$mount("#app"); 2、新建一个router文件夹,下面建个index.j…

西门子1200plc轴运动控制程序模板 介绍:此程序是之前给海康威视做的一台装路由器壳子的机器

西门子1200plc轴运动控制程序模板 介绍:此程序是之前给海康威视做的一台装路由器壳子的机器。 程序有以下: 1):调用轴控制块做的控制3个伺服, 2):1个电缸, 3)&#xff1…