当前位置: 首页 > news >正文

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息
1.现象与开启启用宏
freeRTOSConfig.h
//必须启用
#define configUSE_TRACE_FACILITY                 1
#define configGENERATE_RUN_TIME_STATS            1
#define configUSE_STATS_FORMATTING_FUNCTIONS     1
#define configSUPPORT_DYNAMIC_ALLOCATION         1
//定义
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()                 (CPU_RunTime = 0ul)//为0的原因是下面的  CPU_RunTime已经满足 ,高出10~20倍的条件了。
#define portGET_RUN_TIME_COUNTER_VALUE()                             CPU_RunTime
2. vTaskList()函数与 vTaskGetRunTimeStats()函数基础信息
vTaskList()函数是FreeRTOS中自带的一个用来获取任务信息的函数,该函数会创建一个列表,列表中包含任务名称,任务状态信息,任务优先级,剩余堆栈以及任务编号的信息。
vTaskGetRunTimeStats()函数是FreeRTOS中自带的一个用来统计各个Task占用CPU时间的函数,使用这个功能我们可以清晰地看到每个任务所占用时间、百分比以及CPU整体的占用率,任务的运行时间信息提供了每个任务获取到的CPU使用权总的时间。
    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()                 (CPU_RunTime = 0ul) 
初始化一个外设来提供统计功能所需的时基。这个时基的分辨率一定要比FreeRTOS的系统时钟高,一般高出10~20倍。
#define portGET_RUN_TIME_COUNTER_VALUE()                                         
CPU_RunTime用于系统时间计数
//1.在上该语句所在的.c文件种定义 CPU_RunTime2.在 freeRTOSConfig.h调用外部声明的全局变量3.在中断的回调函数中调用4.在开启调度器前 打开中断计时器
因为使用的是tim7中断计数注意要在调度器使用前打开中断计时器并且在配置时不要忘记打开
任务函数例子:
void task_uart(void *para)
{
    uint8_t CPU_RunINfo[400];
    while(1)
    {
        memset(CPU_RunINfo,0,400);
        vTaskList((char*)CPU_RunINfo );
        printf("任务名\t任务状态\t优先级\t剩余栈\t任务序号\r\n");
        printf("%s",CPU_RunINfo);
        printf("\r\n");
        memset(CPU_RunINfo,0,400);
        vTaskGetRunTimeStats((char*)CPU_RunINfo);
        printf("任务名\t运行时间\t使用率\r\n");
        printf("%s",CPU_RunINfo);
        printf("\r\n");
        vTaskDelay(1000);
    }
}
//补充: 利用tim进行记录时间其实就是在使用其中断的回调函数在进行时间的记录, 每次使用中断计时器时都要注意打开中断计时器
中断是有共同的回调函数但是可以使用判断不同的htim来进行不同的操作
#include "string.h"
uint8_t  CPU_RunINfo[400];
memset(CPU_RunINfo,0, 400 );   从那个地址 CPU_RunINfo,开始赋值0,赋值400 字节
如果 uint16_t  CPU_RunINfo[400];
memset(CPU_RunINfo,0,800);  从那个地址 CPU_RunINfo,开始赋值0,赋值800 字节
状态:x运行态s挂起态r就绪b阻塞态
二.队列
1.队列的基础信息: 队列其实就是任务与任务之间进行交流与通信,在实际的应用中,常常会遇到一个任务或者中断服务需要和另一个任务进行“沟通交流,这个沟通交流的过程其实就是消息传递的过程,在没有 操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中,用全局变量来传递消息就会涉及到”资源管理“的问题;
队列的功能就是提供任务到任务,任务到中断和中断到任务的通讯机制;
队列是为了任务与任务,任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以储存有限的大小固定的数据项目;
//补充:
为什么不使用全局变量来进行数据传递?
中断里设置i=1;
i=0;就是说中断控制i=1但是没有写在实际的地址上时又来了一次中断使i=1这样就吞了一次中断
LDR           r0,[r1,#0]    //从r1指向地址读取i的值,及读i在内存内的值
ADDS        r0,#            //计算5+1 ,并把结果放在r0中
STR           r0,[r1,#0]    //把r0内的值存储到r1指向的内存中
2.队列的特性:队列数据结构实现任务 异步通信工作
消息支持先进先出方式排队,支持异步读写工作方式,消息支持后进先出方式排队,往队首发送消息
读写队列均支持超时机制
FreeRTOS中采用实际值传递,即将数据拷贝到队列中进行传递,FreeRTOS采用拷 贝数据传递,也可以传递指针(指针也是数值),所以在传递较大的数据的时候采用指针传递
一个任务能够从 任意一个消息队列接受和发送信息;
多个任务能够从 同一个消息队列接受和发送消息;
当队列使用结束后,可以通过删除队列函数进行删除;
队列项:在队列中可以存储数量有限,大小固定的数据,队列中每一个数据叫做队列项,队列能够存储队列项的最大数量成为 队列的长度,创建队列的时候会指定项目的大小和队列的长度;
消息队列的运行方式:
队列读写操作
队列的出队入队
核心
3.创建队列函数
静态相比动态要更加安全
queue. h
动态创建队列:
configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中设置为 1
QueueHandle_t xQueueCreate( 
UBaseType_t uxQueueLength,        // 队列一次可存储的最大项目数
UBaseType_t uxItemSize );             // 存储队列中每个项目所需的大小
如果队列创建成功,则返回所创建队列的句柄。如果创建队列所需的内存  无法分配,则返回 NULL。
静态创建队列:
configSUPPORT_STATIC_ALLOCATION 必须设置为1
QueueHandle_t xQueueCreateStatic(
UBaseType_t uxQueueLength,        // 队列一次可存储的最大项目数
UBaseType_t uxItemSize,                // 存储队列中每个项目所需的大小
uint8_t *pucQueueStorageBuffer,  // 如果 uxItemSize 不为零,则 pucQueueStorageBuffer 必须指向一个 uint8_t 数组,该数组的大小 至少要能容纳队列中最多可能存在的项目的总字节数, 即 ( uxQueueLength * uxItemSize ) 字节。如果 uxItemSize 为零,则 pucQueueStorageBuffer 可以为 NULL
StaticQueue_t *pxQueueBuffer );   // 必须指向 StaticQueue_t 类型的变量,该变量将用于保存队列的数据结构体。队列的任务控制块

相关文章:

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…...

vue-plugin-hiprint (vue2

页面效果 <template><div><div class="d-flex flex-column mt5"><div class="d-flex flex-row " style="margin-bottom: 10px;justify-content: center;"><!-- 纸张大小 A3、A4 等 --><div class="paper…...

【后端面试总结】什么是堆,什么是栈

堆与栈&#xff1a;计算机科学中的两大内存管理利器 在计算机科学中&#xff0c;内存管理是软件开发的核心组成部分之一。其中&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两种最基本的内存分配方式&#xff0c;它们各自有着独特的特性和应…...

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...

力扣--239.滑动窗口最大值

问题 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], …...

傅里叶变换推导

基本模型 假设在二维直角坐标系中&#xff0c;可以用相互垂直的基向量和表示&#xff1a; 假设&#xff1a; 假设在上的投影为&#xff0c;那么&#xff1a; 所以&#xff1a; 用公式表达&#xff1a; 但是在实际中&#xff0c;基向量和不一定长度都是1&#xff0c;重新推导一…...

扣子工作流中禁止同类别的图像流节点,不能超过4个

一、问题1不能在一个工作流中超过4个图像的并行节点 1、现象 本来想着在扣子中一次生成多张图片。 然后问了扣子小助手 2、图像节点限制 扣子给了如下反馈 近期图像流上线了并发限额&#xff0c;具体规则如下&#xff1a; 针对对象&#xff1a;单用户维度&#xff0c;非 bot…...

Java 语言深度剖析与实践应用

一、引言 Java 作为一种广泛应用于各种领域的编程语言&#xff0c;自 1995 年诞生以来&#xff0c;凭借其跨平台性、面向对象特性、丰富的类库以及强大的生态系统&#xff0c;在软件开发行业占据着重要地位。无论是企业级应用开发、移动应用开发、大数据处理还是分布式系统构建…...

1.14学习总结

日常刷题单 刷了题目后&#xff0c;对于排序方法更加熟练&#xff0c;手搓代码的速度也得到了提高。 感觉字符串还不熟练&#xff0c;高精度更是云里雾里&#xff0c;上升空间极大。 同时看见今晚有个入门难度的测试&#xff0c;去练了练手&#xff0c;想看看自己是什么成分&…...

C++蓝桥杯基础篇(三)

片头 哈喽&#xff01;小伙伴们&#xff0c;大家好~&#xff0c;今天我们来学习蓝桥杯基础篇&#xff08;三&#xff09;&#xff0c;继续练习相关习题&#xff0c;准备好了吗&#xff1f;我们开始啦~ 一、while循环 可以简单理解为循环版的if语句。if语句是判断1次&#xff0…...

微信小程序的制作

制作微信小程序的过程大致可以分为几个步骤&#xff1a;从环境搭建、项目创建&#xff0c;到开发、调试和发布。下面我会为你简要介绍每个步骤。 1. 准备工作 在开始开发微信小程序之前&#xff0c;你需要确保你已经完成了以下几个步骤&#xff1a; 注册微信小程序账号&…...

Sass更新:@import——>@use

背景&#xff1a;将一个公共的CSS样式文件导入到任意一个组件中进行使用 一、创建并使用CSS公共样式文件 1、在目录的assets目录下创建一个style文件夹&#xff0c;里面存放一个.scss文件&#xff08;例&#xff1a;mixin.scss&#xff09; 2、文件内以mixin来设置名为flex的…...

Python使用Flask结合DeepSeek开发

一、背景 我之前关于DeepSeek使用ollama部署的文章大家可以把DeepSeek大模型部署起来。那么ollama还提供了可以调用对应部署模型的API接口。我们可以基于这些接口&#xff0c;做自己的二次开发。使用pythonflaskollama就可以进行模型对话调用。并且前端采用SSE的技术&#xff0…...

python中的抽象类在项目中的实际应用

抽象类在项目中的实际应用主要体现在 规范代码结构、强制子类实现某些方法、提供部分通用功能&#xff0c;让代码更稳定、易维护。 举个例子&#xff1a;数据校验器 假设你在做一个 用户输入校验系统&#xff0c;需要支持 数字校验、字符串校验 和 邮箱校验。如果不用抽象类&…...

New Game--(单调队列)

I - New Game 有一种新的游戏&#xff0c;Monocarp 想要玩。这个游戏使用一副包含 n 张牌的牌堆&#xff0c;其中第 i 张牌上写有一个整数 a_i。 在游戏开始时&#xff0c;Monocarp 可以在第一轮选择牌堆中的任意一张牌。在接下来的每一轮中&#xff0c;Monocarp 可以选择一张…...

mapbox V3 新特性,添加下雪效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…...

无人机遥感在农林信息提取中的实现方法与GIS融合制图教程

遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势&#xff0c;是智慧农业必须采用的重要技术之一。 一&#xff1a;综合态势分析 1.1 研究区及作物品种分析 &#xff…...

生物发酵展与2025生物医药创新技术与应用发展论坛同期盛大举办

近日&#xff0c;备受瞩目的生物发酵展与2025生物医药创新技术与应用发展论坛暨展览会宣布将同期盛大举办。这一消息标志着生物科技领域两大盛会的强强联合&#xff0c;将为全球生物科技与医药行业带来前所未有的交流与合作机遇。 生物发酵展作为生物科技领域的知名展会&#x…...

Jenkins 配置 Git Repository 五

Jenkins 配置 Git Repository 五 这里包含了 Freestyle project 任务类型 和 Pipeline 任务类型 关于 Git 仓库的配置&#xff0c;如下 不同的任务类型&#xff0c;只是在不同的模块找到 配置 Git 仓库 找到 Git 仓库配置位置之后&#xff0c;所有的任务类型配置都是一样的 …...

记录阿里云CDN配置

网站接入CDN全流程&#xff0c;共4步&#xff01;-阿里云开发者社区 1、开通阿里云CDN服务 2、添加加速域名 3、验证域名归属权 4、域名添加CDN生成的CNAME解析 按照官网描述增加。细节点&#xff1a; 1. 域名和泛域名区别 2.开启https,要用nginx的证书&#xff0c;和项…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...