1.简介
xcmd是一款单片机命令行工具,移植十分方便,并且对flash与ram占用很小,旨在为单片机提供一个能够快速搭建且占用资源很小的命令行工具,可以大大加快单片机程序调试工作,它有一下几个优点。
- 移植十分简单
- 资源占用很小
- 支持历史记录
- 支持命令自动补全
- 支持注册快捷键
- 支持 xcmd_cmd_register()/xcmd_key_register方法注册命令或按键
- 支持 XCMD_EXPORT_CMD()/XCMD_EXPORT_KEY()方法直接导出命令或按键,不需要额外运行注册函数
2. 效果展示
3.开源路径
xcmd 已经有在esp32上移植的例子
https://gitee.com/two_salted_eggs/xcmd.git
4. 编译xcmd自带的esp32例程
cd xcmd/example/esp_idf
idf.py build
编译好后下载到我们的esp32板子中,连接串口我们可以到xcmd的信息
此时我们按下tab键或者输入help,会打印如下信息
图中都是xcmd自带的一些命令;
4. 移植
xcmd 已经有在esp32上移植的例子了,我们就来分析一下xcmd在esp32上如何移植;移植的代码主要时main.c中:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "xcmd.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "test.h"
int cmd_get_char(unsigned char *ch) #给xcmd提供esp32的输出接口
{
*ch = getc(stdin);
return 1;
}
int cmd_put_char(unsigned char ch) #给xcmd提供esp32的输出接口
{
putchar(ch);
return 1;
}
void app_main(void)
{
xcmd_init(cmd_get_char, cmd_put_char); #将输入、输出接口注册给xcmd
test_cmd_init(); #这个接口中提供了一些测试命令
test_keys_init(); #这个接口中提供了部分键盘操作接口
while(1)
{
xcmd_task(); #xcmd执行接口
vTaskDelay(pdMS_TO_TICKS(10));
}
}
5. 注册我们自己命令
移植xcmd的目的就是增加我们命令,方便我们调试设备;接下来就看看如何添加命令:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "xcmd.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "test.h"
int cmd_get_char(unsigned char *ch)
{
*ch = getc(stdin);
return 1;
}
int cmd_put_char(unsigned char ch)
{
putchar(ch);
return 1;
}
static int test1(int argc, char* argv[]) //增加测试命令test1 的处理函数
{
xcmd_print(TX_GREEN "test1 txt_color = GREEN \r\n" TX_DEF); //打印绿色字体
return 0;
}
static int test2(int argc, char* argv[]) //增加测试命令test2 的处理函数
{
xcmd_print(TX_RED "test2 txt_color = RED \r\n" TX_DEF); //打印红色字体
return 0;
}
static xcmd_t tcmds[] = //将命令 和 处理函数关联起来
{
{"test1", test1, "print hello 1", NULL},
{"test2", test2, "print hello 1", NULL},
};
void app_main(void)
{
xcmd_init(cmd_get_char, cmd_put_char);
test_cmd_init();
test_keys_init();
xcmd_cmd_register(tcmds, sizeof(tcmds)/sizeof(xcmd_t)); //将命令注册到 xcmd 中
while(1)
{
xcmd_task();
vTaskDelay(pdMS_TO_TICKS(10));
}
}
编译下载到板子后的串口效果:
展示命令执行效果