本帖最后由 ndx1986 于 2020-5-25 12:29 编辑
这两天正好看FreeRTOS的代码,顺便尝试了下Ozone调试的方法。
Ozone建立调试工程(包含FreeRTOS的工程)后,需要在Console敲击命令,调用插件OS相关插件,注意命令需要对应安装目录和插件文件名,ChibiOS(比较小众)和embOS(Segger自家OS)用的不多,本次使用的是FreeRTOS。
之后在Viwe的菜单下出现FreeRTOS的选项
目前使用Ozone的版本为3.1,工程为V5-1001_RL-TCPnetV7.X(FreeRTOS)(HAL库),RTE环境搭建的FreeRTOS(V10版本)+ TCPnet V7.X(lib形式),可以正确识别工程,跳转和进程(keil5的RTE搭建方式,在一定程度上统一了各个os的接口,cmsisi_os2文件,原来都叫任务,现在感觉叫进程合理点)的显示。
目前这个工程没有使能(FreeRTOS.h中)运行时间统计的,所以Run Count提示为N/A。
需要在FreeRTOS.h中打开对应功能,此处提一个小小的建议,建议硬汉以后将FreeRTOS的文件夹还是隔离出来好一些,或者将FreeRTOS.h隔离出来。因为在这个地方更改的话,后续工程都得变动。而且此处的文件还都是只读的。
在keil环境下的FreeRTOSConfig.h配置里面的功能好像没有直接操作FreeRTOS.h这么全,不知道是不是ARM故意的额……
改写思路是一样的,都是通过一个标准的硬件定时器,进行一个计数器的不断累加,在进行任务上下文切换的时候,通过当前计数器值减去进入任务时的计数器值(上一次上下文切换的记录值),累计得到本进程的运行时间
建立过程: 1、在FreeRTOS.h中使能RunTime
2、在bsp_timer.c中添加计数器和相关函数
3、在FreeRTOSConfig.h中添加引用
可以看到Run_Count的统计出来了,读取了RAM中该进程的地址,0x200D900,可以看到计数值是一致的。0x37 == 55
看了下FreeRTOS中关于RunTime统计的源码:
查看源码后,发现先前的这种思路不对。Trace代表的是函数、进程被执行的次数,RunCount代表的是每个进程被执行时间长度(CPU占用率)。由于每个进程的执行时间长度不一样(内部函数不同),所以Trace得到的进程执行次数和RunCount具有完全不同的统计意义。
顺手做了个比对小实验(统计10s,更改不同的定时器频率) A、160MHz主频、200kHz硬件定时器、10s的运行时长:
B、160MHz主频、400kHz硬件定时器、10s的运行时长:
可以看到,函数被执行的次数Trace是基本一样的,但是RunCount的数值翻倍(硬件定时器频率翻倍)了。
目前FreeRTOS的窗口还有两个地方不太满意 1、不能实时刷新,不能动态看到进程的状态变化(比如1s刷新一次) 2、RunCount实际的含义就是CPU占用率,使用百分比的形式应该更直观些
由于Ozone比较开放,提供了一些接口可以自定义,所以查看了下Ozone的OS文件夹下存在如下内容:FreeRTOSPlugin和FreeRTOSPlugin_CM4,我猜测目前Ozone得到执行状态的实际过程如下:
那么修改js插件(FreeRTOSPlugin_CM4)应该就可能得到想要的功能。这个插件的功能和armfly老版本FreeRTOS例程中的打印类似,观感更好,也不需要串口了
查看了js文件的内容和Ozone的UM08025用户手册,发现js文件中的update函数是从dll中获取进程工作状态的接口函数
不过遗憾的是,查看了手册之后发现update接口函数,只能在工程被暂停的时候,才能起作用,所以就不能实现FreeRTOS动态刷新的功能了。
不过观察了下js的执行流程,发现是可以通过改写js文件(直接上传改写后的文件,不再赘述怎么改的了,FreeRTOSPlugin_CM4.js文件修改需要管理员权限),实现CPU占用率百分比显示的。改写了两个版本,轻载使用RTOS时,感觉不统计Idle进程的实际意义更大些。
Project.SetOSPlugin ("C:\ProgramFiles\SEGGER\Ozone V3.10b\Plugins\OS\FreeRTOSPlugin_CM4_Include-Idle.js"); 统计CPU占用率,包含Idle Project.SetOSPlugin ("C:\ProgramFiles\SEGGER\Ozone V3.10b\Plugins\OS\FreeRTOSPlugin_CM4_Non-Idle.js"); 统计CPU占用率,包含Idle Project.SetOSPlugin("C:\Program Files\SEGGER\Ozone V3.10b\Plugins\OS\FreeRTOSPlugin_CM4_Original.js"); 统计CPU占用率,包含Idle
备注:configRECORD_STACK_HIGH_ADDRESS打开后,会显示Stack Info的详细信息(还没仔细考虑过有啥用)
|