硬汉嵌入式论坛

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

[RTOS Trace] H7-TOOL的FreeRTOS Trace操作说明,从2.22版本固件正式支持(已经更新,2023-07-08)

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2023-7-5 01:44:22 | 显示全部楼层 |阅读模式
从TOOL的2.22版本固件开始正式支持,FreeRTOS的Trace不同于前面的已经发布的uCOS-III,RTX5和ThreadX Trace。

得写个操作说明,因为有个几个变量需要手动填写,还有uCOS,这两个的玩法情况是一样的。

【RTOS Trace操作说明】
https://www.armbbs.cn/forum.php?mod=viewthread&tid=114824

【FreeRTOS工程注意事项】
1、请使用V8.2.X及其以上版本,含最新的V10.X, 也支持使用CMSIS-RTOS V2封装层。
2、开启FreeRTOS任务信息统计功能,FreeRTOSConfig.h文件添加的定义
      extern volatile uint32_t ulHighFrequencyTimerTicks;
      #define configGENERATE_RUN_TIME_STATS                       1
     #define configUSE_STATS_FORMATTING_FUNCTIONS           1
     #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    (ulHighFrequencyTimerTicks = 0ul)
     #define portGET_RUN_TIME_COUNTER_VALUE()                  ulHighFrequencyTimerTicks

    并在其它C源文件, 定义变量volatile uint32_t ulHighFrequencyTimerTicks,以我们的开发板FreeRTOS程序为例,是开了个SysInfoTest.c文件,在此文件里面,每50us变量+1。
         
3、同时在FreeRTOSConfig.h文件里面添加宏定义
     #define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }        

【FreeRTOS操作注意事项】

默认FreeRTOS的任务控制块结构体成员地址是按照固定方式设置的,但此结构体里面宏定义非常多,导致成员的地址不是固定的,所以需要大家根据需要手动修改。

手动修改也比较简单。点击此按钮

1.png

打开FreeRTOS.lua文件,修改这几个变量:

2.png

为了方便大家修改,执行了一个C函数,大家使用自己的工程运行一次就可以打印出来

特别注意,这个函数要放在tasks.c文件末尾,原因见此贴链接

比如我们在main.c文件里面调用,那么在main.c添加extern void TaskTcbPrintf(void),然后就可以在main.c调用了。

[C] 纯文本查看 复制代码
void TaskTcbPrintf(void)
{
        printf("\"pcbcount\",    %d,\r\n", configMAX_PRIORITIES);
        printf("\"tskTCB_pxTopOfStack_off\", %d,\r\n",          (int)&((((struct tskTaskControlBlock*)0)->pxTopOfStack)));       
        printf("\"tskTCB_uxPriority_off\",   %d,\r\n",          (int)&((((struct tskTaskControlBlock*)0)->uxPriority)));
        printf("\"tskTCB_pxStack_off\",      %d,\r\n",          (int)&((((struct tskTaskControlBlock*)0)->pxStack)));
        printf("\"tskTCB_pcTaskName_off\",      %d,\r\n",       (int)&((((struct tskTaskControlBlock*)0)->pcTaskName)));
        printf("\"tskTCB_ulRunTimeCounter_off\",       %d,\r\n",(int)&((((struct tskTaskControlBlock*)0)->ulRunTimeCounter)));         
}


打印出来的数据:
12.png

覆盖原有的即可,覆盖后记得保存文件,另外这个文件是GBK编码格式的,保存的时候注意下



静态效果:

12.png

下面是解析的动态效果图:

12.gif





评分

参与人数 2金币 +40 收起 理由
李益达 + 20 赞一个!
312456990 + 20 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-8 00:40:47 | 显示全部楼层
实际案例测试:

测试了MDK RTE创建FreeRTOS,使用的CMSIS-RTOS V2封装层也是没问题的,完全按照楼主位的方式创建

1、FreeRTOSConfig.h使能了宏定义:

12.png

2、main.c定义变量:
volatile uint32_t ulHighFrequencyTimerTicks = 0UL;

3、tasks.c文件末尾添加函数:
12.png

4、串口打印后获取偏移地址,并覆盖FreeRTOS.lua文件的这几个变量
[C] 纯文本查看 复制代码
"pcbcount",    56,
"tskTCB_pxTopOfStack_off", 0,
"tskTCB_uxPriority_off",   44,
"tskTCB_pxStack_off",      48,
"tskTCB_pcTaskName_off",      52,
"tskTCB_ulRunTimeCounter_off",       84,


实际测试没问题:

下载.png



回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2023-7-5 11:17:11 | 显示全部楼层
坐等发布,太需要使用FreeRTOS的Trace了
回复

