硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8295|回复: 8
收起左侧

[Ozone] Ozone调试FreeRTOS

[复制链接]

4

主题

51

回帖

68

积分

初级会员

积分
68
发表于 2020-5-25 12:19:36 | 显示全部楼层 |阅读模式
本帖最后由 ndx1986 于 2020-5-25 12:29 编辑

这两天正好看FreeRTOS的代码,顺便尝试了下Ozone调试的方法。

Ozone建立调试工程(包含FreeRTOS的工程)后,需要在Console敲击命令,调用插件OS相关插件,注意命令需要对应安装目录和插件文件名,ChibiOS(比较小众)和embOS(Segger自家OS)用的不多,本次使用的是FreeRTOS。
wenjianjia.png
console.png

之后在Viwe的菜单下出现FreeRTOS的选项
window.png

目前使用Ozone的版本为3.1,工程为V5-1001_RL-TCPnetV7.X(FreeRTOS)(HAL库),RTE环境搭建的FreeRTOS(V10版本)+ TCPnet V7.X(lib形式),可以正确识别工程,跳转和进程(keil5的RTE搭建方式,在一定程度上统一了各个os的接口,cmsisi_os2文件,原来都叫任务,现在感觉叫进程合理点)的显示。
num.png
pro.png

目前这个工程没有使能(FreeRTOS.h中)运行时间统计的,所以Run Count提示为N/A。
enable.png

参照网上的 https://blog.csdn.net/foxclever/article/details/81586150 帖子和Armfly老版本FreeRTOS的例程,在本工程中打开该功能。

需要在FreeRTOS.h中打开对应功能,此处提一个小小的建议,建议硬汉以后将FreeRTOS的文件夹还是隔离出来好一些,或者将FreeRTOS.h隔离出来。因为在这个地方更改的话,后续工程都得变动。而且此处的文件还都是只读的。
freertos.h.png

在keil环境下的FreeRTOSConfig.h配置里面的功能好像没有直接操作FreeRTOS.h这么全,不知道是不是ARM故意的额……
keil-freertos.png

改写思路是一样的,都是通过一个标准的硬件定时器,进行一个计数器的不断累加,在进行任务上下文切换的时候,通过当前计数器值减去进入任务时的计数器值(上一次上下文切换的记录值),累计得到本进程的运行时间
oldver.png

建立过程:
1、在FreeRTOS.h中使能RunTime
step1.png

2、在bsp_timer.c中添加计数器和相关函数
step2.png

3、在FreeRTOSConfig.h中添加引用
step3.png

可以看到Run_Count的统计出来了,读取了RAM中该进程的地址,0x200D900,可以看到计数值是一致的。0x37 == 55
end.png

看了下FreeRTOS中关于RunTime统计的源码:
code1.png
code2.png

查看源码后,发现先前的这种思路不对。Trace代表的是函数、进程被执行的次数,RunCount代表的是每个进程被执行时间长度(CPU占用率)。由于每个进程的执行时间长度不一样(内部函数不同),所以Trace得到的进程执行次数和RunCount具有完全不同的统计意义。

顺手做了个比对小实验(统计10s,更改不同的定时器频率)
A、160MHz主频、200kHz硬件定时器、10s的运行时长:
a1.png
a2.png
a3.png


B、160MHz主频、400kHz硬件定时器、10s的运行时长:
b1.png
b2.png
b3.png

可以看到,函数被执行的次数Trace是基本一样的,但是RunCount的数值翻倍(硬件定时器频率翻倍)了。

目前FreeRTOS的窗口还有两个地方不太满意
1、不能实时刷新,不能动态看到进程的状态变化(比如1s刷新一次)
2、RunCount实际的含义就是CPU占用率,使用百分比的形式应该更直观些

由于Ozone比较开放,提供了一些接口可以自定义,所以查看了下Ozone的OS文件夹下存在如下内容:FreeRTOSPlugin和FreeRTOSPlugin_CM4,我猜测目前Ozone得到执行状态的实际过程如下:
guess.png

那么修改js插件(FreeRTOSPlugin_CM4)应该就可能得到想要的功能。这个插件的功能和armfly老版本FreeRTOS例程中的打印类似,观感更好,也不需要串口了
oldcom.png

查看了js文件的内容和Ozone的UM08025用户手册,发现js文件中的update函数是从dll中获取进程工作状态的接口函数
js.png

不过遗憾的是,查看了手册之后发现update接口函数,只能在工程被暂停的时候,才能起作用,所以就不能实现FreeRTOS动态刷新的功能了。
um.png

不过观察了下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
compare.png
备注:configRECORD_STACK_HIGH_ADDRESS打开后,会显示Stack Info的详细信息(还没仔细考虑过有啥用)
statck1.png
statck2.png


FreeRTOSPlugin_CM4_Non-Idle.js

16.87 KB, 下载次数: 56

统计cpu占用率,但不统计idle

FreeRTOSPlugin_CM4_Include-Idle.js

16.47 KB, 下载次数: 27

统计cpu占用率,统计idle

FreeRTOSPlugin_CM4_Original.js

13.93 KB, 下载次数: 21

原始文件

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2020-5-25 16:09:38 | 显示全部楼层
谢谢分享,非常详细。
回复

使用道具 举报

3

主题

15

回帖

24

积分

新手上路

积分
24
发表于 2020-5-25 16:45:03 | 显示全部楼层
不知道你敲命令的形式调用RTOS插件是不是做一次就行了,其实这句话可以直接写到Ozone项目文件中,手册中有说明。另外SVD外设描述文件也可以直接添加到项目文件中。
J-Trace 有点贵啊,目前用的Pro,Ozone已经用了半年多了,不过都是些皮毛功能,改脚本的功能还没用上。
回复

使用道具 举报

4

主题

51

回帖

68

积分

初级会员

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

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

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2020-5-25 16:59:19 | 显示全部楼层
感觉没有SystemView方便。
代码不规范,亲人两行泪!
回复

使用道具 举报

2

主题

72

回帖

83

积分

初级会员

积分
83
发表于 2020-5-25 20:04:30 | 显示全部楼层
不建议去改 FreeRTOS.h 吧,里面是保存默认配置的,即在没有 FreeRTOSConfig.h 文件时,也能够得到配置

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

使用道具 举报

4

主题

51

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2020-5-25 21:35:46 | 显示全部楼层
tsetse 发表于 2020-5-25 20:04
不建议去改 FreeRTOS.h 吧,里面是保存默认配置的,即在没有 FreeRTOSConfig.h 文件时,也能够得到配置

...

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

使用道具 举报

3

主题

66

回帖

75

积分

初级会员

积分
75
发表于 2020-5-28 16:58:13 | 显示全部楼层
我目前是用vscode写代码,用xmake+arm-none-eabi-gcc编译代码,用RTT/Ozone调试代码,跨平台方便
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-4-29 18:17:42 | 显示全部楼层
问一下楼主,这几个文件貌似没法下载,还能再上传吗,非常感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 04:40 , Processed in 0.257851 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表