搜索
bottom↓
回复: 70
打印 上一主题 下一主题

[分享][交流]发一个控制台模块

  [复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2014-5-7 21:48:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Gorgon_Meducer 于 2014-5-8 23:12 编辑


傻孩子工作室出品

模块简介:
        这个控制台模块是一个使用全状态机编写的、移植性强的模块。
        模块内置help 与 clear两个命令。
        可以静态或者动态扩展需要的命令。
        支持上下方向键回溯历史命令功能,历史命令的保存数量可配置。
        支持F1 F3键回溯上一条历史命令功能,这个功能可以配置打开或者关闭。

效果图:
       

准备工作:
        你现在需要一个有串口、有两个独立按键、有独立LED指示灯的单片机系统。
        为了体现平台无关,请参考文档 《平台搭建》 搭建平台。
        该平台提供了串口收发函数、LED控制接口函数、独立按键读取函数。
        这样我们就拥有一个共同讨论的基础。
        我现在使用的是STM32F103C8T6的板子,提供了一个使用MDK编写的、基于STM32F103C8T6的范例。
        基于之前搭建的平台,代码移植起来是非常容易的。
        在平台的基础上,使用者需要提供两个函数来使用该模块:写数据函数、读取数据函数。
       

范例下载:
       
        使用MDK的软件仿真即刻体验 ~虽然不能实现F1 F3 / 方向键上下 / clear命令 等功能
       

模块下载:
       
        解压后可以看到:模块由console文件夹下的三个文件组成:console.c   console.h   app_cfg.h        

移植console模块:
        将模块文件夹复制到你工程的代码文件夹,然后包含console.c。
        提供写数据函数与读取数据函数:
        范例中:main.c提供了如下函数:
  1. bool console_serial_out(uint8_t chByte)
  2. {
  3.     return serial_out(chByte);
  4. }
  5. bool console_serial_in(uint8_t *pchByte)
  6. {
  7.     return serial_in(pchByte);
  8. }
复制代码

        在顶层app_cfg.h中通过如下插入宏来注册这两个函数:
  1. // console 读写数据插入宏
  2. #define CONSOLE_WRITE_BYTE(__BYTE) console_serial_out(__BYTE)
  3. extern bool console_serial_out(uint8_t chByte);

  4. #define CONSOLE_READ_BYTE(__BYTE) console_serial_in(__BYTE)
  5. extern bool console_serial_in(uint8_t *pchByte);
复制代码

        该app_cfg.h被console模块中的app_cfg.h包含;进而被console.c包含。       
        经过以上的步骤,console模块的移植工作就完成了。使用时,需包含头文件console.h

使用console模块:
        接口函数:
  1. // console_task 函数
  2. // 返回值: 状态机运行状态
  3. extern fsm_rt_t console_task(void);

  4. // 动态扩展命令消息地图注册函数
  5. // 参数:    ptMSG       -- 待注册的消息地图首指针
  6. //          chMSGNum    -- 待注册消息地图中消息的数量
  7. // 返回值:  true        -- 注册成功
  8. //          false       -- 参数错误
  9. extern bool console_register_command(const msg_t *ptMSG, uint8_t chMSGNum);
复制代码

        console_task 函数为console模块任务函数,该函数需要在主程序中被反复调用。
        console_register_command函数为动态扩展命令消息地图注册函数。

静态扩展命令:
        在顶层 app_cfg.h 中提供消息处理函数原型插入宏 CONSOLE_MSG_MAP_FUN_EXTERN
        提供方法举例:
  1. #define CONSOLE_MSG_MAP_FUN_EXTERN  \
  2. extern fsm_rt_t test_handler(const msg_t *ptMSG, uint8_t *pchStr, uint8_t chNum);
复制代码

        并且提供消息地图插入宏 CONSOLE_MSG_MAP_SET
        提供方法举例:
  1. #define CONSOLE_MSG_MAP_SET  { "test", &test_handler, "test -- this is a test command" }
复制代码


动态扩展命令:
        参见范例main.c中声明消息地图:
  1. /* 动态扩展命令消息地图 ------------------------------------------------ */
  2. const static msg_t s_tExpandMSGMap[] = {
  3.     { "expand", &expand_handler, "expand -- this is a expand command" },
  4.     { "abc", &abc_handler, "abc -- this is abc command" }
  5. };
复制代码

        编写处理函数:
  1. // expand 命令的处理函数
  2. // 参数:    ptMSG   -- 消息指针
  3. //          pchStr  -- 后续 token 指针
  4. //          chNum   -- 后续 token 数量
  5. // 返回值:  状态机运行状态
  6. static fsm_rt_t expand_handler(const msg_t *ptMSG, uint8_t *pchStr, uint8_t chNum)
  7. {
  8.     ……
  9. }

  10. // abc 命令的处理函数
  11. // 参数:    ptMSG   -- 消息指针
  12. //          pchStr  -- 后续 token 指针
  13. //          chNum   -- 后续 token 数量
  14. // 返回值:  状态机运行状态
  15. static fsm_rt_t abc_handler(const msg_t *ptMSG, uint8_t *pchStr, uint8_t chNum)
  16. {
  17.     ……
  18. }
复制代码

        注册扩展命令:
  1. console_register_command(s_tExpandMSGMap, UBOUND(s_tExpandMSGMap));
复制代码


配置历史命令回溯数量:
        通过在顶层app_cfg.h中提供插入宏实现:
  1. // 配置记录历史命令数量
  2. #define CONSOLE_HIS_CMD_NUM     10
复制代码

       

配置F1 F3回溯功能的开启与关闭:
        通过在顶层app_cfg.h中提供插入宏实现:
  1. // 配置命令重复功能
  2. #define CONSOLE_CMD_REPEAT_EN   ENABLED
复制代码

       

注意事项:
        1  console_task函数必须在主循环中被反复调用。
        2  扩展命令的处理函数不能阻塞。

接口文件console.h:
  1. /* console 模块的输出接口文件 */

  2. #ifndef __CONSOLE_H__
  3. #define __CONSOLE_H__

  4. /* 文件包含 ----------------------------------------------------------------- */
  5. #include".\app_cfg.h"

  6. /* 模块说明 ----------------------------------------------------------------- */
  7. // 使用本模块应在上层 app_cfg.h 中提供 写数据插入宏 CONSOLE_WRITE_BYTE(__BYTE)
  8. // 与读取数据插入红 CONSOLE_READ_BYTE(__BYTE)
  9. // 并且提供插入宏展开后的原型
  10. //
  11. // 应在上层 app_cfg.h 中提供用以配置最大命令字符数的 CONSOLE_CMD_CHAR_NUM 插入宏
  12. // 如没有提供该插入宏,会产生一条警告信息;并且默认配置为最大64字符数
  13. //
  14. // 应在上层 app_cfg.h 中提供用以配置是否需要重复功能 ( F1 F3 等 )
  15. // 的插入宏 CONSOLE_CMD_REPEAT_EN   ENABLED(1)--启用     DISABLED(0)--禁止
  16. // 如没有提供该插入宏,会产生一条警告信息;并且默认启用该功能
  17. //
  18. // 应在上层 app_cfg.h 中提供用以配置历史命令记录数量的插入宏
  19. // CONSOLE_HIS_CMD_NUM 至少为 1 每一条历史指令都将消耗 CONSOLE_CMD_CHAR_NUM + 2 字节RAM
  20. // 如没有提供该插入宏,会产生一条警告信息;并且默认保存4条历史指令
  21. //
  22. // 应在上层 app_cfg.h 中提供用以配置 token 分隔符的插入宏 CONSOLE_TOKEN_CODE
  23. // 提供方法举例:   #define CONSOLE_TOKEN_CODE  " ,;- ."
  24. // 如没有提供该插入宏,会产生一条警告系你系;并默认采用空格为 token 分隔符
  25. //
  26. // 静态扩展命令:
  27. // 在上层 app_cfg.h 中提供消息处理函数原型插入宏 CONSOLE_MSG_MAP_FUN_EXTERN
  28. // 提供方法举例:
  29. // #define CONSOLE_MSG_MAP_FUN_EXTERN  \
  30. // extern fsm_rt_t test_handler(const msg_t *ptMSG, uint8_t *pchStr, uint8_t chNum);
  31. // 并且提供消息地图插入宏 CONSOLE_MSG_MAP_SET
  32. // 提供方法举例:
  33. // #define CONSOLE_MSG_MAP_SET  { "test", &test_handler, "test -- this is a test command" }

  34. /* 类型定义 ----------------------------------------------------------------- */
  35. typedef struct _msg_t msg_t;
  36. typedef fsm_rt_t MSG_HANDLER(const msg_t *ptMSG, uint8_t *pchStr, uint8_t chNum);   // 消息处理函数类型

  37. struct _msg_t {
  38.     uint8_t *pchMsgStr;     // 消息
  39.     MSG_HANDLER *fnHandler; // 消息处理函数
  40.     uint8_t *pchHelpStr;    // 帮助信息指针
  41. };

  42. /* 输出接口 ----------------------------------------------------------------- */
  43. // console_task 函数
  44. // 返回值: 状态机运行状态
  45. extern fsm_rt_t console_task(void);

  46. // 动态扩展命令消息地图注册函数
  47. // 参数:    ptMSG       -- 待注册的消息地图首指针
  48. //          chMSGNum    -- 待注册消息地图中消息的数量
  49. // 返回值:  true        -- 注册成功
  50. //          false       -- 参数错误
  51. extern bool console_register_command(const msg_t *ptMSG, uint8_t chMSGNum);

  52. #endif

  53. /* EOF */
复制代码

        接口文件向外部提供了模块的使用说明以及需要用到的数据类型:消息类型的定义以及消息处理函数的原型。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

2
发表于 2014-5-7 21:59:53 | 只看该作者
mark ...........

出0入0汤圆

3
发表于 2014-5-7 22:03:38 | 只看该作者
可以有。。。。。。。。

出0入0汤圆

4
发表于 2014-5-7 22:04:10 | 只看该作者
mark!顶一下

出0入0汤圆

5
发表于 2014-5-7 22:06:41 | 只看该作者
                  

出0入0汤圆

6
发表于 2014-5-7 22:11:51 | 只看该作者
谢谢楼主分享,有空试一试!

出0入0汤圆

7
发表于 2014-5-7 22:22:20 | 只看该作者
我试图下载了一下,结果打不开MDK,打开后IDE就崩溃,顿时兴趣全无;楼主有空了,看看咋回事?还有别人碰到这问题了吗?

出0入0汤圆

8
 楼主| 发表于 2014-5-7 22:38:11 | 只看该作者
kinsno 发表于 2014-5-7 22:22
我试图下载了一下,结果打不开MDK,打开后IDE就崩溃,顿时兴趣全无;楼主有空了,看看咋回事?还有别人碰到 ...

我使用的是4.10版本的MDK;
刚刚我下载了试验一下,结果是可以打开的。

出0入0汤圆

9
发表于 2014-5-7 23:28:20 | 只看该作者
本帖最后由 cslrd 于 2014-5-7 23:29 编辑

同楼上一样,打不开
求楼主支招

出0入0汤圆

10
 楼主| 发表于 2014-5-8 06:15:46 来自手机 | 只看该作者
请问使用mdk的版本?

出0入0汤圆

11
 楼主| 发表于 2014-5-8 06:43:22 | 只看该作者
刚刚我在另一台电脑上面下载附件,也是可以打开的。
这个MDK的版本是4.12

出0入0汤圆

12
发表于 2014-5-8 07:07:45 | 只看该作者
catwill 发表于 2014-5-8 06:15
请问使用mdk的版本?

MDK版本是4.23  是否同C编译器版本有关?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

13
发表于 2014-5-8 07:22:48 来自手机 | 只看该作者
先顶,晚上看看。

出0入0汤圆

14
发表于 2014-5-8 07:25:20 来自手机 | 只看该作者
顶,很强悍的东西

出0入0汤圆

15
 楼主| 发表于 2014-5-8 07:26:22 | 只看该作者
cslrd 发表于 2014-5-8 07:07
MDK版本是4.23  是否同C编译器版本有关?

我也没有遇到过这样的问题……
我只能晚些时候再换台电脑试试看了

出0入0汤圆

16
发表于 2014-5-8 08:55:27 | 只看该作者
catwill 发表于 2014-5-8 07:26
我也没有遇到过这样的问题……
我只能晚些时候再换台电脑试试看了

刚才用uVision4.00a 可以打开,但是不带ARM编译器的。楼主可以用更高版本的MDK试一下是否有问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

17
发表于 2014-5-8 13:00:39 | 只看该作者
我试试我的版本倒是可以打开



另外我把它转成uVision3 格式,大家可以试试能不能打开 train.Uv2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

18
发表于 2014-5-8 13:06:06 | 只看该作者
标记,console控制台程序.

出0入0汤圆

19
发表于 2014-5-8 18:45:40 | 只看该作者
特地登录顶起~! 很强大的说 console 我本来打算自己弄一个的。。

出0入0汤圆

20
 楼主| 发表于 2014-5-8 20:08:46 | 只看该作者
cslrd 发表于 2014-5-8 08:55
刚才用uVision4.00a 可以打开,但是不带ARM编译器的。楼主可以用更高版本的MDK试一下是否有问题 ...

如果可以的话,请把出错版本的MDK安装文件发到bbzsdts@126.com
晚些时候我会在我的电脑上试验一下

出0入0汤圆

21
发表于 2014-5-8 22:58:15 | 只看该作者
本帖最后由 cslrd 于 2014-5-8 23:03 编辑
catwill 发表于 2014-5-8 20:08
如果可以的话,请把出错版本的MDK安装文件发到
晚些时候我会在我的电脑上试验一下 ...


安装文件太大了,我就不发了。你如果有时间可以去下载一个4.23版本的测试一下。PS:我下载了18楼提供uv3格式与uv2格式,可以打开。可能是因为LZ提供的是uv4格式的原因

出0入8汤圆

22
发表于 2014-7-27 22:44:41 | 只看该作者
楼主你好,我是个菜鸟,我试了这个程序的仿真,运行的很好……我想请教下为什么要有静态和动态扩展两种命令,能举例说明什么情况用静态,什么情况用动态吗?

出0入0汤圆

23
 楼主| 发表于 2014-7-28 08:42:01 | 只看该作者
静态是编译时决定的
动态是运行时决定的
大部分情况都可以用静态——除非你需要运行时改变的特性

出0入8汤圆

24
发表于 2014-7-28 14:08:23 | 只看该作者
catwill 发表于 2014-7-28 08:42
静态是编译时决定的
动态是运行时决定的
大部分情况都可以用静态——除非你需要运行时改变的特性 ...

谢谢楼主回复!
我明白了静态部分,还想请教下关于动态的问题:
所谓动态是不是说,可以在程序运行的任意时刻进行改变?
如果要进行改变的话,该怎么操作,是通过这个注册函数重新注册改变后的消息吗?  

    // 注册扩展命令
    console_register_command(s_tExpandMSGMap, UBOUND(s_tExpandMSGMap));

我这些问题问的很乱,楼主不要介意哈,因为俺水平太菜啦
楼主,希望你如果有闲暇时间的话,能再出个关于“需要运行时改变的特性”的范例吧,感觉这个功能很高级啊!(好像现有的范例没体现出这点,也可能是我没看出来
相信这样的话,会让更多的人,更容易的去理解你的作品,谢谢!

出0入0汤圆

25
发表于 2014-7-28 14:14:00 | 只看该作者
mark。。。。。。

出0入0汤圆

26
 楼主| 发表于 2014-7-29 14:14:52 | 只看该作者
Jmhh247 发表于 2014-7-28 14:08
谢谢楼主回复!
我明白了静态部分,还想请教下关于动态的问题:
所谓动态是不是说,可以在程序运行的任意 ...

所以说大部分的情况使用静态即可。
这个例子确实没有体现出动态的优势;确实没有用到运行时改变的特性。

通过这个
// 注册扩展命令
console_register_command(s_tExpandMSGMap, UBOUND(s_tExpandMSGMap));
即可在运行时改变——写两个消息地图即可

出0入0汤圆

27
 楼主| 发表于 2014-7-29 14:16:05 | 只看该作者
说实话……
我目前也不知道什么时候需要使用动态扩展

出0入8汤圆

28
发表于 2014-7-29 17:29:43 | 只看该作者
catwill 发表于 2014-7-29 14:16
说实话……
我目前也不知道什么时候需要使用动态扩展

哈哈,楼主真坦诚,现在缺这种品质的人太多了
这样的话,就等楼主知道了再分享一下吧……
另,虽然现在还搞不懂,我还是想请教下楼主,如果是动态的话,需不需要一个删除消息的函数呢?(现在已经有了注册函数)

出0入8汤圆

29
发表于 2014-7-29 17:38:20 | 只看该作者
catwill 发表于 2014-7-29 14:14
所以说大部分的情况使用静态即可。
这个例子确实没有体现出动态的优势;确实没有用到运行时改变的特性。
...

我刚又看了源码,动态扩展是通过下面这个指针实现的,这样的话应该是不需要删除消息的函数,
就像你说那样,写几个消息,通过注册函数去切换就好……没看仔细啊

const static msg_t *s_ptExpandMsgMap = NULL;    // 动态扩展消息地图指针
static uint8_t s_chExpandMSGNum = 0;            // 动态扩展消息数量

出0入0汤圆

30
发表于 2014-7-30 16:22:38 | 只看该作者
这个要支持一下,慢慢研究·······

出0入0汤圆

31
发表于 2014-12-21 21:28:06 | 只看该作者
小宝加油,四哥看好你

出0入0汤圆

32
发表于 2014-12-24 09:41:22 | 只看该作者
名师出高徒,有空再分析下源程序。 好学习下。

出0入0汤圆

33
发表于 2014-12-24 21:43:32 | 只看该作者
分析了一下,不得不说,楼主状态机用的真牛,算是学习了。

出0入0汤圆

34
发表于 2014-12-24 23:29:39 | 只看该作者
想问下楼主,这个消息地图中,
  1. // parse 消息地图
  2. typedef struct _msg_t msg_t;
  3. typedef fsm_rt_t MSG_HANDLER(const msg_t *ptMsg, uint8_t *pchStr, uint8_t chNum);   // 消息处理函数类型

  4. struct _msg_t {
  5.     uint8_t *pchMsgStr;     // 消息
  6.     MSG_HANDLER *fnHandler; // 消息处理函数
  7.     uint8_t *pchHelpStr;    // 帮助信息指针
  8. };

  9. const static msg_t c_tMsgMap[] = {      // 消息地图
  10.     { "help",  &help_handler, "help -- print all command" },
  11.     { "clear", &clear_handler, "clear -- clear the screen" },
  12.     CONSOLE_MSG_MAP_SET                 // 静态扩展命令插入宏
  13. };

  14. 那个&help_handler 和这个 &clear_handler   取函数地址为什么要用&,不是取函数名就可以取地址了么?
复制代码

出0入0汤圆

35
发表于 2014-12-25 01:12:01 | 只看该作者
slzm40 发表于 2014-12-24 23:29
想问下楼主,这个消息地图中,

我觉得c语法支持加上&和省略&,

但是加上&,让人第一眼就知道这个一个指针,

阅读源码的时候第一时间能得到更多信息,即便于阅读

出0入0汤圆

36
发表于 2014-12-25 11:20:29 | 只看该作者
y574924080 发表于 2014-12-25 01:12
我觉得c语法支持加上&和省略&,

但是加上&,让人第一眼就知道这个一个指针,

这个想法好,便于阅读,指明取址。

出0入0汤圆

37
发表于 2014-12-25 12:35:38 | 只看该作者
这个非常好,有时间试一下。

出0入0汤圆

38
发表于 2014-12-25 12:43:04 | 只看该作者
太好了,可以把我们用的换成这个了.真心感谢

出0入0汤圆

39
发表于 2014-12-25 12:49:16 | 只看该作者
这个相当给力~~~~

出0入0汤圆

40
发表于 2015-3-12 15:17:47 | 只看该作者
这个东东,非常好.准备下载下来好好改造.

出0入0汤圆

41
发表于 2015-8-1 16:11:06 | 只看该作者
牛逼,有空研究一下源码。消化消化!

出0入0汤圆

42
发表于 2015-8-7 15:21:16 | 只看该作者
想请教一下楼主
#define TOKEN_START         0
#define TOKEN_CHECK_BREAK   1
#define TOKEN_MOVE          2
#define TOKEN_RESET()       do { s_chState = 0; } while(0)
static fsm_rt_t token(uint8_t *pchStr, uint8_t *pchNum)
这个函数有什么作用?

出0入0汤圆

43
发表于 2015-8-9 07:54:16 | 只看该作者
随风允诺2015 发表于 2015-8-7 15:21
想请教一下楼主
#define TOKEN_START         0
#define TOKEN_CHECK_BREAK   1

将CONSOLE_TOKEN_CODE定义的标记转换成'\0'

出0入0汤圆

44
发表于 2015-8-9 08:07:06 | 只看该作者
嗯 不错

出0入0汤圆

45
发表于 2015-8-9 23:07:09 | 只看该作者
控制台模块  ,mark 一下

出0入0汤圆

46
发表于 2015-8-9 23:14:25 | 只看该作者
这个是好东西   谢谢分享。。  有空要试试

出0入0汤圆

47
发表于 2015-8-10 09:57:51 | 只看该作者
呵呵 好东西 是要收藏

出0入0汤圆

48
发表于 2015-8-27 10:36:00 来自手机 | 只看该作者
楼主,这个控制台占大概用多少ram,我用stm8总是报溢出

出0入296汤圆

49
发表于 2015-8-27 14:52:58 | 只看该作者
淋湿的鸡毛 发表于 2015-8-27 10:36
楼主,这个控制台占大概用多少ram,我用stm8总是报溢出

  你可以从以下几个地方来查找原因:
1、存储历史按键的部分是很消耗内存的,比如,如果你要保存过去5条历史输入,就需要64*5的存储器,你可以直接通过宏把这个功能关掉节省内存
2、命令行的最大长度应该也是可以用宏控制的,默认应该是64个字节,你可以改小,如果没有宏可以控制这个,请跟我一起鄙视作者
3、有很多const的东西应该是不占用SRAM的,如果占用了,你可以查查你用的编译器,然后找到对应的关键字确保他们没有占用不必要的SRAM
4、系统应该使用了FIFO来保存输入输出数据,可以缩小缓冲。

经过以上检查,我觉得对内存的占用不应该超过256个字节。

出0入0汤圆

50
发表于 2015-8-27 17:14:19 | 只看该作者
这份源码有做过详细分析。  感觉在回车之后,获取到命令,后面就不需要过度的使用状态机。  可以做详细的精简, 最后提供的handle接口,形如main那样,
handle(int argc,char *argv[]),在模块内部开一个数组指针,这样在handle里面获参数会更加方便。

出0入296汤圆

51
发表于 2015-8-27 17:24:00 | 只看该作者
slzm40 发表于 2015-8-27 17:14
这份源码有做过详细分析。  感觉在回车之后,获取到命令,后面就不需要过度的使用状态机。  可以做详细的精 ...

可能是有点过度,但也可以降低对处理器资源的占用,毕竟控制台是一个实时性要求非常低的任务,应该出让更多的
处理器时间给其他的状态机任务。

出0入0汤圆

52
发表于 2015-8-27 17:32:53 | 只看该作者
Gorgon_Meducer 发表于 2015-8-27 17:24
可能是有点过度,但也可以降低对处理器资源的占用,毕竟控制台是一个实时性要求非常低的任务,应该出让更 ...

可能的确是这方面的考虑,有时考虑到,一旦获取命令,就可以对命令进行整体解析,做尽快的回复。的确会占用一定的时间。 我作了比较多的改动,用于自己的工程。类似main参数,意思差不多,稍有点不同。


问下书月底放出来么?

  1. bool LedControl(const void *ptMSG, uint8_t argc, uint8_t *argv[])
  2. {
  3.           if(argc != 2 ){
  4.             console_print_str(console_led_warning);
  5.                   return true;
  6.           }
  7.   
  8.         if(console_cmp_str(argv[1], "on")){
  9.                 console_print_str("led on is done!");
  10.                 HalLedSet(HAL_LED_ALL,HAL_LED_MODE_ON);
  11.     }else if(console_cmp_str(argv[1], "off")){
  12.                 console_print_str("led off is done!");
  13.                 HalLedSet(HAL_LED_ALL,HAL_LED_MODE_OFF);
  14.         }else if(console_cmp_str(argv[1], "flash")){
  15.             console_print_str("led off is flash!");
  16.                 HalLedSet(HAL_LED_ALL,HAL_LED_MODE_FLASH);
  17.         }else{
  18.             console_print_str(console_led_warning);
  19.         }
  20.        
  21.     return true;
  22. }
复制代码

出0入0汤圆

53
发表于 2015-8-28 09:02:00 来自手机 | 只看该作者
Gorgon_Meducer 发表于 2015-8-27 14:52
你可以从以下几个地方来查找原因:
1、存储历史按键的部分是很消耗内存的,比如,如果你要保存过去5条 ...

我把历史消息改到一个,最大长度改为16,运行ok。谢谢傻孩子

出0入296汤圆

54
发表于 2015-8-28 13:32:32 | 只看该作者
本帖最后由 Gorgon_Meducer 于 2015-8-28 13:34 编辑
slzm40 发表于 2015-8-27 17:32
可能的确是这方面的考虑,有时考虑到,一旦获取命令,就可以对命令进行整体解析,做尽快的回复。的确会占 ...


Demo月底放出来。关于如何设计多任务的。另外,你把最后一个参数去掉我觉得没必要,毕竟确切地告诉你有多少个参数还是很有帮助的,也避免你重复计算。

出0入0汤圆

55
发表于 2015-8-28 16:06:14 | 只看该作者
Gorgon_Meducer 发表于 2015-8-28 13:32
Demo月底放出来。关于如何设计多任务的。另外,你把最后一个参数去掉我觉得没必要,毕竟确切地告诉你有多 ...

已经月底啦。 最后一个参数没有去掉。。我把它改成argc的名字了,以便和main 相似。  只不过是改成总的参数数量,而非后续参数数量。

出0入296汤圆

56
发表于 2015-8-30 23:39:20 | 只看该作者
slzm40 发表于 2015-8-28 16:06
已经月底啦。 最后一个参数没有去掉。。我把它改成argc的名字了,以便和main 相似。  只不过是改成总的参 ...

周一见……

出0入0汤圆

57
发表于 2015-8-31 01:16:32 | 只看该作者

哦哦哦,大事件哦

新书终于来了

出0入0汤圆

58
发表于 2016-3-4 09:26:37 | 只看该作者

mark!顶一下

出0入0汤圆

59
发表于 2016-3-18 12:55:15 | 只看该作者
标记标记。。。

出0入0汤圆

60
发表于 2016-3-29 21:49:20 来自手机 | 只看该作者
不错,准备试用

出0入0汤圆

61
发表于 2016-9-22 11:12:11 | 只看该作者
支持一下。牛。

出0入0汤圆

62
发表于 2016-9-22 11:35:43 | 只看该作者
顶一下贴~~~

出0入0汤圆

63
发表于 2016-10-13 10:16:30 | 只看该作者
真是牛人,顶顶顶

出0入0汤圆

64
发表于 2016-10-22 23:36:54 | 只看该作者
支持一下!功能很强大,不过编译了一下,ROM大概占10k左右,RAM大概3K左右。鱼与熊掌不可兼得阿。

出0入0汤圆

65
发表于 2016-12-17 09:15:31 | 只看该作者
你好,你能不能单独把这三个文件私发给我下,公司,家里都不能下载,应该不是网络原因。企鹅407214944,邮件也行。感激不尽!

出0入0汤圆

66
发表于 2016-12-17 09:30:57 | 只看该作者
int 发表于 2016-10-22 23:36
支持一下!功能很强大,不过编译了一下,ROM大概占10k左右,RAM大概3K左右。鱼与熊掌不可兼得阿。 ...

你好,能不能把你在这个帖子中下载的三个文件发给我下,我直接在这个帖子上下载,没法下载。非常感谢/407214944企鹅

出0入0汤圆

67
发表于 2016-12-19 10:45:52 | 只看该作者
guo407214944 发表于 2016-12-17 09:30
你好,能不能把你在这个帖子中下载的三个文件发给我下,我直接在这个帖子上下载,没法下载。非常感谢/407 ...

已发到邮箱,估计还是你的网络问题

出0入0汤圆

68
发表于 2016-12-28 09:25:10 | 只看该作者
多谢,学习了

出0入0汤圆

69
发表于 2018-7-8 10:03:15 | 只看该作者
多谢分享~~~~~~

出0入0汤圆

70
发表于 2018-12-19 15:07:48 | 只看该作者
好东西啊   看一次  顶一次   感谢分享。。

出0入0汤圆

71
发表于 2020-8-10 08:54:11 | 只看该作者
mark 串口控制台模块
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 06:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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