ZYNQ使用Freertos的CPU利用率统计

mac2024-07-28  71

硬件:ZYNQ-7000 开发环境:XILINX SDK CPU0:linux CPU1:freertos 以下是调试freertos时的调试笔记,20191031。

正常情况下,FREERTOS具有CPU利用率统计功能。配置步骤如下: ① 自 定 义 配 置 一 下 ,首 先 在 FreeRTOSConfig.h 配置与系统运行时间和任务状态收集有关的 配置选项,并且实现 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() 与portGET_RUN_TIME_COUNTER_VALUE()这两个宏定义。 ② 使用一个硬件定时器,其中断频率为FREERTOS的10-20倍。 ③ 创建一个CPU利用率统计线程,调用下面两个函数即可。 void vTaskList( char * pcWriteBuffer ); //获取任务列表 void vTaskGetRunTimeStats( char pcWriteBuffer ); //获取任务的CPU使用率

但是在使用xilinx官方移植好的freertos823_xilinx时,却出现了问题。使用 cpu利用率统计函数void vTaskGetRunTimeStats( char *pcWriteBuffer )时编译无法通过,提示找不到这个函数的定义。 搞了半天没搞定,于是寻求官方的帮助,最终得到答复:目前Xilinx并不支持run time stats的功能,因为相关API还没有实现。 官方链接如下: https://forums.xilinx.com/t5/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/%E4%BD%BF%E7%94%A8freertos823-xilinx%E7%9A%84cpu%E4%BD%BF%E7%94%A8%E7%8E%87%E7%BB%9F%E8%AE%A1%E5%87%BD%E6%95%B0-void-vTaskGetRunTimeStats-char/td-p/1037076

既然官方的FREERTOS的CPU利用率功能没办法使用,我就改用了一个简单的一点方法。思路如下:

创建一个最低优先级的任务,在这个任务里每10ms (调用usleep(10000)),对一个变量累加一次。创建一个最高优先级任务里,每一秒(调用vTaskDelay(100))打印一次这个变量的值,并清0。如果为100,说明CPU一直在这个低优先级任务里,利用率0%。 50,说明CPU 利用率为50%。 0,说明CPU利用率为100%。

之后实验了一下,成功了。测试效果如下: 代码如下:

/*-----------------------------------------------------------*/ static void prvTxTask( void *pvParameters ) { while(1) { cpu_count++; usleep(10000); } } u32 usleep_count=1000; /*-----------------------------------------------------------*/ static void prvRxTask( void *pvParameters ) { while(1) { usleep(200000); //200ms vTaskDelay(10); //100ms } } static void CPU_Task(void* parameter) { uint8_t CPU_RunInfo[400]; while (1) { memset(CPU_RunInfo,0,400); vTaskList((char *)&CPU_RunInfo); printf("---------------------------------------------\r\n"); printf("%s", CPU_RunInfo); printf("---------------------------------------------\r\n"); printf("cpu utilization = %d%%\r\n",(100-cpu_count)); cpu_count=0; printf("---------------------------------------------\r\n\n"); vTaskDelay(100); } }

其中prvTxTask任务优先级最低,prvRxTask优先级中等,CPU_Task优先级最高。 usleep代表CPU的延时。 vTaskDelay代表FREERTOS提供的延时。

理论上计算CPU利用率,则为2/3=66.7%。测试结果显示为62%-70%。也大概满足了测试要求。

最新回复(0)