HC32F072之nr_micro_shell移植+源码

全网首发,硬核!
周末在家,顺便把前段时间研究的一个开源代码库的移植案例整理分享出来,希望给坛友们提供便利。我移植的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工具下载源码到你的工程目录下:

然后把源码添加到mdk工程中,如下图所示: 



2.2 这里我们就要修改源码中的接口函数了


2.2.1 修改nr_micro_shell_config.h文件中的一个宏定义和一个uart发送字符的接口函数:


2.2.2 在ansi_port.c中,修改接口如下:
 

2.2.3  此时基本就改好了,你会发现有了发送,接收怎么办呢?
此时需要再自己工程中的串口接收中断函数中添加一个shell(ch);接口函数:

 



值得注意的是,此接口也可以不放在中断里面哦,也可以放在RTOS中的某个任务里。

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

3. 测试验证



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


/**

 * [url=home.php?mod=space&uid=247401]@brief[/url] ls command

 */

void shell_ls_cmd(char argc, char *argv)

{

        unsigned int i = 0;

        if (argc > 1)

        {

                if (!strcmp("cmd", &argv[argv[1]]))

                {

                        for (i = 0; nr_shell.static_cmd[i].fp != NULL; i++)

                        {

                                shell_printf("%s",nr_shell.static_cmd[i].cmd);

                                shell_printf("\r\n");

                        }

                }

                else if (!strcmp("-v", &argv[argv[1]]))

                {

                        shell_printf("version date: 20230326.\r\n");

                }

                else if (!strcmp("-h", &argv[argv[1]]))

                {

                        shell_printf("useage: ls [options]\r\n");

                        shell_printf("options: \r\n");

                        shell_printf("\t -h \t: show help\r\n");

                        shell_printf("\t -v \t: show version\r\n");

                        shell_printf("\t cmd \t: show all commands\r\n");

                }

        }

        else

        {

                shell_printf("ls need more arguments!\r\n");

        }

}



/*

argc是参数的数目

argv存储每个参数的起始地址和内容

*/

void shell_reboot_cmd(char argc, char *argv)

{

   if (!strcmp("reboot", &argv[argv[0]]))

   {

           shell_printf("MCU Reboot now!!\r\n");

           MCU_soft_Reset();        

   }

}



/*显示各种输入信号的信息*/

void shell_speed_cmd(char argc, char *argv)

{

        if (!strcmp("speed", &argv[argv[0]]))

        {                

                shell_printf("\r\n供电电压 = %d (MV) 油量 = %02d%%",Analog.Bat_vol,Analog.Oil_precent);

                shell_printf("\r\n轴流滚筒转速 = %d rpm",Drum.Speed);

                shell_printf("\r\n割台上下限范围 = [%d - %d]",Getai.Limit_Down_height,Getai.Limit_UP_height);

        }

}



/**

* [url=home.php?mod=space&uid=247401]@brief[/url] 显示配置参数

 */

void shell_config_opt_cmd(char argc, char *argv)

{

    if (argc > 1)

        {

                if (!strcmp("erase", &argv[argv[1]]))

                {

                        shell_printf("Erease Flash Sector [250 ~ 254] !!\r\n");

                        Flash_SectorErase(Sector250_BaseAddr);

                        Flash_SectorErase(Sector251_BaseAddr);

                        Flash_SectorErase(Sector253_BaseAddr);

                        Flash_SectorErase(Sector254_BaseAddr);

                        Flash_SectorErase(Sector255_BaseAddr);

                }

                else if (!strcmp("read", &argv[argv[1]]))

                {

                        shell_printf("dump flash config.\r\n");

                }

        }

        else

        {

                shell_printf("config need another arguments!\r\n");

                shell_printf("You can press 'config erase' or 'config read'!\r\n");

        }

}







#ifdef NR_SHELL_USING_EXPORT_CMD

NR_SHELL_CMD_EXPORT(ls, shell_ls_cmd);

NR_SHELL_CMD_EXPORT(test, shell_test_cmd);

#else

const static_cmd_st static_cmd[] =

        {

                {"ls", shell_ls_cmd},

                {"config", shell_config_opt_cmd},

        {"reboot", shell_reboot_cmd},

        {"speed", shell_speed_cmd},

                {"\0", NULL}};

#endif

至此,整个移植过程就完美结束啦。 

 



如果还有什么疑问,欢迎留言讨论哦。
---------------------
作者:caizhiwei
链接:https://bbs.21ic.com/icview-3303434-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值