移植指南
本指南将帮助你将 ctsehll 移植到不同的硬件平台。
ESP32
已上线 idf registry.
STM32
参考 stm32 port。
芯片通用移植指南
准备工程
准备一个可以正常使用 uart 发送和接收数据的工程。
添加文件
将下载的仓库复制到你的工程目录,并添加到编译构建系统中,推荐使用CMake,直接set需要的功能,并引入仓库中的CMakeLists.txt,添加${ctshell_srcs}、${ctshell_incs}、${CTSHELL_DEFINITIONS}即可。
实现 IO 接口
你需要定义并填充 ctshell_io_t 结构体。
write:串口发送函数。应当是阻塞发送,或者确保数据被拷贝到发送缓冲区。
get_tick:(可选的) 获取系统毫秒级时间戳,用于
ctshell_delay。如果没有系统时钟,可以填 NULL,但在 Shell 脚本中延时功能将不可用。
以 stm32 hal 为例:
static void stm32_shell_write(const char *str, uint16_t len, void *p) {
ctshell_stm32_priv_t *d = (ctshell_stm32_priv_t *) p;
HAL_UART_Transmit(d->huart, (uint8_t *) str, len, 100);
}
ctshell_io_t io = {
.write = stm32_shell_write,
.get_tick = HAL_GetTick,
};
处理输入
Ctshell 需要手动送入接收到的字节,将单个字节送入 ctshell_input。
stm32 使用中断接收示例:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart == &huart1) {
ctshell_input(&ctx, rx_byte);
HAL_UART_Receive_IT(&huart1, &rx_byte, 1);
}
}
初始化与主循环
裸机环境: 在 main() 函数初始化 uart 后进行 Shell 初始化,并在主循环中轮询。
int main(void) {
HAL_Init();
MX_USART1_UART_Init();
ctshell_stm32_init(&ctx, &huart1);
while (1) {
ctshell_poll(&ctx);
}
}
RTOS 环境: 建议创建一个独立的任务来运行 Shell。
void shell_task(void *argument) {
ctshell_stm32_init(&ctx, &huart1);
while (1) {
ctshell_poll(&ctx);
osDelay(10);
}
}
链接脚本修改
gcc:无需修改。
MDK-ARM(v5 and v6):在scatter file中添加示例如下:
CtshellCmdSection +0 {
*(ctshell_cmd_section)
}
测试
连接串口终端软件(如 MobaXterm, SecureCRT, Putty)。输入 help 并回车,如果看到命令列表,说明移植成功。