ndx1986 发表于 2020-5-25 12:19:36

Ozone调试FreeRTOS

本帖最后由 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。


参照网上的 https://blog.csdn.net/foxclever/article/details/81586150 帖子和Armfly老版本FreeRTOS的例程,在本工程中打开该功能。
需要在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占用率,包含IdleProject.SetOSPlugin ("C:\ProgramFiles\SEGGER\Ozone V3.10b\Plugins\OS\FreeRTOSPlugin_CM4_Non-Idle.js");            统计CPU占用率,包含IdleProject.SetOSPlugin("C:\Program Files\SEGGER\Ozone V3.10b\Plugins\OS\FreeRTOSPlugin_CM4_Original.js");             统计CPU占用率,包含Idle
备注:configRECORD_STACK_HIGH_ADDRESS打开后,会显示Stack Info的详细信息(还没仔细考虑过有啥用)




eric2013 发表于 2020-5-25 16:09:38

谢谢分享,非常详细。

liuenming 发表于 2020-5-25 16:45:03

不知道你敲命令的形式调用RTOS插件是不是做一次就行了,其实这句话可以直接写到Ozone项目文件中,手册中有说明。另外SVD外设描述文件也可以直接添加到项目文件中。
J-Trace 有点贵啊,目前用的Pro,Ozone已经用了半年多了,不过都是些皮毛功能,改脚本的功能还没用上。

ndx1986 发表于 2020-5-25 16:53:27

liuenming 发表于 2020-5-25 16:45
不知道你敲命令的形式调用RTOS插件是不是做一次就行了,其实这句话可以直接写到Ozone项目文件中,手册中有 ...

嗯,我也是写到了项目里面了,第一次就会加载,不过有的时候需要更改插件,所以可能还会敲命令。

missfox 发表于 2020-5-25 16:59:19

感觉没有SystemView方便。

tsetse 发表于 2020-5-25 20:04:30

不建议去改 FreeRTOS.h 吧,里面是保存默认配置的,即在没有 FreeRTOSConfig.h 文件时,也能够得到配置

如果确实需要改,其实可以把 FreeRTOS.h的配置选项全部复制 FreeRTOSConfig.h 文件,做为你自己的配置文件,因为里面都是 #ifdef,也就是在你没有定义的情况下才会调用默认定义

ndx1986 发表于 2020-5-25 21:35:46

tsetse 发表于 2020-5-25 20:04
不建议去改 FreeRTOS.h 吧,里面是保存默认配置的,即在没有 FreeRTOSConfig.h 文件时,也能够得到配置

...

我的想法是可以将整个freertos的文件夹全部独立出来,就像老版本一样。当然你提的也是一个很好思路,我回头试下,毕竟刚开始使用RTE这种配置的方法,还有很多不熟悉的东西:)

kingdjh 发表于 2020-5-28 16:58:13

我目前是用vscode写代码,用xmake+arm-none-eabi-gcc编译代码,用RTT/Ozone调试代码,跨平台方便

RosenYin 发表于 2023-4-29 18:17:42

问一下楼主,这几个文件貌似没法下载,还能再上传吗,非常感谢
页: [1]
查看完整版本: Ozone调试FreeRTOS