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

news2025/2/21 1:23:45
一.利用 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 类型的变量,该变量将用于保存队列的数据结构体。队列的任务控制块

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

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

相关文章

GBD研究——美国州级地图(附资源)

美国州级别地图 地图源很多,随便下载。不过我试了两个资源,发现有的资源会漏掉阿拉斯加和夏威夷。 就剩大的这块佩奇 出现这样的问题,要么跟数据源有关,要么就是要掉地名来看,是不是没匹配上。 亲自试过&#xff0c…

【微服务学习一】springboot微服务项目构建以及nacos服务注册

参考链接 3. SpringCloud - 快速通关 springboot微服务项目构建 教程中使用的springboot版本是3.x,因此需要使用jdk17,并且idea也需要高版本,我这里使用的是IDEA2024。 环境准备好后我们就可以创建springboot项目,最外层的项目…

第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 修改版…

DeepSeek 概述与本地化部署【详细流程】

目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins; 2.支持自定义启动参数; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址:https://get.j…

3D打印技术:如何让古老文物重获新生?

如何让古老文物在现代社会中焕发新生是一个重要议题。传统文物保护方法虽然在一定程度上能够延缓文物的损坏,但在文物修复、展示和传播方面仍存在诸多局限。科技发展进步,3D打印技术为古老文物的保护和传承提供了全新的解决方案。我们来探讨3D打印技术如…

Vue h函数到底是个啥?

h 到底是个啥? 对于了解或学习Vue高阶组件(HOC)的同学来说,h() 函数无疑是一个经常遇到的概念。 那么,这个h() 函数究竟如何使用呢,又在什么场景下适合使用呢? 一、h 是什么 看到这个函数你可…

深入浅出 Python Logging:从基础到进阶日志管理

在 Python 开发过程中,日志(Logging)是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题,还能提供丰富的数据支持,让应用更具可观测性。本文将带你全面了解 Python logging 模块,涵盖…

Android WindowContainer窗口结构

Android窗口是根据显示屏幕来管理,每个显示屏幕的窗口层级分为37层,0-36层。每层可以放置多个窗口,上层窗口覆盖下面的。 要理解窗口的结构,需要学习下WindowContainer、RootWindowContainer、DisplayContent、TaskDisplayArea、T…

2025年最新版1688平台图片搜索接口技术指南及Python实现

随着电商行业的蓬勃发展,1688作为国内领先的B2B交易平台,其商品搜索功能对于买家和卖家而言都至关重要。图片搜索作为其中的一种高级搜索方式,能够极大地提升用户的搜索体验和准确性。本文将详细介绍如何通过API接口实现1688平台的图片搜索功…

基于A*算法与贝塞尔曲线的路径规划与可视化:从栅格地图到平滑路径生成

引言 在机器人导航、自动驾驶和游戏开发等领域,路径规划是一个核心问题。如何高效地找到从起点到终点的最优路径,并且确保路径的平滑性和安全性,是许多应用场景中的关键挑战。本文将介绍一种结合A算法和贝塞尔曲线的路径规划方法,并通过Pygame实现可视化。我们将从栅格地图…

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理,公式,模式,伸缩因子,旋转方向等,推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现,注意…

【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局

问题 修改效果 解决方法 .xx {width: 100%;padding: 0 20px;box-sizing: border-box; } 默认box-sizing: content-box下, width 内容的宽度 height 内容的高度 宽度和高度的计算值都不包含内容的边框(border)和内边距(padding&…

贪心算法_翻硬币

蓝桥账户中心 依次遍历 不符合条件就反转 题目要干嘛 你就干嘛 #include <bits/stdc.h>#define endl \n using namespace std;int main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin >> s;string t; cin >> t;int ret 0;for ( i…

深入HBase——引入

引入 前面我们通过深入HDFS到深入MapReduce &#xff0c;从设计和落地&#xff0c;去深入了解了大数据最底层的基石——存储与计算是如何实现的。 这个专栏则开始来看大数据的三驾马车中最后一个。 通过前面我们对于GFS和MapReduce论文实现的了解&#xff0c;我们知道GFS在数…

2025年02月12日Github流行趋势

项目名称&#xff1a;data-formulator 项目地址url&#xff1a;https://github.com/microsoft/data-formulator 项目语言&#xff1a;TypeScript 历史star数&#xff1a;4427 今日star数&#xff1a;729 项目维护者&#xff1a;danmarshall, Chenglong-MS, apps/dependabot, mi…

【落羽的落羽 数据结构篇】双向链表

文章目录 一、链表的分类二、双向链表1. 结构2. 申请一个新节点3. 尾部插入数据4. 头部插入数据5. 尾部删除数据6. 头部删除数据7. 在指定位置之后插入数据8. 删除指定位置节点9. 销毁链表 一、链表的分类 链表的分类实际上要从这三个方向分析&#xff1a;是否带头、单向还是双…

Golang的并发编程问题解决思路

Golang的并发编程问题解决思路 一、并发编程基础 并发与并行 在计算机领域&#xff0c;“并发”和“并行”经常被混为一谈&#xff0c;但它们有着不同的含义。并发是指一段时间内执行多个任务&#xff0c;而并行是指同时执行多个任务。在 Golang 中&#xff0c;通过 goroutines…

剑指offer第2版:搜索算法(二分/DFS/BFS)

查找本质就是排除的过程&#xff0c;不外乎顺序查找、二分查找、哈希查找、二叉排序树查找、DFS/BFS查找 一、p39-JZ3 找出数组中重复的数字&#xff08;利用特性&#xff09; 数组中重复的数字_牛客题霸_牛客网 方法1&#xff1a;全部排序再进行逐个扫描找重复。 时间复杂…

在 CentOS 上更改 SSH 默认端口以提升服务器安全性

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …