硬汉嵌入式论坛

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

[有问必答] Segger RTT 卡住任务了。。。

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2018-8-27 08:38:02 | 显示全部楼层 |阅读模式
本帖最后由 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调试模式都无法定位问题。

回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
发表于 2018-8-27 08:57:00 | 显示全部楼层
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-8-27 09:22:47 | 显示全部楼层

不是这个原因,几种设置都试过了。
    /* ÅäÖÃí¨μà 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);
回复

使用道具 举报

27

主题

272

回帖

353

积分

高级会员

积分
353
发表于 2018-8-27 10:39:22 | 显示全部楼层
这就不清楚了
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2018-8-27 10:57:02 | 显示全部楼层
还在持续分析中。。。。已经定位到这个函数了。
  /* Start the USB OTG core */     
   HCD_Init(pdev , coreID);  
这个函数进去了,出不来了。。。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-3-3 21:47:19 | 显示全部楼层
佬你好,我的开启的dwt后再中断还是显示Error: rtt: Failed to read from up-channel 0,你之前也有报这个错吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 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? ... 8809&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 2024-3-26 17:45:41 | 显示全部楼层
为什么连续打印一段时候后,407会进入“硬件异常中断”? 将“上传缓冲区”从1024改为2048后,会多运行一段时间。使用的函数是:SEGGER_RTT_printf(0, "Start\r\n");
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2024-3-27 09:48:00 | 显示全部楼层
soyshell 发表于 2024-3-26 17:45
为什么连续打印一段时候后,407会进入“硬件异常中断”? 将“上传缓冲区”从1024改为2048后,会多运行一段 ...

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

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 2024-3-27 10:04:43 | 显示全部楼层
谢谢硬汉。有个RTT使用的上传和下载栈,应该是自动清空的吧?RTT view已经将数据显示出来,下位机中的上传缓冲区是不是就应该被清空了?RTT的源程序中是不是有“清空缓冲”的命令?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

buffer清空不需要用户管理。
回复

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 2024-3-27 10:12:07 | 显示全部楼层
那我扩大上传缓冲区试试。现在的现象是:1024--->2048后,依旧会跳转到“硬件异常中断”,只是显示多少内容有区别。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2024-3-27 12:02:10 | 显示全部楼层
soyshell 发表于 2024-3-27 10:12
那我扩大上传缓冲区试试。现在的现象是:1024--->2048后,依旧会跳转到“硬件异常中断”,只是显示多少内容 ...

你的xxx.S启动文件的栈大小要加大。是你上传缓存大小的3倍试试。
回复

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 2024-3-27 13:12:03 | 显示全部楼层
按照硬汉意思。RTT中 #define BUFFER_SIZE_UP      (4096)   , stm32f924xx.s中应该是  Stack_Size      EQU     0x00004000 吗?  也就是说: RTT中使用1K,启动文件中,应该差不多是 4K?
回复

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 2024-3-27 13:12:13 | 显示全部楼层
按照硬汉意思。RTT中 #define BUFFER_SIZE_UP      (4096)   , stm32f924xx.s中应该是  Stack_Size      EQU     0x00004000 吗?  也就是说: RTT中使用1K,启动文件中,应该差不多是 4K?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2024-3-28 08:53:41 | 显示全部楼层
soyshell 发表于 2024-3-27 13:12
按照硬汉意思。RTT中 #define BUFFER_SIZE_UP      (4096)   , stm32f924xx.s中应该是  Stack_Size      E ...

根本原因就是这个,他占用了一个非常大的局部变量

你调整后,正常不

24.jpg
回复

使用道具 举报

4

主题

285

回帖

297

积分

高级会员

积分
297
发表于 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” 之间的比例应该是多少? 两个参数需要同步改变吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 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和栈大小。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 22:37 , Processed in 0.215008 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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