本次主要移植letter-shell过程。
letter shell是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备,以C语言函数为运行单位,可以通过命令行调用,运行程序中的函数。letter shell 增加了用户管理,权限管理,以及对文件系统的初步支持。
功能:
- 命令自动补全
- 快捷键功能定义
- 命令权限管理
- 用户管理
- 变量支持
- 代理函数和参数代理解析
下面说说移植。
首先调通串口发送接收数据。新建CW32的port接口文件。letter-shell的配置文件。
#ifndef __SHELL_CFG_USER_H__
#define __SHELL_CFG_USER_H__
#include "main.h"
#if 0
#define SHELL_TASK_WHILE
#define SHELL_USING_CMD_EXPORT
#define SHELL_USING_COMPANION
#define SHELL_SUPPORT_END_LINE
#define SHELL_HELP_LIST_USER
#define SHELL_HELP_LIST_VAR
#define SHELL_HELP_LIST_KEY
#define SHELL_ENTER_LF
#define SHELL_ENTER_CR
#define SHELL_ENTER_CRLF
#define SHELL_EXEC_UNDEF_FUNC
#define SHELL_COMMAND_MAX_LENGTH
#define SHELL_PARAMETER_MAX_NUMBER
#define SHELL_HISTORY_MAX_NUMBER
#define SHELL_DOUBLE_CLICK_TIME
#define SHELL_QUICK_HELP
#define SHELL_MAX_NUMBER
#define SHELL_GET_TICK()
#define SHELL_USING_LOCK
#define SHELL_MALLOC(size)
#define SHELL_FREE(obj)
#define SHELL_SHOW_INFO
#define SHELL_CLS_WHEN_LOGIN
#define SHELL_DEFAULT_USER
#define SHELL_DEFAULT_USER_PASSWORD
#define SHELL_LOCK_TIMEOUT
#endif
#define SHELL_USING_COMPANION 1
#define SHELL_SUPPORT_END_LINE 1
#define SHELL_ENTER_LF 1
#define SHELL_ENTER_CR 1
#define SHELL_ENTER_CRLF 0
#define SHELL_MALLOC(size) malloc(size)
#define SHELL_FREE(obj) free(obj)
#endif
letter-shell发送接收函数接口初始化。
#include "shell_cfg_user.h"
#include "drv_uart.h"
#include "shell.h"
Shell shell;
char shellBuffer[512];
short userShellWrite(char *data, unsigned short len)
{
for(uint32_t i=0;i<len;i++)
stdout_putchar(data[i]);
return len;
}
short userShellRead(char *data, unsigned short len)
{
uint32_t rlen = 0;
for(uint32_t i=0;i<len;i++)
{
if(shell_uart_rx.read_i != shell_uart_rx.write_i)
{
data[rlen++] = shell_uart_rx.buff[shell_uart_rx.read_i++];
shell_uart_rx.read_i &= 0x7f;
}
}
return rlen;
}
int userShellLock(Shell *shell)
{
return 0;
}
int userShellUnlock(Shell *shell)
{
return 0;
}
void userShellInit(void)
{
shell.write = userShellWrite;
shell.read = userShellRead;
shellInit(&shell, shellBuffer, 512);
}
下面是对接串口。
首先main中初始化shell。
userShellInit(); //letter shell
然后在main的主循环中调用,处理输入的字符。
void uart_shell_loop(void)
{
if(shell_uart_rx.read_i != shell_uart_rx.write_i)
{
shellHandler(&shell, shell_uart_rx.buff[shell_uart_rx.read_i++]);
shell_uart_rx.read_i &= 0x7f;
}
}
这样基本就移植完成了。
下面就是 添加测试的函数和测试用户方法。
//测试添加用户:
SHELL_EXPORT_USER(SHELL_CMD_PERMISSION(0x01), root, 123456, add user);
下面是添加函数的2种方式。
int func(int argc, char *argv[])
{
printf("%d parameter(s)\r\n", argc);
for (char i = 1; i < argc; i++)
{
printf("%s\r\n", argv[i]);
}
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0x01)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func, func, test1);
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0x02)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), func2, func, test2);
int func1(int i, char ch, char *str)
{
printf("input int: %d, char: %c, string: %s\r\n", i, ch, str);
return 0;
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), func1, func1, test3);
测试letter-shell输出。更换用户直接输入用户名即可。如果设置了用户密码就需要输入密码才能进入。
上面是默认的letter用户权限函数
上面是新加的root用户权限函数。
测试新加命令。
移植工程:
*附件:Demo.rar