你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

再玩命令行

[复制链接]
黑皮男 发布时间:2017-5-9 21:48
本帖最后由 黑皮男 于 2017-5-24 19:29 编辑

基本情况:    手上已经有了好几块STM32,NUCLEO_F303,NUCLEO_L073,NUCLEO_L476,NUCLEO_F412。感谢社区,收集了这么多板子,满满的幸福感啊。之前也通过串口和NUCLEO进行了交互,但是在后续调试的过程中发现问题很多,经常死机。由于当时码代码水平有限,也就只能那样了,随着逐渐的深入学习码代码,相比之前来说,可以实现更多的功能了,也能更容易的理解各位大咖写的代码了。现在再来发表一片试用的帖子,这次不是使用一块板子,而是两块,L073和L476。所搭建的代码同时支持这两块开发板,实现了串口命令行。先来张效果图
捕获.PNG
代码结构:
ecode
       |-common
       |-drivers
       |-library
          |-OS
             |-FreeRTOS
       |-platform
       |-targets
          |-TARGET_STM32L0
              |-BSP
              |-CMSIS
             |-common
              |-NUCLEO_L073
              |-STM32L0xx_HAL_Driver
          |-TARGET_STM32L4
             |-BSP
              |-CMSIS
              |-common
             |-NUCLEO_L476
              |-STM32L4xx_HAL_Driver

       |-user
     以上列出了主要的代码目录,借鉴了一下mbed,整个target来决定目标板。target目录主要是对不同的目标板进行封装,然后提供统一的接口函数。
所有平台相关的代码都在platform目录中,目前实现的功能有命令行,pwm,serial,timer,platform_driver。像mbed这样的软件平台提供的接口函数很友好,所以这里也借鉴了一下,例如pwm功能,有period_us,period_ms,period_pulsewidth_us,period_pulsewidth_ms这样的接口,对于使用很方便,虽然都是借鉴,但是这也是一种进步,看的多了,也就慢慢会写了,以后就会慢慢行程自己的习惯。
    此外不得不说,前人都趟过不知几遍浑水所总结的经验,真的没有必要自己再从头走一遍,拿来用,这样才能更快的完成新功能,这次所完成的命令行是基于双向量表来完成的,这里借鉴了一下linux平台下的list实现方法,真的是太经典了,自己之前写了一些简单的链表结构,感觉很混乱,还是大咖们写的经典啊。
命令行的实现:
命令行其实就是对一串字符串进行解析,然后根据解析的结果找到对应的函数并执行。这个就是最基本的思路。
    实现命令行可以分解成,字符串输入字符指令和参数解析命令匹配和执行这几部分
先看一下命令行的结构体,
  1. struct ecode_cli_dev{
  2.     struct list_head cli_entry;//强大的链表功能由此实现
  3.     const char *name;
  4.     int rxlen;
  5.     char rxbuf[CLI_BUF_SIZE];
  6.     struct stdioex_device *stdio;//由此获取数据的输入输出句柄
  7.     int flag;
  8.     void *private_data;//一些私有数据,尚未用到
  9. };
复制代码
然后是命令的结构体
  1. struct cli_command{
  2.     const char *name;
  3.     const cli_command_handle_t handle;
  4.     const char *help;
  5. };

  6. struct cli_commands_list{
  7.     struct list_head entry;//强大的链表功能
  8.     struct cli_command *commands;
  9. };
复制代码


接下来看一下命令匹配部分,(又开始贴代码了),list_for_each,强大的list由此开始,首先是串口数据接收,接收完一行数据后,解析出指令的命令名称和参数,命令名称传入此函数进行命令匹配,如果命令名匹配成功则进行执行相应的命令。这里的每个链表节点都是指向一个命令数组,每个数组中都是不等数量的命令。
  1. struct cli_command * ecode_cli_match_command(const char *name)
  2. {
  3.     struct list_head *commands;
  4.     struct cli_command *command=NULL;
  5.    
  6.     list_for_each(commands, &cli_commands_head)
  7.     {
  8.         command = ((struct cli_commands_list *)commands)->commands;
  9.         if(command!=NULL)
  10.         {
  11.             while(command->name!=NULL)
  12.             {
  13.                 if(0==strcmp(command->name, name))
  14.                 {
  15.                     return command;
  16.                 }
  17.                 command++;
  18.             }

  19.         }
  20.     }
  21.     return NULL;
  22. }
复制代码


完整的代码放到了github上了http://github.com/ArnoYuan/ecode,有点大,就不上附件了,剩下的代码也不一一介绍了。

非常感谢QianFan (相关gcc+makefile编译的帖子https://www.stmcu.org.cn/module/foru ... 53&highlight=ubuntu,虽然是在ubuntu环境下编译,但是windows也可以搭建出linux的编译环境,需要交叉编译工具gcc,git附带的linux命令行和mingw的make),参考了其相关的帖子,支持了gcc+makefile编译,同时也能够使用printf,只不过nano.specs目前还不能使能,虽然我的makefile写的不怎么样,每次都会重新编译,但还是能用的。




评分

参与人数 1 ST金币 +10 收起 理由
MrJiu + 10 非常好啊!!!!强烈支持!!!.

查看全部评分

收藏 7 评论15 发布时间:2017-5-9 21:48

举报

15个回答
哈佛祖安智 回答时间:2017-5-9 23:28:03
帮顶
epochal 回答时间:2017-5-10 07:17:30
谢谢分享!
creep 回答时间:2017-5-10 08:34:38
支持!!!!!!!!
freeelectron 回答时间:2017-5-10 09:27:49
还有字符回显哦
黑皮男 回答时间:2017-5-10 09:49:59

这个还是有的,只是简单的回显,没做过多处理
黑皮男 回答时间:2017-5-10 09:50:14
多谢支持
QianFan 回答时间:2017-5-10 13:18:16

其实uboot已经支持stm32了,可以弄一个
黑皮男 回答时间:2017-5-10 13:25:38
QianFan 发表于 2017-5-10 13:18
其实uboot已经支持stm32了,可以弄一个

可以 考虑一下
斜阳__ 回答时间:2017-5-10 14:57:38
mark一下
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版