用任务监听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.mzph.cn/pingmian/19814.shtml

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

相关文章

两整数之和 ---- 位运算

题目链接 题目: 分析: 题目中要求不能使用-, 考虑到我们的位运算异或^, 是无进位加法, 可以使用如果是无进位加法, 那么我们就要找到进位, 并进行计算, 进位只有1和1相加时才会产生进位1, 而0和1相加无进位, 进位为0, 那么我们就想到了&运算, 1&1 1, 0&1 0, 所…

07-操作元素(键盘和鼠标事件)

在前面的文章中重点介绍了一些元素的定位方法,定位到元素后,就需要操作元素了。本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件。 一、简单操作 点击按钮(鼠标左键):click()清空输入框&…

基础—SQL—DQL(数据查询语言)排序查询

一、引言 排序查询这里面涉及的关键字:ORDER BY。在我们日常的开发中,这个是很常见的,比如打开一个网购的商城,这里面可以找到一个销量的排序、综合的排序、价格的排序(升序、降序)等等。接下来就学习这一部…

mac电脑用谷歌浏览器对安卓手机H5页面进行inspect

1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑:使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面,点击inspect,就能像谷歌浏览器页面打开下面的页面&#…

​​​​​​​Beyond Compare 3密钥被撤销的解决办法

首先,BCompare3的链接如下 链接:https://pan.baidu.com/s/1vuSxY0cVQCt0-8CpFzUhvg 提取码:8888 --来自百度网盘超级会员V7的分享 1.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告,而且该工具无法使用&#xff…

命令模式(行为型)

目录 一、前言 二、命令模式 三、总结 一、前言 命令模式(Command Pattern)是一种行为型设计模式,命令模式将一个请求封装为一个对象,从而可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以…

小角楼是怎样成为清廷御酒的?

执笔 | 扬 灵 编辑 | 古利特 “酒史千年远,酒花百代香,天府多佳酿,美酒驻平昌。” 对四川省巴中市平昌县而言,白酒是经济发展的重要产业之一,好山好水出好酒,优良的地质、水源、气候、土壤等条件以及悠久…

算法(十一)贪婪算法

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

无忧易售ERP:解锁TikTok平台订单处理新效能,赋能跨境电商新未来

在这个全球化电商飞速发展的时代,TikTok作为新兴的电商蓝海,正吸引着无数商家的目光。然而,如何在竞争激烈的市场中脱颖而出,高效管理订单,提升顾客体验,成为每个商家必须面对的课题。无忧易售ERP&#xff…

NSS题目练习5

[NISACTF 2022]babyupload 打开后尝试上传php,jpg,png文件都没成功 查看源代码发现有个/source文件 访问后下载压缩包发现有一个python文件 搜索后知道大致意思是,上传的文件不能有后缀名,上传后生成一个uuid,并将uuid…

基于深度学习的模糊认知图方法

1 文章信息 文章题目为“Deep Fuzzy Cognitive Maps for Interpretable Multivariate Time Series Prediction”,该文于2019年发表于“IEEE TRANSACTIONS ON FUZZY SYSTEMS”。文章提出了深度模糊认知图(FCM)用于多变量时间序列预测&#xff…

19.Redis之集群

1.集群的基本介绍 集群 这个词.广义的集群,只要你是多个机器,构成了分布式系统, 都可以称为是一个"集群"前面主从结构,哨兵模式,也可以称为是"广义的集群”狭义的集群,redis 提供的集群模式, 这个集群模式之下,主要是要解决,存储空间不足的问题(拓展存储空间) …

科普健康短视频:成都鼎茂宏升文化传媒公司

科普健康短视频:引领健康知识新潮流 在数字化时代的浪潮中,短视频以其短小精悍、直观易懂的特点,迅速成为大众获取信息的重要渠道。其中,科普健康短视频更是凭借其科学、权威、实用的内容,吸引了大量关注健康的观众。…

Linux —— MySQL操作(1)

一、用户与权限管理 1.1 创建与赋予权限 create user peter% identified by 123465 # 创建用户 peter,# %:允许所有用户登录这个用户访问数据库 刚创建的新用户是什么权限都没有,需要赋予权限 grant select on mysql.* to peter%; # 赋予…

什么是数据资产管理?数据资产管理包括了哪些内容?

数据资产管理包括数据模型管理、数据标准管理、数据质量管理等 10 个活动职能,覆盖数据资源化、数据资产化两个阶段。本章参考 PDCA 方法,从计划、执行、检查、改进四个环节着手,阐述数据资产管理活动职能的核心理念与实践要点。 一、数据模型…

使用Python操作Git

大家好,当谈及版本控制系统时,Git是最为广泛使用的一种,而Python作为一门多用途的编程语言,在处理Git仓库时也展现了其强大的能力。通过Python,我们可以轻松地与Git仓库进行交互,执行各种操作,从…

2024全新交友盲盒+付费进群二合一源码 包含全套源码+视频教程

2024全新交友盲盒付费进群二合一源码 包含全套源码视频教程39同校 三九同校 最高版本,纸条,交友,源码,搭建包上线运营,防封红,独家唯一版本盲盒交友脱单系统源码,带教程,免授权这套源…

Golang | Leetcode Golang题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; func getRow(rowIndex int) []int {row : make([]int, rowIndex1)row[0] 1for i : 1; i < rowIndex; i {row[i] row[i-1] * (rowIndex - i 1) / i}return row }

分布式任务队列系统 celery 原理及入门

基本 Celery 是一个简单、灵活且可靠的分布式任务队列系统&#xff0c;用于在后台执行异步任务处理大量消息。支持任务调度、任务分发和结果存储&#xff0c;并且可以与消息代理&#xff08;如 RabbitMQ、Redis 等&#xff09;一起工作&#xff0c;以实现任务的队列管理和执行…

[Linux系统编程]文件IO

一.系统调用 什么是系统调用? 只有系统调用(系统函数)才能进入内核空间&#xff0c;库函数也是调用系统函数&#xff0c;才得以访问底层。 系统调用由操作系统实现并提供给外部应用程序的编程接口。是应用程序同系统之间数据交互的桥梁。 换句话说&#xff0c;系统调用就是操…