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 类型的变量,该变量将用于保存队列的数据结构体。队列的任务控制块

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

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

相关文章

初学总结SpringBoot项目在mac上环境搭建和运行

mac一定要安装上homebrew,这个玩意在mac上搭建环境贼拉好用,打开终端安装国内镜像的 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"1. brew安装maven brew install maven2.修改maven国内镜像 ma…

TCP/IP参考模型和网络协议

由于国防部担心他们一些重要的主机、路由器和互联网关可能会突然崩溃,所以网络必须实现的另一目标是网络不受子网硬件损失的影响,已经建立的会话不会被取消,而且整个体系结构必须相当灵活。 TCP/IP是一组用于实现网络互连的通信协议。Interne…

网络安全 | 安全信息与事件管理(SIEM)系统的选型与实施

网络安全 | 安全信息与事件管理(SIEM)系统的选型与实施 一、前言二、SIEM 系统的功能概述2.1 数据收集与整合2.2 实时监控与威胁检测2.3 事件响应与自动化2.4 合规性管理 三、SIEM 系统选型的关键因素3.1 功能需求评估3.2 可扩展性与性能3.3 易用性与可维…

Java中的分布式(概念说明)

1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…

简单了解应用层DNS协议

DNS(Domain Name System)协议是用于将人类可读的域名(如www.example.com)转换为计算机可识别的IP地址(如192.0.2.1)的系统。 TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便人们记…

Windows 找不到文件gpedit.msc,没有组策略编辑器,解决办法附上

windows10和11都通用。是不是有人告诉你家庭版本没有gpedit.msc,没有组策略编辑器?这压根就是某软玩的小把戏。Win10/11家庭版可通过修改文件后缀新建bat脚本,添加组策略包,以管理员身份运行后,输入gpedit.msc即可打开…

“PEP 8: W292 no newline at end of file“报错 IntelliJ IDEA自动添加空行问题

"PEP 8: W292 no newline at end of file"报错 IntelliJ IDEA自动添加空行问题 在使用IntelliJ IDEA的过程中,经常会发现不管是对于代码文件或者纯文本文件,在保存时中会在文件末尾加上一个空行,提交GIT对比检查时,总是…

线性数据结构解密:数组的定义、操作与实际应用

系列文章目录 01-从零开始掌握Python数据结构:提升代码效率的必备技能! 02-算法复杂度全解析:时间与空间复杂度优化秘籍 03-线性数据结构解密:数组的定义、操作与实际应用 文章目录 系列文章目录前言一、数组的定义与特点1.1 数组…

docker-compose.yml 详细教学

目录 文件结构 版本 服务(Services) 示例 文件结构 docker-compose.yml 文件通常包含以下几部分: version:指定 Docker Compose 文件的版本。services:定义应用程序中的服务,每个服务对应一个容器。vo…

spring 学习 (注解)

目录 前言 常用的注解 须知 1 Conponent注解 demo(案例) 2 ControllerServiceRepository demo(案例) 3 ScopeLazyPostConstructPreDestroy demo(案例) 4 ValueAutowiredQualifierResource demo(案例) 5 Co…

【设计模式】【行为型模式】迭代器模式(Iterator)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…

C语言-------结构体(1)

数据类型 (1)基本数据类型 整型 浮点型 字符型 (2)构造类型 数组 结构体 结构体: 用来处理,现实生活中,更复杂的数据的描述 用来 描述复杂数据的 一种用户自定义的数…

【centos7】安装redis

rpm链接:http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 下载remi源 wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 安装remi源 rpm -ivh remi-release-7.rpm 查找remi源中redis的版本 yum --enablereporemi list redis …

获取整十分钟时间戳的多种方法详解

在数据处理、定时任务等场景中,经常需要获取当前时间的整十分钟时间戳。本文将介绍两种常用方法,并拓展其他实现思路,帮助你灵活应对不同需求。 方法一:datetime模块计算法 原理:通过截断分钟数实现时间对齐。 代码实…

AcWing 798. 差分矩阵

题目来源: 找不到页面 - AcWing 题目内容: 输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2)表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将…

【Python爬虫①】专栏开篇:夯实Python基础

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

数仓:核心概念,数仓系统(ETL,数仓分层,数仓建模),数仓建模方法(星型模型,雪花模型,星座模型)和步骤

数仓建模的核心概念 事实表(Fact Table): 存储业务过程的度量值(如销售额、订单数量等)。 通常包含外键,用于关联维度表。 维度表(Dimension Table): 存储描述性信息&…

【靶机渗透实战】AI:WEB:1

靶机下载官网AI: Web: 1 ~ VulnHub 靶机描述 Difficulty: IntermediateNetwork: DHCP (Automatically assign)Network Mode: NATThis box is designed to test skills of penetration tester. The goal is simple. Get flag from /root/flag.txt. Enumerate the box, get low…

MATLAB中contains函数用法

目录 语法 说明 示例 查找文本 使用模式进行搜索 匹配列表中的任何文本 忽略大小写 确定字符向量中是否包含子字符串 contains函数的功能是确定字符串中是否有模式。 语法 TF contains(str,pat) TF contains(str,pat,IgnoreCase,true) 说明 如果 str 包含指定的模…

【limit 1000000,10 加载很慢该怎么优化?】

在 SQL 数据库中,使用 LIMIT 子句进行分页查询时,如果偏移量(offset)很大,查询性能可能会变得非常差。 这是因为数据库需要扫描和跳过大量的记录才能到达所需的起始位置,然后再取出所需的记录数。 例如,LIMIT 1000000, 10 表示跳过前 100 万条记录,然后取接下来的 10…