一、前言
因为项目需求需要使用APM32F030R8该款芯片开发产品,因为rom(64k)和ram(8k)不多,所以使用了裸机开发,为了更好的调试,达到rt-thread finsh那种效果,我在网上查找到了一个开源比较小的shell(NR_MICRO_SHELL),也可以达到rt-thread,shell的效果,所以我决定移植他到我的程序上面。
NR_MICRO_SHELL开源代码获取地址:https://gitee.com/nrush/nr_micro_shell
二、移植过程
1、在git仓库获取到源码,其目录分布如下:
2、将inc 文件夹 和 src文件夹的源文件和头文件移植到自己的工程文件下,分布如下:
3、在工程内添加好头文件路径,开始编译,会出现编译错误,不要慌,因为 开源文件默认少了一个宏,这个需要自己定义。
在nr_micro_shell_config.h这个头文件中,可以根据自己需求配置,具体意义看文件注释。
根据错误,自己需要重新定义 NR_MICRO_SHELL_SIMULATOR 这个宏。具体如下
再次编译就没有错误了,接下来我们将nr_micro_shell初始化。shell需要使用uart驱动配置此处不声明,根据自己需求配置。
4、在初始化之前,在nr_micro_shell_config.h配置文件,如下。
这个宏配置的是指令是以空格结尾还是换行结尾有效,因为我用的是Xshell5,所以将其配置为1 \r结尾,根据自己的需求配置。
将上面shell_printf宏 改成自己的printf 打印,到此我们配置完成了,可以开始初始化了。
5、初始化,我们只需要在main文件加入shell_init(),这个初始化宏即可,到此nr_micro_shell就可以输出了,我们可以添加几行调试代码,如下。
int main(void)
{
unsigned int i = 0;
//匹配好结束符配置 NR_SHELL_END_OF_LINE 0
char test_line[] = "test 1 2 3\n"
/* 初始化 */
shell_init();
/* 初步测试代码 */
for(i = 0; i < sizeof(test_line)-1; i++)
{
shell(test_line[i]);
}
/* 正式工作代码 */
while(1)
{
if(USART GET A CHAR 'c')
{
/* nr_micro_shell接收字符 */
shell(c);
}
}
}
结果如下,证明初始化成功。
6、实现交互,需要串口接收中断函数调用shell()这个宏(根据自己程序,在串口接收中断函数处接收数据,传递给shell()这个宏,也可以使用轮询的机制),具体代码如下:
三、遇到小问题
1、在xshell终端输入指令,nr_micro_shell没有反馈回来指令字母,需要完成一条指令按回车才有反馈,输入指令过程中没有反馈,查看了一下源码,需要在此处修改一下代码,如下。
将上面NR_MICRO_SHELL_SIMULATOR这个宏判断去掉。
2、在使用TAB键补充的时候,会出现程序崩溃,需要在TAB处理函数处加入一下代码
解决以上两个问题后,NR_MICRO_SHELL就可以正常使用了。0.0