擦鞋匠 发表于 2017-11-27 14:25:58

rtthread开启finsh shell后,使用securityCRT无法打印输出。

问题前序:
额,rtt最近似乎很火热,我也想凑凑热闹...
一直是搞单片机开发,包括51和stm32,没玩过Linux,也没接触过shell等感觉高大上的东西,甚至都securityCRT都没用过(我之前一直使用串口调试助手...)。
我想试着使用rtt自带的shell组件(这玩意其它如ucos,freertos等都没有,所以很吸引人)。弄了半天,出不来数据,特来求助!!!

问题描述:
如下是官网教程中的一张图:我就想实现这种效果。


我已经开启finsh组件,部分宏代码如下。


实验现象:
我使用普通串口调试助手,至少可以打印rtt logo。如下图。


可是只要打开securityCRT,整个线程似乎都被阻塞了(我开了2个线程,2个led交替闪烁,一旦打开securityCRT,led都不闪烁了)。



最后,恳请路过的大神帮忙指点迷津,再次感谢了......



security 发表于 2017-11-27 14:35:14

这个跟 secureCRT 应该没关系。
看看 USB 转串口模块吧。

不然你就关闭 shell 模块,再怎么说,也要有信息打出来的。

擦鞋匠 发表于 2017-11-27 14:44:03

security 发表于 2017-11-27 14:35
这个跟 secureCRT 应该没关系。
看看 USB 转串口模块吧。



首先,感谢security大神指教!

主要集中在2个问题:
<1>我上面是有XCOM调试助手,至少有数据输出,为什么使用securityCRT就没输出(它们硬件底层是一样的啊)?
<2>为什么使用securityCRT会阻塞线程呢(关键我没找到具体在哪里阻塞的,很头疼!)?

fenglove 发表于 2017-11-27 14:48:12

貌似和RTT没有什么关系吧,检测一下软件和波特率设置

security 发表于 2017-11-27 14:50:53

擦鞋匠 发表于 2017-11-27 14:44
首先,感谢security大神指教!

主要集中在2个问题:


那就单步跟一下,检查一下串口是否有收到干扰数据。
如果一直干扰数据的话,且你的线程的优先级如果比 shell 低的话,就会受影响。

sunnydragon 发表于 2017-11-27 15:10:30

RT_USING_COMPONENTS_INIT 用了没有,如果用了,务必要使用 RTT 提供的链接文件。

强烈建议先用 RT-Thread 自己提供的工程进行测试

擦鞋匠 发表于 2017-11-27 15:30:54

sunnydragon 发表于 2017-11-27 15:10
RT_USING_COMPONENTS_INIT 用了没有,如果用了,务必要使用 RTT 提供的链接文件。

强烈建议先用 RT-Thread ...

首先,感谢sunnydragon大神。

基本上rtthread.h文件都是使用默认配置,我查看了下,RT_USING_COMPONENTS_INIT 宏是打开的。

“如果用了,务必要使用 RTT 提供的链接文件。”,请问大神,RTT提供的链接我文件是什么?我真不是很懂...感谢...

security 发表于 2017-11-27 15:33:00

擦鞋匠 发表于 2017-11-27 15:30
首先,感谢sunnydragon大神。

基本上rtthread.h文件都是使用默认配置,我查看了下,RT_USING_COMPONENTS ...

要在链接脚本文件里面,保留 init 模块,还有 shell 等模块。
不然很有可能被移除掉了。

你先看看 XCOM,有没有打出 init 之类的回显吧,没有打出的话,那就说明 init 模块有问题。

sunnydragon 发表于 2017-11-27 15:34:17

擦鞋匠 发表于 2017-11-27 15:30
首先,感谢sunnydragon大神。

基本上rtthread.h文件都是使用默认配置,我查看了下,RT_USING_COMPONENTS ...

IAR 的链接文件格式是 *.icf
KEIL 是 *.sct
GCC 是 *.ld

取决于你使用的编译器,开启组件初始化后,必须要在链接文件中定义好组件初始化函数存放的段。而这些在 KEIL/IAR 默认提供的链接文件中是没有的。所以我让你先把官方提供的工程用好。

擦鞋匠 发表于 2017-11-27 16:24:41

本帖最后由 擦鞋匠 于 2017-11-27 16:31 编辑

感谢security大神和sunnydragon大神:

使用的是官方给的例程。
先关闭securityCRT,单步进去,再打开securityCRT,然后单步或者全速,此时securityCRT可以输出rtt logo。否则就不能输出。这里的具体原因我不清楚(只能看表面现象)。
关键是我对finish shell这块知识没有深刻的理解,所以,感觉无从下手,很头疼。

不过,前面看任务调度,信号量,邮箱,消息队列,内存分配等源码,感觉不管是代码风格,还是其中数据结构和代码逻辑,似乎更加符合我的思维逻辑习惯(相对之前看过的ucos,freertos)。

security 发表于 2017-11-29 11:28:00

擦鞋匠 发表于 2017-11-27 16:24
感谢security大神和sunnydragon大神:

使用的是官方给的例程。


这种问题一般跟 SecureCRT 是没有关系的话,不然你可以换个新版本的 SecureCRT 试一下。
至少 SecureCRT + RT-Thread 的组合,我一直在用着,没碰过此种现象。
如果怀疑是工具的问题,那么就使用你可信赖的工具,先把系统调通过去,再来看 SecureCRT 的问题。

zhangyh89 发表于 2017-11-30 10:41:52

我用过putty试过,效果不错

y574924080 发表于 2017-11-30 22:45:17

你的输出里面只有版权信息,没有shell的PROMPT提示, 那估计是shell线程都没跑起来。

所以上面大家怀疑是初始化的问题。
如果使用的是自动初始化,可以在rtconfig.h里面加上
#define RT_DEBUG
#define RT_DEBUG_INIT 1
看看输出变化。有没有finsh_system_init输出。

或者你可以把初始化代码(application/main)这些贴出来。

或者学会看map文件, 看看finsh_system_init是否被优化了(如果优化了说明没有被调用。)

tuy0326 发表于 2017-12-1 00:47:35

自己搭建的工程吗?

biansf2001 发表于 2017-12-1 09:16:49

finsh和console是2码事
console是你可以调用rtprintf输出,但是它不是finsh,你需要打开RT_USING_FINSH

擦鞋匠 发表于 2017-12-1 09:46:15

tuy0326 发表于 2017-12-1 00:47
自己搭建的工程吗?

感谢大神回复。
是的,我是自己搭建的工程。前面有大神告知,需要考虑分散加载这块只是,我对这块不是很了解。
后来就使用官方的例程,但实验效果是一样的。
页: [1]
查看完整版本: rtthread开启finsh shell后,使用securityCRT无法打印输出。