实验目的:
了解RT-Thread的命令行工具Finsh Shell组件 掌握Finsh Shell的基本使用方法;
掌握使用Finsh Shell观察RT-Thread内核对象运行时信息的方法;
实验设计:
Finsh是RT-Thread 的shell组件,通过它能够直接在shell中调用系统函数,访问系统变量;接受C语言中大多数运算符(包括指针运算符)进行简单计算;通过定义指针(函数)变量并指向某特定地址,可以完成匿名函数调用的功能。表面感觉简单,内部实则非常复杂和强大。它包含了一个可接受C语言表达式的shell系统,而且被实现成类似于一个编译器,实现了纯手工编写的完整词法分析,语法分析,然后产生中间二进制代码,最后放到虚拟机中运行。对于用户而言,主要有以下功能:
(1) 获取系统运行时信息,如各种RT-Thread内核对象的动态信息。 (2) 能够对任意寄存器和内存地址进行读写操作
(3) 能够直接在shell中调用系统函数,访问系统变量 在该实验设计中,我们主要实验功能(1)。
系统配置:
在例程源代码中,系统配置已经完毕,首先是修改了rtconfig.h文件,将使用Finsh组件的宏打开
其次将Finsh组件的源文件加入到工程中编译
输出信息:
编译程序,将生成的目标文件烧写到开发板后运行,然后通过串口输出可以看到如图所示的信息,除了输出RT-Thread的字符Logo外,最后还有一行finsh>>提示符,这表明Finsh shell已经运行起来。
在Finsh>>提示符下就可以接受字符输入,尝试输入list()命令,然后敲回车,看看效果吧。请注意list命令后面的括号一定不能少。
从图中可以看出,list()命令的作用就是将系统中支持的所有shell命令都打印出来。有点类似与其他系统中的help命令。有了这些命令和描述信息,我们就可以深入内核,查看它们的信息咯。 先看下当前系统中运行的线程信息吧。敲入list_thread(),回车。
从上图看出这是当前系统实际运行时所有线程信息。当前系统中运行着两个线程。线程的名称,优先级,运行状态,堆栈地址,堆栈大小,最大使用堆栈,剩余运行tick时间,错误信息都一览无遗,呵呵,是不是很方便。
同样的,我们再看下系统中信号量的信息,敲入list_sem(),回车。
如上图所示,描述的就是当前系统中所有的信号量的信息,其中描述了信号量的名称,值,以及挂起在该信号量上的线程数量。
再看下系统中的定时期信息,敲入list_timer(),回车。
当然,我们也能查看当前系统中有些什么设备,敲入list_device(),回车。
同理,其他的内核信息也可以通过类似的方法获取到,下表是一些常用的命令的描述。 命令 描述 Version 列表当前使用RT-Thread的版本信息 List_thread 列表所有线程信息 List_sem 列表所有信号量信息 List_event 列表所有事件信息 List_mutex 列表所有互斥量信息 List_mailbox 列表所有邮箱信息 List_msgqueue 列表所有消息队列信息 List_mempool 列表所有内存池信息 List_timer 列表所有定时器信息 List_device 列表所有设备信息 List 列表所有系统命令信息
通过以上实验,是不是觉得使用Finsh很方便?其实,Finsh的更强大功能还等着你挖掘呢,自己先尝试一下吧。
因篇幅问题不能全部显示,请点此查看更多更全内容