Rt-thread系统有非常好用的FinSH调试工具,考虑在FreeRtos也移植一款类似的嵌入式Shell工具,经过资料查找,开源的letter-shell库满足此需求,搞起。
1、平台开发环境:vscode+STM32CubeMX+MDKV5
芯片:STM32F429
操作系统:FreeRTOS
STM32库:HAL
2、串口初始化通过STM32CubeMX软件直接生成,配置参数如下:
huart7.Instance = UART7; huart7.Init.BaudRate = 9600; huart7.Init.WordLength = UART_WORDLENGTH_8B; huart7.Init.StopBits = UART_STOPBITS_1; huart7.Init.Parity = UART_PARITY_NONE; huart7.Init.Mode = UART_MODE_TX_RX; huart7.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart7.Init.OverSampling = UART_OVERSAMPLING_16;3、源码移植
源码下载:
letter-shell: letter shell一个嵌入式小型shell,特别适用于单片机系统。https://gitee.com/zhang-ge/letter-shell.git解压得到下列文件
文件移植
把文件添加如MDK工程里面
参照作者的移植步骤,我们重点修改shell_port.c文件:
- 定义shell对象
Shell shell;
- 定义shell读,写函数
short userShellWrite(char *data, unsigned short len)
{
HAL_UART_Transmit(&huart7, (uint8_t *)data, len, 0x1FF);
return len;
}
short userShellRead(char *data, unsigned short len)
{
if(HAL_UART_Receive(&huart7, (uint8_t *)data, len, 0xFFFF) != HAL_OK)
{
return 0;
}
else
{
return 1;
}
//return HAL_UART_Receive(&huart7, (uint8_t *)data, len, 0);
}
- 申请一片缓冲区
char shellBuffer[512];
- 定义互斥锁
static SemaphoreHandle_t shellMutex;
- 实现上锁解锁功能
int userShellLock(Shell *shell)
{
xSemaphoreTake(shellMutex, portMAX_DELAY);
return 0;
}
int userShellUnlock(Shell *shell)
{
xSemaphoreGive(shellMutex);
return 0;
}
- 初始化函数实现
void userShellInit(void)
{
shellMutex = xSemaphoreCreateMutex();
shell.write = userShellWrite;
shell.read = userShellRead;
shell.lock = userShellLock;
shell.unlock = userShellUnlock;
shellInit(&shell, shellBuffer, 512);
xTaskCreate(shellTask, "shell", 256, &shell, 5, NULL);
}
- 配置文件修改
去掉了shell伴生对象配置和设置命令触发条件(0x0d)
#ifndef __SHELL_CFG_H__ #define __SHELL_CFG_H__ #include "stm32f4xx_hal.h" #include "FreeRTOS.h" #include "portable.h" #define SHELL_TASK_WHILE 1 #define SHELL_USING_CMD_EXPORT 1 #define SHELL_USING_COMPANION 0 #define SHELL_SUPPORT_END_LINE 1 #define SHELL_HELP_LIST_USER 0 #define SHELL_HELP_LIST_VAR 0 #define SHELL_HELP_LIST_KEY 1 #define SHELL_HELP_SHOW_PERMISSION 1 #define SHELL_ENTER_LF 0 #define SHELL_ENTER_CR 1 #define SHELL_ENTER_CRLF 0 #define SHELL_EXEC_UNDEF_FUNC 0 #define SHELL_PARAMETER_MAX_NUMBER 8 #define SHELL_HISTORY_MAX_NUMBER 5 #define SHELL_DOUBLE_CLICK_TIME 200 #define SHELL_MAX_NUMBER 5 #define SHELL_PRINT_BUFFER 128 #define SHELL_SCAN_BUFFER 128 #define SHELL_GET_TICK() HAL_GetTick() #define SHELL_USING_LOCK 1 #define SHELL_MALLOC(size) pvPortMalloc(size) #define SHELL_FREE(obj) vPortFree(obj) #define SHELL_SHOW_INFO 1 #define SHELL_CLS_WHEN_LOGIN 1 #define SHELL_DEFAULT_USER "letter" #define SHELL_DEFAULT_USER_PASSWORD "" #define SHELL_LOCK_TIMEOUT 0 * 60 * 1000 #endif4、测试
测试代码如下:
void TestEasyTask(void const *argument)
{
userShellInit();
while(1)
{
osDelay(1000);
}
}
void shell_test(uint32_t num)
{
printf("shell:%d",num);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func, shell_test, test);
打开Mobaxterm软件,设备上电即有信息打印出来
按下”TAB“键,调出帮助信息
如图输入命令,得到结果
我们即可通过串口测试shell_test函数
总结letter shell是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备,以C语言函数为运行单位,可以通过命令行调用,运行程序中的函数。通过移植这个工具,方便我们进行模块的单元测试。