使用道具 举报

0

主题

69

回帖

69

积分

初级会员

积分
69
发表于 2023-7-5 15:52:06 | 显示全部楼层
好消息
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-6 01:15:58 | 显示全部楼层
花了些时间,将FreeRTOS可以管理的中断优先级范围也做了个检索实现

白天了更新帖子说明。

12.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-7 09:12:08 | 显示全部楼层
操作说明制作完成。
回复

使用道具 举报

0

主题

69

回帖

69

积分

初级会员

积分
69
发表于 2023-7-8 09:16:35 | 显示全部楼层
坐等2.22固件发布
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2023-7-10 10:23:41 | 显示全部楼层
Vxworks 发表于 2023-7-8 09:16
坐等2.22固件发布

+1
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

129

回帖

146

积分

初级会员

积分
146
发表于 2023-7-11 14:24:35 | 显示全部楼层
V2.23 可以安排 RT-Thread trace 了吗,公司的所有产品已经切换到 RT-Thread 了,非常有需要
回复

使用道具 举报

8

主题

135

回帖

159

积分

初级会员

积分
159
发表于 2023-7-11 15:12:12 | 显示全部楼层
坐等新版本啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-12 00:08:43 | 显示全部楼层
Dinor 发表于 2023-7-11 14:24
V2.23 可以安排 RT-Thread trace 了吗,公司的所有产品已经切换到 RT-Thread 了,非常有需要

一定会有的,过段时间研究学习下RT-Thread的源码实现。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
QQ
发表于 2023-7-16 21:04:28 | 显示全部楼层
我发现了一些问题,我是全部用RTE搭的工程,使用FreeRTOS,编译器使用的AC6,按照帖子的操作添加了所有的宏定义及 task.c 的代码,发现如下几个问题:
1)如果添加 #define configASSERT( x ) if( ( x ) == 0 )                        { taskDISABLE_INTERRUPTS(); for( ;; ); }
宏定义,工程就无法运行,程序直接跑死;
2)不添加这个宏定义程序一切正常,任务信息统计也可以正常打印,但是 FreeRTOS Trace 无法正常工作,H7TOOL的上位机会报错:[string "function CacheClean() end OS_Refresh()"]:1: attempt to call a nil value (global 'OS_Refresh'),报几次后好像 H7TOOL 就会自己重启。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-17 02:26:47 | 显示全部楼层
szazone 发表于 2023-7-16 21:04
我发现了一些问题,我是全部用RTE搭的工程,使用FreeRTOS,编译器使用的AC6,按照帖子的操作添加了所有的宏 ...

谢谢分享问题。

二楼的地方,我测试的是RTE创建,不过我是用的AC5测试,白天了我也换成AC6试试。另外你用的MDK那个版本测试的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-17 14:19:33 | 显示全部楼层
szazone 发表于 2023-7-16 21:04
我发现了一些问题,我是全部用RTE搭的工程,使用FreeRTOS,编译器使用的AC6,按照帖子的操作添加了所有的宏 ...

帮你测了,AC6.16测试,MDK RTE添加,没问题。你那边加上#define configASSERT( x ) if( ( x ) == 0 ) 后不正常,说明你的工程是有问题,看看卡在那个地方了。

下载 (4).png
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
QQ
发表于 2023-7-17 16:17:33 | 显示全部楼层
eric2013 发表于 2023-7-17 14:19
帮你测了,AC6.16测试,MDK RTE添加,没问题。你那边加上#define configASSERT( x ) if( ( x ) == 0 ) 后 ...

我查了一下,卡死的原因是因为我把这个值设的太大
1.png
导致RTOS启动调度时失败,现在调小了就好了,但是好像还有其他的问题,我载入我的axf文件后,点击解析ELF后会报错
ARM FromELF: Execution interrupted due to an illegal storage access.
Finished: 1 information, 0 warning, 0 error and 1 fatal error messages.
发现全局变量个数: 267

而且上位机识别不出来用的是哪种RTOS,
2.png
这个时候刷新显示会报如下错误:
[string "function CacheClean() end OS_Refresh()"]:1: attempt to call a nil value (global 'OS_Refresh')
3.png

但是,我的程序运行正常,好像没有什么问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-7-17 16:27:24 | 显示全部楼层
szazone 发表于 2023-7-17 16:17
我查了一下,卡死的原因是因为我把这个值设的太大

导致RTOS启动调度时失败,现在调小了就好了,但是好 ...

