12345下一页
返回列表 发新帖我要提问本帖赏金: 100.00元(功能说明)

[方案相关] HC32F072之nr_micro_shell移植+源码

[复制链接]
28042|94
 楼主| caizhiwei 发表于 2023-5-20 19:59 | 显示全部楼层 |阅读模式
本帖最后由 caizhiwei 于 2023-5-20 19:58 编辑

#申请原创# @21小跑堂 @21ic小喇叭
全网首发,硬核!
周末在家,顺便把前段时间研究的一个开源代码库的移植案例整理分享出来,希望给坛友们提供便利。我移植的mcu是小华HC32F072。

1. 开源nr_micro_shell介绍

       在进行调试和维护时,常常需要与单片机进行交互,获取、设置某些参数或执行某些操作,nr_micro_shell正是为满足这一需求,针对资源较少的MCU编写的基本命令行工具。虽然RT_Thread组件中已经提供了强大的finsh命令行交互工具,但对于ROM、RAM资源较少的单片机,finsh还是略显的庞大,在这些平台上,若仍想保留基本的命令行交互功能,nr_micro_shell是一个不错的选择。
nr_micro_shell具有以下优点
1.占用资源少,使用简单,灵活方便。使用过程只涉及两个shell_init()和shell()两个函数,无论是使用RTOS还是裸机都可以方便的应用该工具,不需要额外的编码工作。
2.交互体验好。完全类似于linux shell命令行,当串口终端支持ANSI(如Hypertrm终端)时,其不仅支持基本的命令行交互,还提供Tab键命令补全,查询历史命令,方向键移动光标修改功能。
3.扩展性好。nr_micro_shell为用户提供自定义命令的标准函数原型,只需要按照命令编写命令函数,并注册命令函数,即可使用命令。
nr_micro_shell和相同配置下的finsh (finsh不使用msh)占用资源对比
[td]
原始工程添加nr_micro_shell增加量添加finsh增加量
ROM63660+3832+26908
RAM4696+1104+1304
代码仓库地址: https://gitee.com/nrush/nr_micro_shell

2. 移植步骤
      这么好这么优秀的一个代码库,我们该如何移植呢?如果你学会了移植到某一款mcu上之后,其他mcu都是照葫芦画瓢的哦。
2.1 使用git工具下载源码到你的工程目录下:
2439164689c006a485.png
然后把源码添加到mdk工程中,如下图所示:
5245664689c3eb0386.png
2.2 这里我们就要修改源码中的接口函数了
2.2.1 修改nr_micro_shell_config.h文件中的一个宏定义和一个uart发送字符的接口函数:
7068264689d62e169f.png
2.2.2 在ansi_port.c中,修改接口如下:
798564689e30c9fce.png

2.2.3  此时基本就改好了,你会发现有了发送,接收怎么办呢?
此时需要再自己工程中的串口接收中断函数中添加一个shell(ch);接口函数:
9413164689eb5f3e87.png
值得注意的是,此接口也可以不放在中断里面哦,也可以放在RTOS中的某个任务里。

2.2.4 万事俱备,只欠东风啦!那是啥呢?聪明的你应该想到了,那就是初始化!调用 shell_init();接口即可。

3. 测试验证
9205864689f8f2727a.png

