McuY 发表于 2017-4-6 10:23:03

简单说下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;




还需继续完善。

McuY 发表于 2017-4-6 10:25:05

systemview安装目录内有详细文档可以参考。
大伙一起努力,让M0核能完美跑起来。

codefish 发表于 2017-4-6 11:13:20

不错。顶一下。

security 发表于 2017-4-6 11:20:44

6、freeRTOSconfig.h中#define configMAX_PRIORITIES       (UBaseType_t) ( 8 ) 改为#define configMAX_PRIORITIES       ( 8 ),不改的话编译不能通过。这里还需要继续研究为什么;
--------------------------------------
我来猜一下前提条件:UBaseType_t 是用 typedef 定义的。

条件成立的话,那么原因如下:
- typedef 这货要编译器来解释,
- 宏定义,是由预处理器来解释的,
- 预处理阶段,预处理器,并不认识 UBaseType_t 是什么东东。

ljt80158015 发表于 2017-4-6 11:42:24

非 freeRTOS 支持 systemview的trace调试吗?

dreambox 发表于 2017-4-6 11:47:50

去年就出了,一直没时间用上,刚好想弄

security 发表于 2017-4-6 11:57:11

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」

rootxie 发表于 2017-4-6 12:45:45

我就直接RTT,一样跑得欢

Excellence 发表于 2017-4-6 13:01:58

好。办法越来越多

dreambox 发表于 2017-4-6 21:19:21


SEGGER_SYSVIEW_Start 要自己在main函数中调用吗
我的不调这个函数在SEGGER SystemView 软件中就没反应

SystemViewStart的时候会发命令来调用这个函数的,不知道为什么不行

fengyunyu 发表于 2017-4-7 09:29:59

systemview,该调试方式有啥好处?

McuY 发表于 2017-4-7 13:08:41

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就不会报错了。

McuY 发表于 2017-4-7 13:11:12

rootxie 发表于 2017-4-6 12:45
我就直接RTT,一样跑得欢

RTT是输出、记录数据的。

这个可以直观看到各个任务运行的时间。

看我这个帖子里的图。

http://www.amobbs.com/forum.php?mod=viewthread&tid=5671434&pid=9726444&page=1&extra=#pid9726444

huangqi412 发表于 2017-4-7 13:12:43

segger工具越来越丰富

McuY 发表于 2017-4-7 13:12:48

dreambox 发表于 2017-4-6 21:19
SEGGER_SYSVIEW_Start 要自己在main函数中调用吗
我的不调这个函数在SEGGER SystemView 软件中就没反应



我没有调用

debug的时候全速跑用。

McuY 发表于 2017-4-7 13:13:54

fengyunyu 发表于 2017-4-7 09:29
systemview,该调试方式有啥好处?

可以直观看到各个任务的运行情况。

security 发表于 2017-4-7 16:14:16

McuY 发表于 2017-4-7 13:08
在portmacro.h中定义的
typedef unsigned long UBaseType_t;



我看错了,对于你的这种情况,你说的是对的。因为这边只是简单的 replace 而已。

如果是类似 #if configMAX_PRIORITIES 的应用场景,那么原因参照 4 楼的描述。

TBG3 发表于 2017-5-9 10:52:43

CM0中断优先级是四级。

pk1206 发表于 2019-1-17 21:10:13

本帖最后由 pk1206 于 2019-1-17 21:11 编辑


cortex-m3内核,按照楼主的教程,一直提示这个。

然后按下图所示,更改文件 SEGGER_SYSVIEW_Conf.h 的配置,就可以了。不知道为什么。
页: [1]
查看完整版本: 简单说下freeRTOS用systemview继续trace调试的方法