caicaptain2 发表于 2018-8-27 08:38:02

Segger RTT 卡住任务了。。。

本帖最后由 caicaptain2 于 2018-8-27 11:46 编辑

一个奇怪的现象,SEGGER_RTT_printf 卡住任务的执行了。 如果插上jlink,打开RTT Viewer,就正常了。。
理论上,代码里面加上RTT语句,是否插上jlink都不应该影响程序运行啊? 可能是哪里出现问题了?

这个事情越来越诡异,被卡住的任务是USB-host的驱动加载,我做过如下测试:
1, jlink下载程序后,程序自动运行,USB加载成功。 按reset按钮,usb也加载成功。 电路板断电,上电,usb加载不了,似乎此任务没有执行。其他emwin任务都正常的很。。。
2, jlink连上电路板后,下载,调试模式下都是正常的。。。。目前,也无法使用mdk调试模式定位问题代码。。。
3,更改过segger的中断优先级,usb的中断优先级都是一样的现象。 电路板只要断电,再上电,usb加载不了。
4, 电路板断电,上电,usb库加载不了。 再连上jlink,还是加载不了;再运行RTT viewer, usb加载成功,一切都正常。

咔咔咔,这是个什么故障逻辑? 请高手分析一下?
-------------------------------------------------------------------结帖---------------------------------------------------
使用了个笨办法,一步步排除,冤枉了RTT了。
由于USB驱动里面包含有延时函数,这个延时函数用的是DWT,必须使用bsp_InitDWT初始化。。。。。我的代码中把初始化DWT的屏蔽掉了。 因为,我不知道那个是啥玩意。。。。
估计jlink和RTT连上后,会主动初始化这个DWT,所以出现了以上奇怪的现象。 导致,mdk调试模式都无法定位问题。

suozhang 发表于 2018-8-27 08:57:00

http://www.armbbs.cn/forum.php?mod=viewthread&tid=86018&highlight=RTT

caicaptain2 发表于 2018-8-27 09:22:47

suozhang 发表于 2018-8-27 08:57
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86018&highlight=RTT
不是这个原因,几种设置都试过了。
    /* ÅäÖÃí¨μà 0£¬éÏDDÅäÖà */
    SEGGER_RTT_ConfigUpBuffer(0, "RTTUP", NULL,0,SEGGER_RTT_MODE_NO_BLOCK_TRIM);
    /* ÅäÖÃí¨μà 0£¬ÏÂDDÅäÖà */
    SEGGER_RTT_ConfigDownBuffer(0,"RTTDOWN",NULL,0,SEGGER_RTT_MODE_NO_BLOCK_TRIM);

suozhang 发表于 2018-8-27 10:39:22

这就不清楚了

caicaptain2 发表于 2018-8-27 10:57:02

还在持续分析中。。。。已经定位到这个函数了。
/* Start the USB OTG core */   
   HCD_Init(pdev , coreID);
这个函数进去了,出不来了。。。

weison 发表于 2024-3-3 21:47:19

佬你好,我的开启的dwt后再中断还是显示Error: rtt: Failed to read from up-channel 0,你之前也有报这个错吗?

eric2013 发表于 2024-3-4 00:44:18

weison 发表于 2024-3-3 21:47
佬你好,我的开启的dwt后再中断还是显示Error: rtt: Failed to read from up-channel 0,你之前也有报这个 ...

看看是不是这个问题导致的,注意下。

RTT的函数SEGGER_RTT_printf需要较大的栈空间,如果大家移植RTT开辟的空间不足会硬件异常
https://www.armbbs.cn/forum.php?mod=viewthread&tid=118809&fromuid=58
(出处: 硬汉嵌入式论坛)

soyshell 发表于 2024-3-26 17:45:41

为什么连续打印一段时候后,407会进入“硬件异常中断”? 将“上传缓冲区”从1024改为2048后,会多运行一段时间。使用的函数是:SEGGER_RTT_printf(0, "Start\r\n");

eric2013 发表于 2024-3-27 09:48:00

soyshell 发表于 2024-3-26 17:45
为什么连续打印一段时候后,407会进入“硬件异常中断”? 将“上传缓冲区”从1024改为2048后,会多运行一段 ...

看我7楼的内容,这个需要较大的栈需求,你加大上传,将需要更大的栈

soyshell 发表于 2024-3-27 10:04:43

谢谢硬汉。有个RTT使用的上传和下载栈,应该是自动清空的吧?RTT view已经将数据显示出来,下位机中的上传缓冲区是不是就应该被清空了?RTT的源程序中是不是有“清空缓冲”的命令?

eric2013 发表于 2024-3-27 10:07:28

soyshell 发表于 2024-3-27 10:04
谢谢硬汉。有个RTT使用的上传和下载栈,应该是自动清空的吧?RTT view已经将数据显示出来,下位机中的上传 ...

buffer清空不需要用户管理。

soyshell 发表于 2024-3-27 10:12:07

那我扩大上传缓冲区试试。现在的现象是:1024--->2048后,依旧会跳转到“硬件异常中断”,只是显示多少内容有区别。

eric2013 发表于 2024-3-27 12:02:10

soyshell 发表于 2024-3-27 10:12
那我扩大上传缓冲区试试。现在的现象是:1024--->2048后,依旧会跳转到“硬件异常中断”,只是显示多少内容 ...
你的xxx.S启动文件的栈大小要加大。是你上传缓存大小的3倍试试。

soyshell 发表于 2024-3-27 13:12:03

按照硬汉意思。RTT中 #define BUFFER_SIZE_UP      (4096)   , stm32f924xx.s中应该是Stack_Size      EQU   0x00004000 吗?也就是说: RTT中使用1K,启动文件中,应该差不多是 4K?

soyshell 发表于 2024-3-27 13:12:13

按照硬汉意思。RTT中 #define BUFFER_SIZE_UP      (4096)   , stm32f924xx.s中应该是Stack_Size      EQU   0x00004000 吗?也就是说: RTT中使用1K,启动文件中,应该差不多是 4K?

eric2013 发表于 2024-3-28 08:53:41

soyshell 发表于 2024-3-27 13:12
按照硬汉意思。RTT中 #define BUFFER_SIZE_UP      (4096)   , stm32f924xx.s中应该是Stack_Size      E ...
根本原因就是这个,他占用了一个非常大的局部变量

你调整后,正常不

soyshell 发表于 2024-3-28 09:18:20

#define BUFFER_SIZE_UP                            (4096)// Size of the buffer for terminal output of target, up to host (Default: 1k)
#define BUFFER_SIZE_DOWN                        (16)    // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)

#define SEGGER_RTT_PRINTF_BUFFER_SIZE             (64u)    // Size of buffer for RTT printf to bulk-send chars via RTT   (Default: 64)


我将“BUFFER_SIZE_UP”设为4096后,暂时没有出现“硬件异常中断”现象。“BUFFER_SIZE_UP”与“SEGGER_RTT_PRINTF_BUFFER_SIZE” 之间的比例应该是多少? 两个参数需要同步改变吗?

eric2013 发表于 2024-3-29 09:30:57

soyshell 发表于 2024-3-28 09:18
#define BUFFER_SIZE_UP                            (4096)// Size of the buffer for terminal output...

这两个之间貌似没有太大的关系,主要是注意SEGGER_RTT_PRINTF_BUFFER_SIZE和栈大小。
页: [1]
查看完整版本: Segger RTT 卡住任务了。。。