嵌入式实操基于RT1170FreeRTOS实现CPU使用率统计(二十四)
本文主要是通过迁移的思维,记录本人初次使用NXP MCUXpresso SDK API进行BSP开发
本文主要描述了如何在RT1170平台下,基于FreeRTOS实现CPU使用率的统计
参考:https://www.fatalerrors.org/a/statistical-analysis-of-cpu-utilization-in-freertos-system.html 1. CPU使用率统计的原理
第一、想要实现CPU使用率统计,需要一个比系统定时中断粒度更小的中断才能实现CPU使用率的统计,这是前提条件。
第二、需要在对应的操作系统中进行注册,实现对应的接口即可。 2. CPU使用率统计定时器中断实现
在本文中使用PIT2来充当这个角色。在PIT2_IRQHANDLER函数中对ulCpuTraceTick进行自加。这个变量后续会使用到。 #include "fsl_debug_console.h" #include "board.h" #include "fsl_pit.h" #include "pin_mux.h" #include "clock_config.h" #include "FreeRTOS.h" #include "task.h" #include "string.h" /*----------------------------------------------* * external variables * *----------------------------------------------*/ /*----------------------------------------------* * external routine prototypes * *----------------------------------------------*/ /*----------------------------------------------* * internal routine prototypes * *----------------------------------------------*/ /*----------------------------------------------* * project-wide global variables * *----------------------------------------------*/ /*----------------------------------------------* * module-wide global variables * *----------------------------------------------*/ const pit_config_t PIT2_config = { .enableRunInDebug = false }; volatile unsigned int ulCpuTraceTick = 0; /*----------------------------------------------* * constants * *----------------------------------------------*/ /*----------------------------------------------* * macros * *----------------------------------------------*/ /* Get source clock for PIT driver */ #define PIT_SOURCE_CLOCK CLOCK_GetRootClockFreq(kCLOCK_Root_Bus) /* Definitions for BOARD_InitPeripheral_PIT2_Ch_0 functional group */ /* BOARD_InitPeripheral_PIT2_Ch_0 defines for PIT2 */ /* Definition of peripheral ID. */ #define PIT2_PERIPHERAL PIT2 /* Definition of clock source frequency. */ #define PIT2_CLK_FREQ 240000000UL /* Definition of channel number for channel 0. */ #define PIT2_CHANNEL_0 kPIT_Chnl_0 /* Definition of ticks count for channel 0. */ //#define PIT2_CHANNEL_0_TICKS 2399999U #define PIT2_CHANNEL_0_TICKS 1199999U /* PIT2 interrupt vector ID (number). */ #define PIT2_IRQN PIT2_IRQn /* PIT2 interrupt handler identifier. */ #define PIT2_IRQHANDLER PIT2_IRQHandler /*----------------------------------------------* * routines" implementations * *----------------------------------------------*/ /* PIT2_IRQn interrupt handler */ void PIT2_IRQHANDLER(void) { /* Place your code here */ /* Clear interrupt flag.*/ PIT_ClearStatusFlags(PIT2_PERIPHERAL, PIT2_CHANNEL_0, kPIT_TimerFlag); ulCpuTraceTick++; /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt. */ #if defined __CORTEX_M && (__CORTEX_M == 4U) __DSB(); #endif } void PIT2_init(void) { /* Initialize the PIT. */ PIT_Init(PIT2_PERIPHERAL, &PIT2_config); /* Set channel 0 period to 1 s (240000000 ticks). */ PIT_SetTimerPeriod(PIT2_PERIPHERAL, PIT2_CHANNEL_0, PIT2_CHANNEL_0_TICKS); /* Enable interrupts from channel 0. */ PIT_EnableInterrupts(PIT2_PERIPHERAL, PIT2_CHANNEL_0, kPIT_TimerInterruptEnable); /* Enable interrupt PIT2_IRQN request in the NVIC */ EnableIRQ(PIT2_IRQN); /* Start channel 0. */ PIT_StartTimer(PIT2_PERIPHERAL, PIT2_CHANNEL_0); } 3. 操作系统接口注册
在FreeRTOSConfig.h做如下配置 /* Run time and task stats gathering related definitions. */ -#define configGENERATE_RUN_TIME_STATS 0 +#define configGENERATE_RUN_TIME_STATS 1 #define configUSE_TRACE_FACILITY 1 #define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +extern volatile unsigned int ulCpuTraceTick; + +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() (ulCpuTraceTick = 0ul) +#define portGET_RUN_TIME_COUNTER_VALUE() ulCpuTraceTick
编译函数接口打印CPU使用率: uint8_t CPU_RunInfo[400]; //保存任务运行时间信息 //ref https://www.jianshu.com/p/cc4b948c7741 void CPU_Task(void* parameter) { PRINTF("CPU_Task r "); while (1) { memset(CPU_RunInfo,0,400); //信息缓冲区清零 vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息 PRINTF("---------------------------------------------r "); PRINTF("任务名 任务状态 优先级 剩余栈 任务序号r "); PRINTF("%s", CPU_RunInfo); PRINTF("---------------------------------------------r "); memset(CPU_RunInfo,0,400); //信息缓冲区清零 vTaskGetRunTimeStats((char *)&CPU_RunInfo); PRINTF("任务名 运行计数 利用率r "); PRINTF("%s", CPU_RunInfo); PRINTF("---------------------------------------------r "); vTaskDelay(1000); /* 延时500个tick */ // PRINTF("CPU_Task r "); } } 4. 验证
通过创建任务实现CPU使用率的统计: extern void CPU_Task(void* parameter); stat = xTaskCreate(CPU_Task, "CpuTask", configMINIMAL_STACK_SIZE + 5000, NULL, tskIDLE_PRIORITY + 1, NULL); if (pdPASS != stat) { PRINTF("Failed to create awtk task"); while (1) ; }
实际效果如下所示: --------------------------------------------- 任务名 任务状态 优先级 剩余栈 任务序号 CpuTask X 1 5016 2 TestTask R 1 11952 1 IDLE R 0 79 4 bsp_can_t B 2 12069 3 Tmr Svc B 17 153 5 --------------------------------------------- 任务名 运行计数 利用率 TestTask 1856 97% CpuTask 40 2% IDLE 0 <1% bsp_can_t 0 <1% Tmr Svc 0 <1% --------------------------------------------- --------------------------------------------- 任务名 任务状态 优先级 剩余栈 任务序号 CpuTask X 1 5008 2 TestTask R 1 11952 1 IDLE R 0 79 4 bsp_can_t B 2 12069 3 Tmr Svc B 17 153 5 --------------------------------------------- 任务名 运行计数 利用率 TestTask 2088 99% CpuTask 48 2% IDLE 0 <1% bsp_can_t 0 <1% Tmr Svc 0 <1% --------------------------------------------- --------------------------------------------- 任务名 任务状态 优先级 剩余栈 任务序号 CpuTask X 1 5008 2 TestTask R 1 11952 1 IDLE R 0 79 4 bsp_can_t B 2 12069 3 Tmr Svc B 17 153 5 --------------------------------------------- 任务名 运行计数 利用率 TestTask 2320 100% CpuTask 53 2% IDLE 0 <1% bsp_can_t 0 <1% Tmr Svc 0 <1% --------------------------------------------- 4. 总结
开启CPU使用率统计存在如下两个问题:
第一: 最大统计时间。
第二: 占用CPU资源。
欢迎订阅
" 嵌入式实操 "是一个分享开发实践经验的地方。
文章会同时发布到我的 CSDN主页(嵌入式实操的博客_CSDN博客-06--Am335x,01--RT1052 Aworks 开发,05-RT1170 开发领域博主)、 今日头条号平台上。
明天,我将退休明天,就要退休了。轻轻地擦拭着电脑,默默地和朝夕相处的伙伴告别。拿起新毛巾,最后一次拂过椅桌,拭去生活的烙印,留下无言的诉说。背上双肩包,悄悄地走了,谢绝送行的美酒泪涌的分别。静静
该怎样形容如今的社会呢?如今的社会1英雄让美女废了2美女让大款废了3帅哥让富婆废了4婚姻让小三废了5孩子让手机废了6梦想让现实废了7青春让工作废了8QQ成了摆设9微信成了支付10电话为了收快递11短信为了
这座18线海滨老城,比三亚安静!更是国内宜居城市Top1中华民族长子山东,是中国果蔬种植大省,几乎供养了半个中国,这里的蔬菜水果水产品,产量均居全国第一。这里还坐拥中国16的最美海岸线,有中国最美海滨城市,中国最美海岛最美的海滩。山东就
海关总署今年前10个月我国进出口同比增长9。5央视新闻客户端海关总署今天(7日)公布,今年前10个月,我国外贸进出口总值34。62万亿元,同比增长9。5,外贸继续保持平稳运行。海关统计显示,今年前10个月,我国外贸进出口总值3
我国新能源汽车具备国际竞争力来源经济日报发展新能源汽车是我国从汽车大国迈向汽车强国的必由之路,是应对气候变化推动绿色发展的战略举措。2020年11月,国务院办公厅印发新能源汽车产业发展规划(20212035年
可重复使用试验航天器公开,我国也有航天飞机,真要搞太空旅游?2020年9月4日和2022年8月5日,我国曾两次成功发射可重复使用试验航天器,特别是8月5日发射的那架,至今还在太空,已经在轨飞行3个月了,可以媲美美国X37B。而该可重复使用试
我国成功发射中星19号卫星11月5日19时50分,我国在西昌卫星发射中心成功将中星19号卫星发射升空,卫星顺利进入预定轨道,发射任务获得圆满成功。ChinasendstheChinaSat19satelli
食品调理疾病?中冠健康公司旗下中冠肽虚假宣传运营模式涉嫌传销文章来源投融新资讯,版权归原作者,如有侵权,联系删除,转载请注明出处,特此鸣谢!投融新资讯消息近几年来,大健康产业异军突起,越来越多的健康产品开始步入市场,与小分子肽相关的产品开始
看到问题的本质,就是真相教父里面有这样一句话半秒钟看清事物本质和一辈子都看不清本质的人,命运注定会是不同的。教父曾经教导爱子,永远不要让别人知道你在想什么。当你能看透别人的思绪,别人对你却无法参透时,你就
人生在世,心随运缘,青丝一晃到白头,泣血求名利,何必?人生在世,心随运缘,青丝一晃到白头,泣血求利蒙心求名,何必?悟(二)人间船头迎风逆流上,扬帆无用帮倒忙。白发扶犁惜耕牛,鞭打老驴是少年。钱丰子孙多不贤,贫家儿郎尽孝难。石崇斗法满门
青春,当以奋进为底色来源人民网观点频道青年之文明,奋斗之文明,也与境遇奋斗,与时代奋斗。故青年者,人生之玉,人生之春,人生之华也。在最宝贵的年华里,乘风破浪,披荆斩棘,朝着心中之所想所向所梦奋勇启航,