用任务监听RTOS各任务的运行状态

news2025/1/23 9:24:25

使用rtos时内存对于单片机来说总是非常抠搜的。

任务分配多了浪费,少了跑不动。

最近看到这个监听任务还是很好用的。

废话不多说。开始操作

第一步在配置文件中打开这几个宏

#define configUSE_TRACE_FACILITY  1   /*为1时启用可视化跟踪调试*/
#define configUSE_STATS_FORMATTING_FUNCTIONS  1  
/* configUSE_TRACE_FACILITY和 configUSE_STATS_FORMATTING_FUNCTIONS都设置为 1,则再构建中包含编译  vTaskList()和 vTaskGetRunTimeStats()函数;*/ 
#define configGENERATE_RUN_TIME_STATS   1 //为1时打开运行时间统计功能

第二步 定义一下几个宏

extern volatile unsigned long long FreeRTOSRunTimeTicks;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()  ConfigureTimerForRunTimeStats()
/*用来初始化任务运行时间信息统计功能的时间基准,时间基准一般由定时器来提供,并且要求此基准的精度是系统节拍精度的10倍以上*/
#define portGET_RUN_TIME_COUNTER_VALUE()  FreeRTOSRunTimeTicks
/*用来获取统计任务运行时间信息的计数器值,利用此计数值来计算各任务运行时间的占空比*/

FreeRTOSRunTimeTicks

ConfigureTimerForRunTimeStats()

这个两没有别急

然后开个定时器

/*
*函数名称;Timer2_Init
*功能描述:初始化定时器2,并打开定时中断
*传入参数:ARR-计数周期
*         RSC-预分频器值
*/
void Timer2_Init(uint16_t ARR,uint16_t RSC)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	TIM_InternalClockConfig(TIM2);/*开启内部时钟*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*不分频*/
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;/*向上计数*/
	TIM_TimeBaseInitStructure.TIM_Period = ARR;//ARR-计数周期
	TIM_TimeBaseInitStructure.TIM_Prescaler = ARR;//PSC-预分频数
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; /*重复计数器*/
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断使能
//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; /*设置要配置的中断通道为 TIM2 的中断通道。*/
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*使能中断通道*/
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;/*抢占优先级*/
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;/*响应优先级*/
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);/*开启定时器*/
}

刚才那两个就来了

时钟节拍自己定 我用的时128MHZ的。

将节拍计数值归零,并调用定时器初始化函数,
          在这里进中断的频率为128 000 000 /128/50 = 20KHZ,
          满足基准的精度是系统节拍精度的10倍以上的要求

/*
*函数名称:ConfigureTimerForRunTimeStats
*功能描述:将节拍计数值归零,并调用定时器初始化函数,
          在这里进中断的频率为128 000 000 /128/50 = 20KHZ,
          满足基准的精度是系统节拍精度的10倍以上的要求
*/
volatile unsigned long long FreeRTOSRunTimeTicks = 0;
//用来获取统计任务运行时间信息的计数器值
void ConfigureTimerForRunTimeStats(void)
{
	FreeRTOSRunTimeTicks = 0;
	Timer2_Init(50-1,128-1);
}


void TIM2_IRQHandler(void)
{
	if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)==SET)/*检查TIM2的更新事件标志位*/
	{
		FreeRTOSRunTimeTicks++;/*节拍计数值++*/
		TIM_ClearFlag(TIM2,TIM_FLAG_Update);/*清除更新事件标志位*/
	}
}

然后加个监听任务

主要就是获取相关信息然后用串口啥的输出到你能看到的地方

/*定义一个打印任务信息的任务*/
void Cpu_task(void   *argument)
{
    uint8_t CPU_RunInfo[512];

    while (1)
    {
        memset(CPU_RunInfo, 0, 512);
        vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息
        DEBUG_MSG("---------------------------------------------\r\n");
        DEBUG_MSG("任务名       任务状态   优先级  剩余栈  任务序号\r\n");
        sprintf((char *)rcv_buff2, "%s\n", CPU_RunInfo);
        DEBUG_MSG((char *)rcv_buff2);

        DEBUG_MSG("---------------------------------------------\r\n");
        memset(CPU_RunInfo, 0, 512);
        vTaskGetRunTimeStats((char *)&CPU_RunInfo);
        DEBUG_MSG("任务名          运行计数       使用率\r\n");
        sprintf((char *)rcv_buff2, "%s\n", CPU_RunInfo);
        DEBUG_MSG((char *)rcv_buff2);
        DEBUG_MSG("---------------------------------------------\r\n\n");
        vTaskDelay(5000); /* 延时5000个tick */

    }
}

来看看效果,

舒服多了,完美。

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

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

相关文章

VBA代码解决方案第十四讲 如何利用VBA检查单元格中是否含有公式

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

[论文笔记]MemGPT: Towards LLMs as Operating Systems

引言 今天介绍一篇论文MemGPT: Towards LLMs as Operating Systems。翻过过来就是把LLM看成操作系统。 大语言模型已经在人工智能领域引起了革命性的变革,但受到有限上下文窗口的限制,在扩展对话和文档分析等任务中的效用受到了阻碍。为了能够利用超出…

