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

使用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.mfbz.cn/a/665153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

清风雅致·林曦老师的中国画美育直播课 你想了解的都在这里

大家期待已久的《清风雅致林曦老师的中国画美育直播课》开启报名啦~这个夏天,林曦老师将带你画完十幅重要的册页图,明代杜琼的《南村别墅图》。在此期间,暄桐教室除了收到了大家的“心心念念”和“满怀期待”,还有一连串“小问号”…

QT软件界面的设计与启动方法

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、Q T界面设计的重要性 二、QT软件的启动与配置 三、QT软件的启动路径设置 四、QT软件启…

[Redis]List类型

列表类型来存储多个有序的字符串,a、b、c、d、e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素,一个列表最多可以存储个元素。在 Redis 中,可以对列表两端插入(push)和弹出&#xff08…

SRS介绍及环境搭建

1.SRS简介 SRS(Simple Real-Time Media Server)是一个开源的流媒体服务器,它支持多种流媒体协议,包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等57。SRS主要应用于直播、视频会议等场景,提供实时音视频服…

Java—认识异常

1. 异常的概念与体系结构 1.1 异常的概念 在生活中,一个人表情痛苦,出于关心,可能会问:你是不是生病了,需要我陪你去看医生吗? 在程序中也是一样,程序猿是一帮办事严谨、追求完美的高科技人才…

数据结构排序算法之直接插入排序与希尔排序【图文详解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

光环云携手火山引擎共推全栈AI服务,赋能千行百业智能化转型,助力新质生产力发展

5月15日,2024春季火山引擎FORCE原动力大会在北京举办。作为智算云网综合服务提供商,光环云受邀出席大会,与火山引擎共同探索大模型时代下行业发展的新趋势。 会上,光环云数据有限公司正式与火山引擎签署生态伙伴合作协议&#xf…

JAVA应用服务器如何快速定位CPU问题

如果服务器上部署了多个Java站点服务和Java微服务,并且突然接收到CPU异常告警,我们需要逐步确定是哪个服务进程造成了CPU过载,接着是哪个线程,并最终定位到是哪段代码导致了这个问题 简要步骤如下: 步骤一、找到最耗C…

汇编概论和实践

一 汇编第一例 C代码 #include <stdio.h>int main() {printf("Hello, World!\n");return 0; }对应的汇编 .LC0:.string "Hello, World!"main:pushq %rbpmovq %rsp, %rbpleaq .LC0(%rip), %rdicall puts@PLTmovl $0, %eaxpopq %rbpret 二 CPU架构…

Android 车载 Audio 中 有关系统按键无声的问题排查小结

本文简单记录一下&#xff0c;车载中系统按键音的问题排查从 App --> FrameWork --> HAL层 的问题排查。 通过日志分析&#xff1a; AudioStreamOutSink 这个有数据写入到 HAL 中&#xff08;方式一&#xff09; 查看 dump 文件。&#xff08;方式二&#xff09; 先 …

C++语言·list链表(下)

还是之前说的&#xff0c;因为要写模板&#xff0c;为了避免链接出现问题&#xff0c;我们将所有内容都写到一个文件中去。首先就是画出链表的框架 链表本身只需要一个头节点就足以找到整条链表&#xff0c;而需要它拼接的节点我们再写一个模板。而我们知道list是一个带头双向循…

[深度学习]yolov10+bytetrack+pyqt5实现目标追踪

【简介】 利用YOLOv10、ByteTrack和PyQt5实现目标追踪是一个强大的组合&#xff0c;可以为用户提供一个交互式的实时目标追踪界面。以下是一个简化版的实现思路描述&#xff1a; 首先&#xff0c;YOLOv10是一个先进的目标检测算法&#xff0c;能够准确识别视频或图像中的目标…

【自然语言处理】Transformer中的一种线性特征

相关博客 【自然语言处理】【大模型】语言模型物理学 第3.3部分&#xff1a;知识容量Scaling Laws 【自然语言处理】Transformer中的一种线性特征 【自然语言处理】【大模型】DeepSeek-V2论文解析 【自然语言处理】【大模型】BitNet&#xff1a;用1-bit Transformer训练LLM 【自…

STM32学习和实践笔记(32):电容触摸按键实验

1.电容触摸按键原理介绍 触摸按键与传统的机械按键相比&#xff0c;不仅美观而且耐用、寿命长&#xff0c;它颠覆了传统意义上的机械按键控制&#xff0c;只要轻轻触摸&#xff0c;就可以实现按键开关的控制、量化调节甚至方向控制。触摸按键已广泛应用于手机、DVD、洗衣机等消…

使用Prompt,轻松实现你的第一个全栈项目

前言 还有程序员没有应用过大模型技术吗&#xff1f;是工具也可以&#xff01;如果你还未使用过大模型技术&#xff0c;那么我劝你尽早行动&#xff0c;它会成为你开发的一大神器。如果你对大模型感兴趣&#xff0c;同时想使用大模型技术来开发产品&#xff0c;我接下来这个实…

【JavaEE】JVM中内存区域划分和类加载机制详解

一.初步了解JVM的基本 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。是运行Java代码的核心部分&#xff0c;主要负责将Java字节码翻译为机器语言&#xff0c;并且提供了运行时的环境。JVM作为Java平台的一部分&#xff0c;隐藏了操作系统和硬件的差异性&am…

《SpringBoot3+Vue3实战》系列文章目录

前后端分离&#xff08;Frontend-Backend Separation&#xff09;是一种软件架构设计模式&#xff0c;它将传统的Web应用中的前端&#xff08;用户界面&#xff09;和后端&#xff08;服务器逻辑和数据存储&#xff09;从应用层面进行解耦&#xff0c;使得两者可以独立地开发、…

HTTP --tcp

TCP TCP连接 tcp/ip是全球计算机以及网络设备都在使用的一种常见的分组交换网络分层协议集&#xff0c;客户端可以打开一条tcp/ip连接&#xff0c;连接到可能运行在世界各地的服务器应用程序&#xff0c;一旦连接建立起来了&#xff0c;在客户端和服务器的计算机之间交换的报…

部署Envoy

Envoy常用术语 envoy文档官网 Life of a Request — envoy 1.31.0-dev-e543e1 documentationhttps://www.envoyproxy.io/docs/envoy/latest/intro/life_of_a_request#terminology 基础总结 &#xff08;1&#xff09;Envoy Envoy自己本身是工作在L7层的一个proxy&#xff…

知了汇智携手川农大,为计算机学子打造实战型综合项目实训

随着数字化产业的迅猛发展和产业数字化转型的不断深入&#xff0c;产业对数字人才的需求也在发生变化。为了培养适应市场需求的高素质应用型人才&#xff0c;5月24日&#xff0c;知了汇智携手四川农业大学&#xff0c;为信息工程学院计算机科学与技术专业22级学子带来一场兼具实…