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调试模式都无法定位问题。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86018&highlight=RTT 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); 这就不清楚了 还在持续分析中。。。。已经定位到这个函数了。
/* Start the USB OTG core */
HCD_Init(pdev , coreID);
这个函数进去了,出不来了。。。 佬你好,我的开启的dwt后再中断还是显示Error: rtt: Failed to read from up-channel 0,你之前也有报这个错吗? 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
(出处: 硬汉嵌入式论坛)
为什么连续打印一段时候后,407会进入“硬件异常中断”? 将“上传缓冲区”从1024改为2048后,会多运行一段时间。使用的函数是:SEGGER_RTT_printf(0, "Start\r\n"); soyshell 发表于 2024-3-26 17:45
为什么连续打印一段时候后,407会进入“硬件异常中断”? 将“上传缓冲区”从1024改为2048后,会多运行一段 ...
看我7楼的内容,这个需要较大的栈需求,你加大上传,将需要更大的栈 谢谢硬汉。有个RTT使用的上传和下载栈,应该是自动清空的吧?RTT view已经将数据显示出来,下位机中的上传缓冲区是不是就应该被清空了?RTT的源程序中是不是有“清空缓冲”的命令? soyshell 发表于 2024-3-27 10:04
谢谢硬汉。有个RTT使用的上传和下载栈,应该是自动清空的吧?RTT view已经将数据显示出来,下位机中的上传 ...
buffer清空不需要用户管理。 那我扩大上传缓冲区试试。现在的现象是:1024--->2048后,依旧会跳转到“硬件异常中断”,只是显示多少内容有区别。 soyshell 发表于 2024-3-27 10:12
那我扩大上传缓冲区试试。现在的现象是:1024--->2048后,依旧会跳转到“硬件异常中断”,只是显示多少内容 ...
你的xxx.S启动文件的栈大小要加大。是你上传缓存大小的3倍试试。 按照硬汉意思。RTT中 #define BUFFER_SIZE_UP (4096) , stm32f924xx.s中应该是Stack_Size EQU 0x00004000 吗?也就是说: RTT中使用1K,启动文件中,应该差不多是 4K? 按照硬汉意思。RTT中 #define BUFFER_SIZE_UP (4096) , stm32f924xx.s中应该是Stack_Size EQU 0x00004000 吗?也就是说: RTT中使用1K,启动文件中,应该差不多是 4K? soyshell 发表于 2024-3-27 13:12
按照硬汉意思。RTT中 #define BUFFER_SIZE_UP (4096) , stm32f924xx.s中应该是Stack_Size E ...
根本原因就是这个,他占用了一个非常大的局部变量
你调整后,正常不
#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” 之间的比例应该是多少? 两个参数需要同步改变吗? soyshell 发表于 2024-3-28 09:18
#define BUFFER_SIZE_UP (4096)// Size of the buffer for terminal output...
这两个之间貌似没有太大的关系,主要是注意SEGGER_RTT_PRINTF_BUFFER_SIZE和栈大小。
页:
[1]