在这里,我先 DISS 一下这篇文章https://zhuanlan.zhihu.com/p/141409031还有这份代码https://github.com/jiejieTop/cmd-parser。
为什么 DISS 这份文章和代码呢?
缘由是这样的,我需要个如同终端这样的字符解释器,根据我输入的字符来调用不同的函数,对板子进行调试,搜索了一些词条,但都是关于Power Shell亦或者是Unix shell的命令表格,跟我的需求都不搭边,唯一符合的就只有以上的这个知乎的文章链接。
一开始我看见了这个符合我预期的东西还是挺开心的,但是点进GitHub仓库一看,好家伙,几个issue都没有处理,关键是这几个issue都是关于代码移植以后各种报错、跑不起来,还有几个pull request都没有处理,这完全是没人管的一个东西。再细看代码,发现在line:67处有这么一句,
printf("%s -->%s\n",index->cmd,index->desc);而这个index的定义是这样的
typedef void (*cmd_handler)(void);
typedef struct cmd {
const char* cmd;
const char* cmd_mess;
unsigned int hash;
cmd_handler handler;
} cmd_t;
static void _list(void)
{
cmd_t *index;
for (index = _cmd_begin; index < _cmd_end; index = _get_next_cmd(index)) {
printf("%s -->%s\n",index->cmd,index->desc);
}
}于是我自己写了这个能满足我需求的终端。
创建于2024-11-11 20:44
修改时间2024-11-18 6:37
原本在ESP32上使用这个链表命令解析器用得还挺好的,直到更换了SRAM更低的MCU,比如我最近用的这个WCH-571F,只要一旦启用了BLE功能,动不动就会出现堆栈踩踏的现象,导致原本申请的堆空间被破坏导致程序跑飞了。
无奈之下只好再搞个HASH版本的命令解析器,解决了字符串占用大量堆空间的问题,也简化了节点的结构复杂度,进一步减少对SRAM的占用。
后面发现WCH-571F的SRAM还是太有限(18KB)了,想要遍历BLE服务都做不了,而且即便我用了这个版本的命令解析,依旧会有部分命令被覆盖,又转而用WCH-582M(32KB)才缓解了这个问题。
修改时间2025-10-02 18:34