硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6077|回复: 11
收起左侧

[STM32H7] 分享一个在STM32H743项目中应用的开源shell --->letter-shell

  [复制链接]

7

主题

74

回帖

100

积分

初级会员

积分
100
发表于 2019-9-9 09:54:42 | 显示全部楼层 |阅读模式
一个体积极小的嵌入式shell


letter-shell  :https://github.com/NevermindZZT/letter-shell/issues功能
  • 命令自动补全,使用tab键补全命令
  • 命令长帮助,使用help [command]显示命令长帮助
  • 长帮助补全,输入命令后双击tab键补全命令长帮助指令
  • 快捷键,支持使用Ctrl + A~Z组合按键直接调用函数
  • shell变量,支持在shell中查看和修改变量值,支持变量作为命令参数





还有这个作者 基于C语言的json数据映射解析库  cson : https://github.com/NevermindZZT/cson

简介
CSON是一个简单的cJSON的二次封装,相比于使用原生cJSON一层一层解析的方式,CSON采用模型映射的方式,使用模型将结构体的特征进行描述,然后根据模型,将json数据直接解析成结构体,免去使用原生cJSON需要多次调用API的复杂性,可以很大程度减少代码冗余,增加代码逻辑性。
CSON的模型映射借鉴了高级语言(比如说Java)的反射机制,通过建立数据模型,记录结构体的元素,类型,偏移,然后直接在内存层面进行操作,对C语言提供类似于gson这样的高效json解析工具

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-9-9 11:19:00 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

16

主题

87

回帖

135

积分

初级会员

积分
135
发表于 2019-9-9 13:39:35 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

16

主题

87

回帖

135

积分

初级会员

积分
135
发表于 2019-9-30 15:48:07 | 显示全部楼层
非常感谢分享。这个正好需要!
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2019-10-4 14:27:45 | 显示全部楼层
感谢分享,有用
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2020-8-6 12:45:22 | 显示全部楼层
谢谢分享,6666666666
回复

使用道具 举报

0

主题

18

回帖

18

积分

新手上路

积分
18
发表于 2020-8-6 14:23:01 | 显示全部楼层
感谢!!!!   <2020.08.06 - 14:23>
回复

使用道具 举报

0

主题

43

回帖

43

积分

新手上路

积分
43
发表于 2021-9-23 14:48:56 | 显示全部楼层
学习学习                                          
回复

使用道具 举报

3

主题

1227

回帖

1236

积分

至尊会员

