简单说下freeRTOS用systemview继续trace调试的方法
简单说下freeRTOS用systemview继续trace调试的方法,软件免费,使用jlink就可以了。希望大家继续讨论、完善。http://www.amobbs.com/forum.php?mod=viewthread&tid=5671434&pid=9726444&page=1&extra=#pid9726444
在这个帖子里得到网友的帮助,M0基本跑起来了,但还有问题继续完善。先总结一下。
一、M3的核很简单
1、先准备好能跑FREERTOS的工程。不是本文重点就不多说了,版本是8.2.3,我使用8.0.1编译错误,换成8.2.3正常;
2、下载systemview,安装。目前是V2.42。
https://www.segger.com/downloads/jlink
3、工程中建一个目录,比如trace。systemview安装目录下有个src目录,将里面用到的文件拷贝到trace目录,并添加的工程里;
4、main文件增加包含 #include "SEGGER_SYSVIEW.h",main函数创建任务前调用SEGGER_SYSVIEW_Conf();
5、freeRTOSconfig.h后加#include "SEGGER_SYSVIEW_FreeRTOS.h"
6、freeRTOSconfig.h中#define configMAX_PRIORITIES (UBaseType_t) ( 8 ) 改为#define configMAX_PRIORITIES ( 8 ),不改的话编译不能通过。这里还需要继续研究为什么;
7、编译无错误,就可以开始debug,全速跑;
8、开systemview点击绿色三角,start recording;
二、M0的核很稍复杂(目前还不正常,跑一会断片,还需继续研究)
过程如上,在SEGGER_SYSVIEW_Config_FreeRTOS.c文件里增加如下函数
U32 SEGGER_SYSVIEW_X_GetTimestamp(void) {
U32 Cycles = 0;
U32 TickCount;
U32 CyclesPerTick;
//
// Get the cycles of the current system tick.
// SysTick is down-counting, subtract the current value from the number of cycles per tick.
//
CyclesPerTick = SysTick->LOAD + 1;
Cycles = (CyclesPerTick - SysTick->VAL);
//
// Get the system tick count.
//
TickCount = SEGGER_SYSVIEW_TickCnt;
//
// If a SysTick interrupt is pending, re-read timer and adjust result
//
if ( NVIC_GetPendingIRQ(SysTick_IRQn) != 0)
{
TickCount++;
}
Cycles += TickCount * CyclesPerTick;
return Cycles;
}
systick中断里(port.c文件内)增加
SEGGER_SYSVIEW_TickCnt++;
不要忘了加SEGGER_SYSVIEW_TickCnt定义。
SEGGER_SYSVIEW_Config_FreeRTOS.c开始也要加
extern unsigned int SEGGER_SYSVIEW_TickCnt;
还需继续完善。
systemview安装目录内有详细文档可以参考。
大伙一起努力,让M0核能完美跑起来。 不错。顶一下。 6、freeRTOSconfig.h中#define configMAX_PRIORITIES (UBaseType_t) ( 8 ) 改为#define configMAX_PRIORITIES ( 8 ),不改的话编译不能通过。这里还需要继续研究为什么;
--------------------------------------
我来猜一下前提条件:UBaseType_t 是用 typedef 定义的。
条件成立的话,那么原因如下:
- typedef 这货要编译器来解释,
- 宏定义,是由预处理器来解释的,
- 预处理阶段,预处理器,并不认识 UBaseType_t 是什么东东。 非 freeRTOS 支持 systemview的trace调试吗?
去年就出了,一直没时间用上,刚好想弄 ljt80158015 发表于 2017-4-6 11:42
非 freeRTOS 支持 systemview的trace调试吗?
请允许不明真相的我,来现抄一段:Can be adapted to other RTOS using a fully documented API
更多信息,戳这里「https://www.segger.com/systemview.html」 我就直接RTT,一样跑得欢 好。办法越来越多
SEGGER_SYSVIEW_Start 要自己在main函数中调用吗
我的不调这个函数在SEGGER SystemView 软件中就没反应
SystemViewStart的时候会发命令来调用这个函数的,不知道为什么不行
systemview,该调试方式有啥好处? security 发表于 2017-4-6 11:20
6、freeRTOSconfig.h中#define configMAX_PRIORITIES (UBaseType_t) ( 8 ) 改为#define configMAX_ ...
在portmacro.h中定义的
typedef unsigned long UBaseType_t;
如果FreeRTOSConfig.h中包含portmacro.h就不会报错了。 rootxie 发表于 2017-4-6 12:45
我就直接RTT,一样跑得欢
RTT是输出、记录数据的。
这个可以直观看到各个任务运行的时间。
看我这个帖子里的图。
http://www.amobbs.com/forum.php?mod=viewthread&tid=5671434&pid=9726444&page=1&extra=#pid9726444 segger工具越来越丰富 dreambox 发表于 2017-4-6 21:19
SEGGER_SYSVIEW_Start 要自己在main函数中调用吗
我的不调这个函数在SEGGER SystemView 软件中就没反应
我没有调用
debug的时候全速跑用。
fengyunyu 发表于 2017-4-7 09:29
systemview,该调试方式有啥好处?
可以直观看到各个任务的运行情况。 McuY 发表于 2017-4-7 13:08
在portmacro.h中定义的
typedef unsigned long UBaseType_t;
我看错了,对于你的这种情况,你说的是对的。因为这边只是简单的 replace 而已。
如果是类似 #if configMAX_PRIORITIES 的应用场景,那么原因参照 4 楼的描述。 CM0中断优先级是四级。 本帖最后由 pk1206 于 2019-1-17 21:11 编辑
cortex-m3内核,按照楼主的教程,一直提示这个。
然后按下图所示,更改文件 SEGGER_SYSVIEW_Conf.h 的配置,就可以了。不知道为什么。
页:
[1]