ffxz 发表于 2009-10-18 10:02:17

RT-Thread RTOS组件:强大的finsh shell

通常,大家在接触RT-Thread时,都会以为这是一个最不重要的组件,可有可无,而且在产品中也不会用到,用了还担心是否会对系统造成不必要的开销,甚至影响到系统的稳定性、可靠性。

做为单片机系统的研发人员,可能大多使用JTAG来调试程序,出问题了就祭出仿真器的尚方宝剑,似乎宝剑一出,任何前方的艰难险阻就会因难而解。只是有一类情况(而且这种情况还是困扰系统稳定的最大的问题),问题出现的几率并不是100%的,时间上非确定,环境上非确定。例如一个系统存在内存泄漏,如何去确定它是否存在内存泄漏呢,难道等到内存全部使用完了才发觉?

看看RT-Thread + FinSH的解决方式:(请选择STM3210分支中携带finsh的版本)
FinSH最大的用处在于,在系统运行的时刻获取系统的信息,虽然信息的显示非常原始(通过串口等输出字符串信息),但分析这些原始的信息却最能找到有用的信息。例如上面的list_mem()命令,显示的就是系统的内存占用状况:
total memory: 59376
used memory: 0
maximum allocated memory: 0

显示的信息包括:
总的可用内存,59376字节
当前使用的内存,0字节
历史中最大的分配内存,0字节

再能够在线的执行一些命令后,如果怀疑系统中存在内存泄漏,过一段时间就可以再运行list_mem()命令以显示系统内存占用情况。如果used memory一直持续的增长,那么就极有可能发生了内存泄漏。

FinSH是一类非常特殊的shell系统,即不类似于DOS的命令行用法,也不类似于UNIX类的sh用法。而是一种看起来陌生而实际上非常非常熟悉的C语言模式:在命令行状态下,一条命令相对于C中的一条语句。例如下面的语句:
unsigned int *gpiof_bsrr;
unsigned int *gpiof_brr;
gpiof_bsrr= 0x40011c10; /* GPIOF 的BSRR地址 */
gpiof_brr   = 0x40011c14; /* GPIOF 的BRR地址*/
*gpiof_bsrr = 0x80;      /* Set Pin7   */
*gpiof_brr= 0x80;      /* Reset Pin7 */

如果GPIOF做了相应的配置:
*gpiof_bsrr = 0x80,代表的是点亮连接在PF7上的LED
*gpiof_brr= 0x80,代表的是熄灭连接在PF7上的LED

我们让它在finsh下一条条执行:

每条执行完,下面会打印出一系列的数字,这些代表的是执行这些表达式的结果,例如
gpiof_brr= 0x40011c14;
执行完会把gpiof_brr的值显示出来,如果是一个函数,那么显示的是这个函数的返回值。执行完后,PF7上的LED也相应的点亮和熄灭。

完全图文版本请见附件
点击此处下载 ourdev_492949.pdf(文件大小:180K) (原文件名:finsh shell.pdf)

ffxz 发表于 2009-10-18 10:11:31

finsh虽然强大,但它的实现也需要代价,相当于一个小型的编译器 + 虚拟机

这套代码成型于2005年,它是计算机系本科高年级课程 编译原理 的真实实现,
包括了手工编写的词法分析、文法分析、语法树构造、中间代码生成、虚拟机等一套完整的编译技术。

finsh实现得比较独立,所以可以说是RT-Thread中最容易拆卸的组件,
对于一般开发人员来说,直接使用即可以了,不一定需要仔细了解其内部结构。
当然,如果正在学习编译原理,可以配合代码对编译原理进行相应的验证,其手工编写的词法分析、文法分析,代码逻辑非常清晰(注释中有相应的EBNF表达式)

djyos 发表于 2009-10-18 10:50:07

吃国家粮的863计划没拉出像样的屎。
不花纳税人一分钱的民间却开始突破。
恭喜楼主。

aozima 发表于 2009-10-18 11:18:42

最近新加的自动完成和历史记录非常好用,
不过退格还有BUG....

ffxz 发表于 2009-10-18 12:13:01

【3楼】 aozima
上次你说的退格bug,我好像重现不了啊

ffxz 发表于 2009-10-18 12:19:39

【2楼】 djyos
无所谓纳税不纳税,技术是无_界限的,不需要为技术的发展找理由。

RT-Thread会尽快的推出英文版本,登录freshmeat.net、sourceforge.net、www.osnews.com

yplin27 发表于 2009-10-18 13:50:00

支持楼主,帮顶

songzi2018 发表于 2009-10-19 12:33:10

为什么楼主的RTGUI还不发布基于arm9的正式版?顶一下

ffxz 发表于 2009-10-19 13:01:32

arm9?没板子,没平台

RTGUI实际上已经放在google svn,有心人自然能够发现的。

ztom 发表于 2009-10-19 17:28:55

确实很强大,调试变得很直观,最初我还以为是fish shell,我这里也有退格和不能删除的问题。

ffxz 发表于 2009-10-19 19:39:28

退格、不能删除的问题

能否给个复现步骤?上次aozimo说了下,但我一直不能复现。

ztom 发表于 2009-10-19 21:19:36

就是在超级终端finsh提示符后面不论打什么文字都不能修改删除,我也不清楚aozimo说的是不是这个。

aozima 发表于 2009-10-19 21:22:52

可能跟使用的终端有关...看了改进的源码,好像和WIN下面用超级终端的回退键的键码不一样....
而超级终端也有几种回退键设置,但试了都不行

ffxz 发表于 2009-10-19 21:58:53

哦,是这么回事?!我用的是putty,我换个超级终端试试。

gzhuli 发表于 2009-10-19 22:00:54

putty可以连串口么?

ffxz 发表于 2009-10-26 13:41:12

【11楼】 ztom
【12楼】 aozima
svn版本已经支持超级终端的退格键,不过超级终端退格后不能在终端里把前一个字符删除掉,好像超级终端不认\b

【14楼】 gzhuli 咕唧霖
putty后面几个版本都能够使用串口了,我一般用它接linux的console串口。

aozima 发表于 2009-10-26 14:17:43

OK!已测试OK!
这下打命令效率要高多了.
终端设置:
./bbs_upload/files_21/ourdev_496041.jpg

另外,超级的终端类型默认为自动检测,设置为TTY即可删除字符.

licheng0620 发表于 2011-11-22 22:49:58

mark

Stephen_kk 发表于 2011-11-23 16:05:51

这个网站好强大,技术讲的都很深入

cnsxgh 发表于 2011-12-2 15:12:54

首先我是个新手,我输入set_date(2011,06,28)
电脑出来
set_date(2011,06,28)
        0, 0x00000000
finsh>>
finsh>>
不知为啥。

zouyf12 发表于 2011-12-2 23:43:23

说RTT是中国人 的骄傲一点也不为过。   


顶一个

122402902 发表于 2011-12-3 00:00:08

我也在学习RT_THREAD 想用到项目中。
下面是我对API的一些小总结。先上sem之前部分的,后面的继续更上。想问下书什么时候正式发布。看书比看电脑要爽的多。
点击此处下载 ourdev_701060M1NDZU.txt(文件大小:6K) (原文件名:RT_Thread_API.txt)

tiancaigao7 发表于 2011-12-5 18:02:58

确实,期待着RTT的书籍推出。这么好的系统支持的人有多,出书的话,效率应该不是问题。

marrylilili 发表于 2011-12-20 16:32:30

顶一下!!
页: [1]
查看完整版本: RT-Thread RTOS组件:强大的finsh shell