短视频自己怎么配音:四川京之华锦信息技术公司

短视频自己怎么配音:揭秘配音技巧与创作流程 在短视频盛行的当下,配音作为提升视频质量、增强观众体验的重要环节,越来越受到创作者的关注。四川京之华锦信息技术公司将为您详细解读如何为短视频自己配音,包括配音技巧、创作流程…

echarts学习:将echats实例代理为响应式对象可能带来的风险

1.起源 最近我在学习如何封装echarts组件,我所参考的其中一篇博客中提到了一个“图表无法显示的问题”。 根据其中的介绍,造成此种问题的原因是因为,使用ref接受了echarts实例,使得echarts实例被代理为了响应式对象,进…

【移动端】商场项目路由设计

1:路由设计配置: 一级路由配置 分析项目,设计路由,配置一级路由 一级路由:单个页面独立展示的,都是一级路由,例如:登录页面,首页架子,报错页面 二级路由&…

特征工程技巧——OneHot编码

我们以Kaggle比赛里面的一个数据集跟一个公开代码为例去解释我们的OneHot编码。 简单来说,独热编码是一种将类别型变量转换为二进制表示的方法,其中每个类别被表示为一个向量,向量的长度等于类别的数量,其中只有一个元素为1&…

STM32使用ST-LINK下载程序中需要注意的几点

使用keil5的ST-link下载界面 前提是ST-LINK已经连接好,(下图中是没有连接ST-link设备),只是为了展示如何查看STlink设备是否连接的方式 下载前一定设置下载完成后自启动 这个虽然不是必须,但对立即看到新程序的现象…

基于Chisel语言的FPGA流水灯程序

目录 一、 内容概要二、 Chisel介绍三、 Chisel的使用四、 流水灯实现五、 心得体会六、 参考链接 一、 内容概要 Chisel介绍Chisel使用流程Chisel流水灯实操 二、 Chisel介绍 Chisel 是一种构建硬件描述语言(HDL)的高级编程语言,它允许硬…

2020年CSP-J入门级第一轮初赛真题

一、选择题 在内存储器中每个存储单元都被赋予一个唯一的序号,称为()。 A.地址 B. 序号 C. 下标 D. 编号 答案:A. 地址 在内存储器中,每个存储单元都有一个唯一的标识,用于区分和访问不同的存储单元。这个唯…

Day10:平面转换、渐变色

目标:使用位移、缩放、旋转、渐变效果丰富网页元素的呈现方式。 一、平面转换 1、简介 作用:为元素添加动态效果,一般与过渡配合使用。 概念:改变盒子在平面内的形态(位移、旋转、缩放、倾斜)。 平面转换…

C语言(字符和字符串函数)2

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

今日分享丨按场景定制界面

遇到问题 我们在写文档或者代码时,会遇到需要书写重复或者类似内容的情况。快捷的做法是:先复制粘贴此相似内容,再修改差异。那么开发人员在设计界面的时候,也会遇到同类型的界面有重复的特性,比如报销类型的单据&…

PostgreSQL常用插件

PostgreSQL 拥有许多常用插件,这些插件可以大大增强其功能和性能。以下是一些常用的 PostgreSQL 插件: 性能监控和优化 pg_stat_statements 1.提供对所有 SQL 语句执行情况的统计信息。对调优和监控非常有用。 2.安装和使用: pg_stat_k…

picoLLM:大模型的量化魔术师 上

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模…

数字孪生在气象灾害防治中的重要贡献

数字孪生技术在气象灾害防治中正发挥着越来越重要的作用。数字孪生是指通过数字化方式在虚拟空间中构建与现实世界对应的虚拟模型,通过实时数据和模拟技术进行动态映射和交互。利用数字孪生技术,气象部门可以更高效、更精准地监测、预测和应对气象灾害&a…

四川景源畅信:抖音开店怎么做好运营?

在数字化时代的浪潮中,抖音作为一个流量巨大的社交平台,为许多商家提供了展示和销售产品的新舞台。但在这个充满竞争的平台上,如何做好店铺运营,吸引并留住顾客,成为了许多商家面临的挑战。接下来的内容将围绕如何在抖…

我与C++的爱恋:vector的使用

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 ​ 文章目录 一、vector的简单介绍二、vector的使用构造函数遍历容器对容器的操作vector 的增删查改 一、vector的简单介绍 vector是表示可变大小数组的序列容器 就像数组…

去噪扩散概率模型在现代技术中的应用:图像生成、音频处理到药物发现

去噪扩散概率模型(DDPMs)是一种先进的生成模型,它通过模拟数据的噪声化和去噪过程,展现出多方面的优势。DDPMs能够生成高质量的数据样本,这在图像合成、音频生成等领域尤为重要。它们在数据去噪方面表现出色&#xff0…

打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

文章目录 1. 前言2. memmove()函数2.1 memmove()函数与memcpy()函数的差异2.2 memmove()函数的原型2.3 memmove()函数的使用案例 3. memmove()函数的模拟实现4. 总结 1. 前言 在之前,我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话&#…

算法(十一)贪婪算法

文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断&#xff0c…