4. 扩展: 如何添加自己的命令呢?源码nr_micro_shell_commands.c中有模板:
我自己添加的cmd如下:

  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] ls command
  3. */
  4. void shell_ls_cmd(char argc, char *argv)
  5. {
  6.         unsigned int i = 0;
  7.         if (argc > 1)
  8.         {
  9.                 if (!strcmp("cmd", &argv[argv[1]]))
  10.                 {
  11.                         for (i = 0; nr_shell.static_cmd[i].fp != NULL; i++)
  12.                         {
  13.                                 shell_printf("%s",nr_shell.static_cmd[i].cmd);
  14.                                 shell_printf("\r\n");
  15.                         }
  16.                 }
  17.                 else if (!strcmp("-v", &argv[argv[1]]))
  18.                 {
  19.                         shell_printf("version date: 20230326.\r\n");
  20.                 }
  21.                 else if (!strcmp("-h", &argv[argv[1]]))
  22.                 {
  23.                         shell_printf("useage: ls [options]\r\n");
  24.                         shell_printf("options: \r\n");
  25.                         shell_printf("\t -h \t: show help\r\n");
  26.                         shell_printf("\t -v \t: show version\r\n");
  27.                         shell_printf("\t cmd \t: show all commands\r\n");
  28.                 }
  29.         }
  30.         else
  31.         {
  32.                 shell_printf("ls need more arguments!\r\n");
  33.         }
  34. }

  35. /*
  36. argc是参数的数目
  37. argv存储每个参数的起始地址和内容
  38. */
  39. void shell_reboot_cmd(char argc, char *argv)
  40. {
  41.    if (!strcmp("reboot", &argv[argv[0]]))
  42.    {
  43.            shell_printf("MCU Reboot now!!\r\n");
  44.            MCU_soft_Reset();        
  45.    }
  46. }

  47. /*显示各种输入信号的信息*/
  48. void shell_speed_cmd(char argc, char *argv)
  49. {
  50.         if (!strcmp("speed", &argv[argv[0]]))
  51.         {               
  52.                 shell_printf("\r\n供电电压 = %d (MV) 油量 = %02d%%",Analog.Bat_vol,Analog.Oil_precent);
  53.                 shell_printf("\r\n轴流滚筒转速 = %d rpm",Drum.Speed);
  54.                 shell_printf("\r\n割台上下限范围 = [%d - %d]",Getai.Limit_Down_height,Getai.Limit_UP_height);
  55.         }
  56. }

  57. /**
  58. * [url=home.php?mod=space&uid=247401]@brief[/url] 显示配置参数
  59. */
  60. void shell_config_opt_cmd(char argc, char *argv)
  61. {
  62.     if (argc > 1)
  63.         {
  64.                 if (!strcmp("erase", &argv[argv[1]]))
  65.                 {
  66.                         shell_printf("Erease Flash Sector [250 ~ 254] !!\r\n");
  67.                         Flash_SectorErase(Sector250_BaseAddr);
  68.                         Flash_SectorErase(Sector251_BaseAddr);
  69.                         Flash_SectorErase(Sector253_BaseAddr);
  70.                         Flash_SectorErase(Sector254_BaseAddr);
  71.                         Flash_SectorErase(Sector255_BaseAddr);
  72.                 }
  73.                 else if (!strcmp("read", &argv[argv[1]]))
  74.                 {
  75.                         shell_printf("dump flash config.\r\n");
  76.                 }
  77.         }
  78.         else
  79.         {
  80.                 shell_printf("config need another arguments!\r\n");
  81.                 shell_printf("You can press 'config erase' or 'config read'!\r\n");
  82.         }
  83. }



  84. #ifdef NR_SHELL_USING_EXPORT_CMD
  85. NR_SHELL_CMD_EXPORT(ls, shell_ls_cmd);
  86. NR_SHELL_CMD_EXPORT(test, shell_test_cmd);
  87. #else
  88. const static_cmd_st static_cmd[] =
  89.         {
  90.                 {"ls", shell_ls_cmd},
  91.                 {"config", shell_config_opt_cmd},
  92.         {"reboot", shell_reboot_cmd},
  93.         {"speed", shell_speed_cmd},
  94.                 {"\0", NULL}};
  95. #endif
至此,整个移植过程就完美结束啦。 831156468b5a5b604f.jpg

如果还有什么疑问,欢迎留言讨论哦。
工程源码在附件中,欢迎下载。
游客,如果您要查看本帖隐藏内容请回复

操作视频:

打赏榜单

21小跑堂 打赏了 100.00 元 2023-05-25
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

666这个很6  发表于 2023-5-26 08:13
以HC32F072芯片为依托,移植nr_micro_shell,步骤清晰,讲解细致,配以清晰的视频,容易理解借鉴,感谢分享  发表于 2023-5-25 13:44
 楼主| caizhiwei 发表于 2023-5-20 20:08 | 显示全部楼层
沙发,
gaoyang9992006 发表于 2023-5-20 20:40 | 显示全部楼层
非常奈斯,这有图有真相,有代码的。
liszt99 发表于 2023-5-22 08:39 | 显示全部楼层
学习学习
wifi99 发表于 2023-5-22 08:40 | 显示全部楼层
学习学
lzm2008 发表于 2023-5-22 08:53 | 显示全部楼层
非常棒!
gyh974 发表于 2023-5-22 09:56 | 显示全部楼层
调试好工具
00750 发表于 2023-5-22 13:38 | 显示全部楼层
非常棒!
凡人8000 发表于 2023-5-22 15:08 | 显示全部楼层
没了解这个,学习一下,感谢分享!
最爱01间 发表于 2023-5-26 12:12 | 显示全部楼层
有意思!!
 楼主| caizhiwei 发表于 2023-5-26 18:14 | 显示全部楼层

非常有意思哦,和linux一样丝滑
铁蛋锅 发表于 2023-5-31 06:26 | 显示全部楼层
学习学习
westzg 发表于 2023-6-9 15:55 | 显示全部楼层
感谢楼主分享
wengh2016 发表于 2023-6-10 09:49 | 显示全部楼层
在单片机上体验linux shell命令行
lihuami 发表于 2023-6-10 10:07 | 显示全部楼层
nr_micro_shell 对于 ROM 和 RAM 的资源占用比较少
claretttt 发表于 2023-6-10 10:54 | 显示全部楼层
实现的一个简易的shell               
timfordlare 发表于 2023-6-10 11:03 | 显示全部楼层
玩单片机也要使用命令行工具               
hudi008 发表于 2023-6-10 11:12 | 显示全部楼层
主要用于在嵌入式系统中进行调试和控制。
usysm 发表于 2023-6-10 11:21 | 显示全部楼层
nr_micro_shell 就是一个命令行交互工具,可以读取用户的命令输入,解析并执行命令对应的函数。
uytyu 发表于 2023-6-10 11:30 | 显示全部楼层
可以通过串口 连接到嵌入式设备,实现对设备的远程调试和控制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

100

主题

856

帖子

16

粉丝
快速回复 在线客服 返回列表 返回顶部