MDK5.38带AC6.19有bug,建议使用之前版本的MDK5.3X带的 AC6.X编译,然后导入就正常了。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-9-9 06:44:18 | 显示全部楼层
eric2013 发表于 2023-7-17 16:27
MDK5.38带AC6.19有bug,建议使用之前版本的MDK5.3X带的 AC6.X编译,然后导入就正常了。

我也遇到这个问题了,怎么解决呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-9-9 07:54:57 | 显示全部楼层
wenjian1 发表于 2023-9-9 06:44
我也遇到这个问题了,怎么解决呢?

用5.36或者5.37编译即可。
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-9-9 14:06:28 | 显示全部楼层
eric2013 发表于 2023-9-9 07:54
用5.36或者5.37编译即可。

5.38有办法解决吗?不想再重装了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-9-9 14:25:03 | 显示全部楼层
wenjian1 发表于 2023-9-9 14:06
5.38有办法解决吗?不想再重装了

等5.39发布,他们应该会修复这个问题,或者将LUA开头的变量都打印出来,填写进去即可,这个你自己实现也比较简单,我楼主位不是打印出来了一个部分,其它的你也全部打印出来添加进去即可。

就是下面这个API,你全部添加打印即可

[C] 纯文本查看 复制代码
void TaskTcbPrintf(void)
{
        printf("\"pcbcount\",    %d,\r\n", configMAX_PRIORITIES);
        printf("\"tskTCB_pxTopOfStack_off\", %d,\r\n",          (int)&((((struct tskTaskControlBlock*)0)->pxTopOfStack)));      
        printf("\"tskTCB_uxPriority_off\",   %d,\r\n",          (int)&((((struct tskTaskControlBlock*)0)->uxPriority)));
        printf("\"tskTCB_pxStack_off\",      %d,\r\n",          (int)&((((struct tskTaskControlBlock*)0)->pxStack)));
        printf("\"tskTCB_pcTaskName_off\",      %d,\r\n",       (int)&((((struct tskTaskControlBlock*)0)->pcTaskName)));
        printf("\"tskTCB_ulRunTimeCounter_off\",       %d,\r\n",(int)&((((struct tskTaskControlBlock*)0)->ulRunTimeCounter)));        
}

回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-9-9 15:26:34 | 显示全部楼层
eric2013 发表于 2023-9-9 14:25
等5.39发布,他们应该会修复这个问题,或者将LUA开头的变量都打印出来,填写进去即可,这个你自己实现也 ...

刚拿到H7-TOOL 第一次用,不太知道怎么弄啊还有一个问题,USB(HID)怎么能被电脑识别为一个串口号,不用接H7-TOOL 上位机显示,用其他的串口调试助手接收显示,或者接自己开发的上位机显示
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2023-9-9 15:41:12 | 显示全部楼层
wenjian1 发表于 2023-9-9 15:26
刚拿到H7-TOOL 第一次用,不太知道怎么弄啊还有一个问题,USB(HID)怎么能被电脑识别为一个串口号,不用 ...


1、没问题,下周我有时间了分享个函数,你调用打印下即可,当前可以先安装MDK5.37,把基础玩法熟悉了。

2、TOOL当前是全免驱的,串口也是HID高速免驱串口,转接到第3方串口软件也很方便,等我们上位机开发人员有时间了支持上,此贴做了高速HID相关问题详细说明:

https://www.armbbs.cn/forum.php?mod=viewthread&tid=118405

识别为串口号的也是可以的,操作TOOL显示屏进入这个界面接口,进入后,这个功能不支持和任何其它上位机功能一起使用,待高速HID的转接第3方功能发布后,此选项将被删除.

下载.png

CDC驱动路径:h7toolPC_release\Driver\stm32_vcp
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2023-9-9 15:46:18 | 显示全部楼层
eric2013 发表于 2023-9-9 15:41
1、没问题,下周我有时间了分享个函数,你调用打印下即可,当前可以先安装MDK5.37,把基础玩法熟悉了。 ...

硬汉哥给力啊
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-1-4 20:27:54 | 显示全部楼层
eric2013 发表于 2023-7-8 00:40
实际案例测试:

测试了MDK RTE创建FreeRTOS,使用的CMSIS-RTOS V2封装层也是没问题的,完全按照楼主位的 ...

请问一下,在FreeRTOSConfig.h的文件里加入这些宏定义的作用是什么呀,我不加这个也能出来(第一次用,不太懂)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
 楼主| 发表于 2024-1-5 00:37:56 | 显示全部楼层
Primary 发表于 2024-1-4 20:27
请问一下,在FreeRTOSConfig.h的文件里加入这些宏定义的作用是什么呀,我不加这个也能出来(第一次用,不 ...

任务利用率统计。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 21:12 , Processed in 0.285660 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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