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

再玩命令行

[复制链接]
黑皮男 发布时间:2017-5-9 21:48
本帖最后由 黑皮男 于 2017-5-24 19:29 编辑
- g$ d% `& d, L5 E/ \# t0 J* ^4 p. h) J) P& a, d- ~
基本情况:    手上已经有了好几块STM32,NUCLEO_F303,NUCLEO_L073,NUCLEO_L476,NUCLEO_F412。感谢社区,收集了这么多板子,满满的幸福感啊。之前也通过串口和NUCLEO进行了交互,但是在后续调试的过程中发现问题很多,经常死机。由于当时码代码水平有限,也就只能那样了,随着逐渐的深入学习码代码,相比之前来说,可以实现更多的功能了,也能更容易的理解各位大咖写的代码了。现在再来发表一片试用的帖子,这次不是使用一块板子,而是两块,L073和L476。所搭建的代码同时支持这两块开发板,实现了串口命令行。先来张效果图* A5 s- [; T% d
捕获.PNG 1 o& r% I! ~' R
代码结构:+ o' Q* V- k3 N- [) v1 S
ecode
0 ]$ A" H/ s+ n0 x8 k: x/ Z       |-common$ P) f$ [) i, e6 x( k+ l* Z
       |-drivers
) N; \$ W  [  ]( |* S/ L) u       |-library
( k. J( D# Z3 o$ W# }7 S$ r          |-OS6 W/ j  I3 V6 Z* x
             |-FreeRTOS
4 u8 }0 t6 @. t- ~& o: n9 R       |-platform( [- ~! g, M: Y7 d2 h- D
       |-targets& G& H+ k2 P  G* C
          |-TARGET_STM32L0
4 ]; l" g  r, V6 ^3 C  G              |-BSP; Q( s' `6 V+ B7 Y. L$ `  q
              |-CMSIS: ~' T" Y- J  H: Y3 m$ h% H# M
             |-common
# C3 y; g* [3 X* D/ ^              |-NUCLEO_L0735 L  a) P. P. L  Q
              |-STM32L0xx_HAL_Driver% ?6 v7 j* A/ p6 ?+ @3 s7 g, @
          |-TARGET_STM32L48 h( ^* `) C$ T! Y$ S, ?! E
             |-BSP, {$ I2 y; L+ n+ S/ d
              |-CMSIS0 o! {+ u6 {6 w8 U- t( S
              |-common0 F. N8 i5 r$ P
             |-NUCLEO_L476: h5 a4 p6 v% J6 D) s4 W& s
              |-STM32L4xx_HAL_Driver8 p+ k) Z. {7 d; _
1 z; Y1 b  t$ I' f3 i+ ~
       |-user
. `5 I7 Y# R+ a; g( ^0 L& R     以上列出了主要的代码目录,借鉴了一下mbed,整个target来决定目标板。target目录主要是对不同的目标板进行封装,然后提供统一的接口函数。
% b. F+ b  G$ e8 P8 N; J所有平台相关的代码都在platform目录中,目前实现的功能有命令行,pwm,serial,timer,platform_driver。像mbed这样的软件平台提供的接口函数很友好,所以这里也借鉴了一下,例如pwm功能,有period_us,period_ms,period_pulsewidth_us,period_pulsewidth_ms这样的接口,对于使用很方便,虽然都是借鉴,但是这也是一种进步,看的多了,也就慢慢会写了,以后就会慢慢行程自己的习惯。. g! \+ g/ G5 `& F4 L5 P
    此外不得不说,前人都趟过不知几遍浑水所总结的经验,真的没有必要自己再从头走一遍,拿来用,这样才能更快的完成新功能,这次所完成的命令行是基于双向量表来完成的,这里借鉴了一下linux平台下的list实现方法,真的是太经典了,自己之前写了一些简单的链表结构,感觉很混乱,还是大咖们写的经典啊。
2 `, v; F& a) B- L7 X. v命令行的实现:
  p9 G1 L3 S$ q2 F6 m) b 命令行其实就是对一串字符串进行解析,然后根据解析的结果找到对应的函数并执行。这个就是最基本的思路。6 a! q+ P8 M% x. H- b+ a
    实现命令行可以分解成,字符串输入字符指令和参数解析命令匹配和执行这几部分
4 w: V9 o. O# Q9 I先看一下命令行的结构体,/ R1 o+ w3 ^: K4 K$ C  o* \  U$ c
  1. struct ecode_cli_dev{2 o' q- h5 W' c( x. _  z
  2.     struct list_head cli_entry;//强大的链表功能由此实现
    0 U; H* D; z% y& e1 O
  3.     const char *name;
    + N: R& F# D2 s2 E( V9 u5 j
  4.     int rxlen;- X% }) z1 }9 t
  5.     char rxbuf[CLI_BUF_SIZE];( a+ u4 s. A5 i' x
  6.     struct stdioex_device *stdio;//由此获取数据的输入输出句柄
    3 I! |8 v2 |6 W. Y/ G
  7.     int flag;" a  O2 S$ ~/ b  \8 X7 E/ G, x& p0 t
  8.     void *private_data;//一些私有数据,尚未用到
      I: \9 [6 Y8 O+ a
  9. };
复制代码
然后是命令的结构体' a$ b+ e& p2 Q/ |  F- M& z
  1. struct cli_command{
    & p! r; T7 R( ^: L1 u+ O; n  Y
  2.     const char *name;# g3 [2 T3 o' J" p' B  n8 H
  3.     const cli_command_handle_t handle;! n# ?5 c1 V& }1 p* @: p
  4.     const char *help;
    7 V* O# u! o7 Y
  5. };( K6 G$ }' C# L3 c9 ]" }
  6. $ l6 F/ [- L& J
  7. struct cli_commands_list{
    9 b' |" S# G$ I  L. U$ ]& n
  8.     struct list_head entry;//强大的链表功能6 O- ]7 W8 b6 Z! ], ?; q; X) w
  9.     struct cli_command *commands;/ s. E+ c) _- P7 X7 \' \$ ~
  10. };
复制代码

. ?1 q3 Y" I9 J/ s+ W; s, R& a  G4 O2 s
接下来看一下命令匹配部分,(又开始贴代码了),list_for_each,强大的list由此开始,首先是串口数据接收,接收完一行数据后,解析出指令的命令名称和参数,命令名称传入此函数进行命令匹配,如果命令名匹配成功则进行执行相应的命令。这里的每个链表节点都是指向一个命令数组,每个数组中都是不等数量的命令。   n3 _1 y. w+ K* y
  1. struct cli_command * ecode_cli_match_command(const char *name)
    ( X/ O2 w6 Y; S) t5 _5 @; S; T
  2. {2 L4 s. F/ I: y8 Y
  3.     struct list_head *commands;
    - j8 J" I2 F2 z- T* n
  4.     struct cli_command *command=NULL;: c% H4 r7 L: Q* y
  5.     6 ?. m) k3 v4 `- T0 j
  6.     list_for_each(commands, &cli_commands_head)
    - h& Q; `% z8 |2 o' f& y3 t. R
  7.     {
    5 G/ v! M4 w  I% M# S
  8.         command = ((struct cli_commands_list *)commands)->commands;
    5 s: R7 G# ?+ }: C/ x. S. d8 J
  9.         if(command!=NULL); w/ W+ r/ O4 e! A/ W" \! X4 n6 s5 Y( p
  10.         {. H% F: I# Q6 A; K+ r# U  S
  11.             while(command->name!=NULL)# j: u: Q6 `1 e4 {
  12.             {+ U; M; M* d) Q( m
  13.                 if(0==strcmp(command->name, name))6 k4 M. g3 x+ I- i' w
  14.                 {) O: K3 e: ^3 C: z! X  X& u  M" z
  15.                     return command;# \  u! c0 l! E8 ~5 p8 C
  16.                 }2 n3 `* t6 [# y0 D4 @
  17.                 command++;' M& y" N8 R0 n7 D$ M( B7 o$ [
  18.             }
    ; T4 R4 S# ~0 Q2 O% @

  19. ; R( `- `! q5 Z2 g
  20.         }: @" z8 v5 v1 @) T0 _
  21.     }' w( y/ X) Y* U9 s- X8 N8 a
  22.     return NULL;
    * D+ |% }) n  K; G! K, v. j8 A# Y
  23. }
复制代码
4 g* {2 @: k: P# J
% S" A+ P; k" u3 l9 \
完整的代码放到了github上了http://github.com/ArnoYuan/ecode,有点大,就不上附件了,剩下的代码也不一一介绍了。
, G) E$ {/ U. v: S. `* z' U" k- A% t$ o
非常感谢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写的不怎么样,每次都会重新编译,但还是能用的。
% U) Z% z; f5 X) b) j; n4 M4 x3 D% R( O- a4 I6 G' o) p
  f4 k2 i  L6 D

3 n( K9 `2 l# ]5 d% ?- J* A3 W' ^, |. Y9 n6 K- k3 K

评分

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

查看全部评分

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

举报

15个回答
Stm32McuLover 回答时间: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
freeelectron 发表于 2017-5-10 09:27% R( D) I* q# T0 W5 C* y  j
还有字符回显哦
" K) L8 j0 _4 N0 C  o
这个还是有的,只是简单的回显,没做过多处理
黑皮男 回答时间:2017-5-10 09:50:14
多谢支持
qianfan 回答时间:2017-5-10 13:18:16

  O; [+ Q+ ~" Z# K2 A1 V其实uboot已经支持stm32了,可以弄一个
黑皮男 回答时间:2017-5-10 13:25:38
QianFan 发表于 2017-5-10 13:189 o1 j5 A1 g: v  q! a1 l- d
其实uboot已经支持stm32了,可以弄一个
4 c6 }4 j' z2 V  l$ h- ]- ~! H4 b
可以 考虑一下
斜阳 回答时间:2017-5-10 14:57:38
mark一下
Xinfeng 回答时间:2017-5-11 09:12:34
非常棒
zbber 回答时间:2017-5-11 09:29:17
好帖子顶一顶!感谢楼主7 B+ ~3 {* |  A. ]
海绵宝宝233 回答时间:2017-5-18 13:11:42
很不错,有空学习一下
一卡车龙眼仔z 回答时间:2017-10-27 20:56:55
请问楼主做过在linux下移植mbed os 到stm开发板吗?+ R( T1 T: z! z: y( y
五哥1 回答时间:2017-10-28 01:36:44
支持楼主
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版