嵌入式实操基于RT1170FreeRTOS实现CPU使用率统
本文主要是通过迁移的思维,记录本人初次使用NXPMCUXpressoSDKAPI进行BSP开发
本文主要描述了如何在RT1170平台下,基于FreeRTOS实现CPU使用率的统计
参考:https:www。fatalerrors。orgastatisticalanalysisofcpuutilizationinfreertossystem。html1。CPU使用率统计的原理
第一、想要实现CPU使用率统计,需要一个比系统定时中断粒度更小的中断才能实现CPU使用率的统计,这是前提条件。
第二、需要在对应的操作系统中进行注册,实现对应的接口即可。2。CPU使用率统计定时器中断实现
在本文中使用PIT2来充当这个角色。在PIT2IRQHANDLER函数中对ulCpuTraceTick进行自加。这个变量后续会使用到。includefsldebugconsole。hincludeboard。hincludefslpit。hincludepinmux。hincludeclockconfig。hincludeFreeRTOS。hincludetask。hincludestring。hexternalvariablesexternalroutineprototypesinternalroutineprototypesprojectwideglobalvariablesmodulewideglobalvariablesconstpitconfigtPIT2config{。enableRunInDebugfalse};volatileunsignedintulCpuTraceTick0;constantsmacrosGetsourceclockforPITdriverdefinePITSOURCECLOCKCLOCKGetRootClockFreq(kCLOCKRootBus)DefinitionsforBOARDInitPeripheralPIT2Ch0functionalgroupBOARDInitPeripheralPIT2Ch0definesforPIT2DefinitionofperipheralID。definePIT2PERIPHERALPIT2Definitionofclocksourcefrequency。definePIT2CLKFREQ240000000ULDefinitionofchannelnumberforchannel0。definePIT2CHANNEL0kPITChnl0Definitionoftickscountforchannel0。definePIT2CHANNEL0TICKS2399999UdefinePIT2CHANNEL0TICKS1199999UPIT2interruptvectorID(number)。definePIT2IRQNPIT2IRQnPIT2interrupthandleridentifier。definePIT2IRQHANDLERPIT2IRQHandlerroutinesimplementationsPIT2IRQninterrupthandlervoidPIT2IRQHANDLER(void){PlaceyourcodehereClearinterruptflag。PITClearStatusFlags(PIT2PERIPHERAL,PIT2CHANNEL0,kPITTimerFlag);ulCpuTraceTick;AddforARMerrata838869,affectsCortexM4,CortexM4FStoreimmediateoverlappingexceptionreturnoperationmightvectortoincorrectinterrupt。ifdefinedCORTEXM(CORTEXM4U)DSB();endif}voidPIT2init(void){InitializethePIT。PITInit(PIT2PERIPHERAL,PIT2config);Setchannel0periodto1s(240000000ticks)。PITSetTimerPeriod(PIT2PERIPHERAL,PIT2CHANNEL0,PIT2CHANNEL0TICKS);Enableinterruptsfromchannel0。PITEnableInterrupts(PIT2PERIPHERAL,PIT2CHANNEL0,kPITTimerInterruptEnable);EnableinterruptPIT2IRQNrequestintheNVICEnableIRQ(PIT2IRQN);Startchannel0。PITStartTimer(PIT2PERIPHERAL,PIT2CHANNEL0);}3。操作系统接口注册
在FreeRTOSConfig。h做如下配置Runtimeandtaskstatsgatheringrelateddefinitions。defineconfigGENERATERUNTIMESTATS0defineconfigGENERATERUNTIMESTATS1defineconfigUSETRACEFACILITY1defineconfigUSESTATSFORMATTINGFUNCTIONS1externvolatileunsignedintulCpuTraceTick;defineportCONFIGURETIMERFORRUNTIMESTATS()(ulCpuTraceTick0ul)defineportGETRUNTIMECOUNTERVALUE()ulCpuTraceTick
编译函数接口打印CPU使用率:uint8tCPURunInfo〔400〕;保存任务运行时间信息refhttps:www。jianshu。compcc4b948c7741voidCPUTask(voidparameter){PRINTF(CPUTaskr);while(1){memset(CPURunInfo,0,400);信息缓冲区清零vTaskList((char)CPURunInfo);获取任务运行时间信息PRINTF(r);PRINTF(任务名任务状态优先级剩余栈任务序号r);PRINTF(s,CPURunInfo);PRINTF(r);memset(CPURunInfo,0,400);信息缓冲区清零vTaskGetRunTimeStats((char)CPURunInfo);PRINTF(任务名运行计数利用率r);PRINTF(s,CPURunInfo);PRINTF(r);vTaskDelay(1000);延时500个tickPRINTF(CPUTaskr);}}4。验证
通过创建任务实现CPU使用率的统计:externvoidCPUTask(voidparameter);statxTaskCreate(CPUTask,CpuTask,configMINIMALSTACKSIZE5000,NULL,tskIDLEPRIORITY1,NULL);if(pdPASS!stat){PRINTF(Failedtocreateawtktask);while(1);}
实际效果如下所示:任务名任务状态优先级剩余栈任务序号CpuTaskX150162TestTaskR1119521IDLER0794bspcantB2120693TmrSvcB171535任务名运行计数利用率TestTask185697CpuTask402IDLE01bspcant01TmrSvc01任务名任务状态优先级剩余栈任务序号CpuTaskX150082TestTaskR1119521IDLER0794bspcantB2120693TmrSvcB171535任务名运行计数利用率TestTask208899CpuTask482IDLE01bspcant01TmrSvc01任务名任务状态优先级剩余栈任务序号CpuTaskX150082TestTaskR1119521IDLER0794bspcantB2120693TmrSvcB171535任务名运行计数利用率TestTask2320100CpuTask532IDLE01bspcant01TmrSvc014。总结
开启CPU使用率统计存在如下两个问题:
第一:最大统计时间。
第二:占用CPU资源。
欢迎订阅
嵌入式实操是一个分享开发实践经验的地方。
文章会同时发布到我的CSDN主页(嵌入式实操的博客CSDN博客06Am335x,01RT1052Aworks开发,05RT1170开发领域博主)、今日头条号平台上。