积分
1236
发表于 2021-12-20 20:35:35 | 显示全部楼层
  1. static Shell shell;
  2. static char shellBuffer[512] __ALIGNED(4) ;

  3. struct vx_ringbuffer vxRing;
  4. static vx_uint8_t VxRingBuffer[128] __ALIGNED(4) ;

  5. static TX_EVENT_FLAGS_GROUP shellEventFlag;
  6. static volatile uint8_t shellModuleInit_OK = 0;
  7. //static SemaphoreHandle_t shellMutex;

  8. /**
  9. * @brief 用户shell写
  10. *
  11. * @param data 数据
  12. * @param len 数据长度
  13. *
  14. * @return short 实际写入的数据长度
  15. */
  16. short userShellWrite(char *data, unsigned short len)
  17. {
  18.     User_UART_Send(data, len);
  19.     return len;
  20. }


  21. /**
  22. * @brief 用户shell读
  23. *
  24. * @param data 数据
  25. * @param len 数据长度
  26. *
  27. * @return short 实际读取到
  28. */
  29. short userShellRead(char *data, unsigned short len)
  30. {
  31.     /* 目前,shell的解读任务,一次只能get一个字节,这里忽略参数:len */
  32.     return vx_ringbuffer_getchar(&vxRing, (vx_uint8_t *)data);
  33. }

  34. /**
  35. * @brief 驱动层接口RingBuffer写函数,将字符设备的接收数据,缓存至RingBuffer
  36. *        并释放OS Event,通知Shell 线程来解析数据。
  37. *
  38. * @param pbuf 字符设备待写入数据
  39. * @param len 数据长度
  40. *
  41. * @return NULL
  42. */
  43. void userWriteShellRingbuffer(uint8_t *pbuf, uint16_t len)
  44. {
  45.     if(0x55 == shellModuleInit_OK)
  46.     {
  47.         vx_ringbuffer_put(&vxRing, pbuf, len);
  48.         /* release flag to shell task */
  49.         if (tx_event_flags_set(&shellEventFlag, 0x01, TX_OR) != TX_SUCCESS)
  50.         {
  51.             VX_ASSERT(1);
  52.         }
  53.     }
  54. }


  55. /**
  56. * @brief 用户shell上锁
  57. *
  58. * @param shell shell
  59. *
  60. * @return int 0
  61. */
  62. int userShellLock(Shell *shell)
  63. {
  64.     //xSemaphoreTakeRecursive(shellMutex, portMAX_DELAY);
  65.     return 0;
  66. }

  67. /**
  68. * @brief 用户shell解锁
  69. *
  70. * @param shell shell
  71. *
  72. * @return int 0
  73. */
  74. int userShellUnlock(Shell *shell)
  75. {
  76.     //xSemaphoreGiveRecursive(shellMutex);
  77.     return 0;
  78. }

  79. /**
  80. * @brief 用户shell初始化
  81. *
  82. */
  83. void userShellInit(void)
  84. {
  85.     //shellMutex = xSemaphoreCreateMutex();

  86.     shell.write = userShellWrite;
  87.     shell.read = userShellRead;
  88.     //shell.lock = userShellLock;
  89.     //shell.unlock = userShellUnlock;
  90.     shellInit(&shell, shellBuffer, 512);
  91.     /* user ringBuffer init */
  92.     vx_ringbuffer_init(&vxRing, VxRingBuffer, 128);

  93.     /* Create the event flags group.  */
  94.     if (tx_event_flags_create(&shellEventFlag, "ShellEvent Flag") != TX_SUCCESS)
  95.     {
  96.         VX_ASSERT(1);
  97.     }

  98.     shellModuleInit_OK = 0x55;
  99. }

  100. /**
  101. * @brief 用户shell线程入口函数,目前ShellTask调用的read()接口,一次解析一个Byte,
  102. *        而uart驱动层使用了DMA_RX接收控制台串口数据,中间使用RingBuffer来做缓冲,
  103. *        那么,为了提高效率,在uart驱动层调用RingBuffer写接口(一次可能多个字节)后,
  104. *        触发OS的预定Event通知userShellThread Task, 此处调用 shellTask;在shellTask
  105. *        内部,循环读取RingBuffer数据后,退出循环,回到任务主体,重新等待uart驱动层数据。
  106. *
  107. * @param NULL
  108. *
  109. * @return int 0
  110. */
  111. void userShellThread_Entry(ULONG thread_input)
  112. {
  113.     ULONG   actual_flags = 0;

  114.     userShellInit();

  115.     while(1)
  116.     {
  117.         if (tx_event_flags_get(&shellEventFlag, 0x01, TX_OR_CLEAR,
  118.                                &actual_flags, TX_WAIT_FOREVER) != TX_SUCCESS)
  119.         {
  120.             VX_ASSERT(1);
  121.         }
  122.         else
  123.         {
  124.             shellTask((void *)&shell);
  125.         }
  126.     }
  127. }
复制代码
回复

使用道具 举报

3

主题

1227

回帖

1236

积分

至尊会员

积分
1236
发表于 2021-12-20 20:37:13 | 显示全部楼层
Letter Shell 在ThreadX下,工作的非常不错。AC6 编译环境。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2022-10-10 17:30:21 | 显示全部楼层

可以给参考一下demo吗
回复

使用道具 举报

1

主题

61

回帖

64

积分

初级会员

积分
64
发表于 2023-5-24 10:44:26 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 07:03 , Processed in 0.200545 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表