|
楼主 |
发表于 2006-11-15 23:20:36
|
显示全部楼层
大家好像对AVR-USB都不太赶兴趣,可能涉及到什么Lincense的问题,代码就不贴上来了
就贴一段,嵌入式的命令行界面吧,我做的这个命令行界面叫S-Shell
一共有5个文件:
shell.h // 头文件
shell_cfg.h // 配制头文件
shell_cmd.h // 命令头文件
shell.c // 实现代码
readme.txt // 说明文件,内容有待更新
介绍一下具体的思路:
在shell_cmd.h中定义了各个命令
typedef struct _cmd
{
STR_DEF cmd_str; // command string
uint8 (*cmd_func)(uint8 **argv,uint8 argc);
STR_DEF cmd_info;
}CMD,*PCMD;
// extern userdefined command functions
#define SHELL_CMD_HIDEIDX 11
const CMD Shell_CMDs[] = {
{STR_TYP("help"),Shell_Help,STR_TYP("Shell Help.")},
{STR_TYP("cls"),Shell_Clear,STR_TYP("Clear the Shell Output.")},
{STR_TYP("quit"),Shell_Exit,STR_TYP("Quit S-Shell.")},
{STR_TYP("version"),Shell_Ver,STR_TYP("Show Shell version.")},
#if SHELL_COLOR_EN == 1
// {STR_TYP("color"),Shell_color,STR_TYP("Shell Set Attr.")},
#endif
{STR_TYP("s"),ShowPara,STR_TYP("Show Parameters.")},
{STR_TYP(0),(void *)0,STR_TYP(0)}
};
在main函数中,只要如下调用就可以进入命令行界面:
Shell_Init();
Shell_Run();
其中Shell_Run和相关的函数是整个命令行界面的核心:
void Shell_Run(void)
{
Shell_State = Shell_State_Running;
while(Shell_State == Shell_State_Running)
{
Shell_WriteStr_P(Shell_Str);
Shell_ReadLine(Shell_LineBuff,SHELL_LINE_BUFFER_SIZE,Shell_EchoChar);
if(strlen((const char*)Shell_LineBuff) != 0)
Shell_DoCMD(Shell_LineBuff);
}
Shell_Fini();
}
当检测到有一行命令输入后,调用Shell_DoCMD,解析命令的参数,并调用相应的命令函数:
static uint8 Shell_DoCMD(uint8 *CMD)
{
int8 i = -1;
#if HAS_MALLOC == 1
uint8 **para = (uint8**)0,para_num = 0;
#else
uint8 para_num = 0;
#endif // #if HAS_MALLOC == 1
#if HAS_MALLOC == 1
para_num = Shell_ParsePara((uint8**)0,CMD);
para = (uint8**)malloc(para_num * sizeof(uint8*));
#endif // #if HAS_MALLOC == 1
para_num = Shell_ParsePara(para,CMD);
if(para_num == 0)
return SHELLERR_CMD_NOT_FOUND;
while(Shell_CMDs[++i].cmd_str != 0)
if(!strcmp_P((const char*)para[0],Shell_CMDs.cmd_str))
return Shell_CMDs.cmd_func(para,para_num);
Shell_WriteStr_P(STR_T("COMMAND:\""));
Shell_WriteStr(para[0]);
Shell_WriteLine_P(STR_T("\" not found"));
#if HAS_MALLOC == 1
free(para);
para = (uint8**)0;
#endif // #if HAS_MALLOC == 1
return SHELLERR_CMD_NOT_FOUND;
}
其中Shell_ParsePara是做命令行解析,提取命令参数,使得命令函数的参数和main函数的一样,然后在Shell_CMDs中寻找匹配的命令,调用相关的函数。
底层的接口由shell_cfg.h实现,如果移植到其他的系统,大多数情况下只需要修改shell_cfg.h(至少移植到LPC的ARM7芯片上如此):
#define Shell_WriteChar(CH) USART_Transmit((CH))
#define Shell_ReadChar() USART_Receive()
#define Shell_Interface_Init() USART_Init(USART_DOUBLESPEED | /*((uint8)(F_CPU / (8 * USART_BAUDRATE)) - 1)*/12,USART_8N1,USART_INT_NOINT)
#define Shell_Interface_Fini()
其中,USART_Transmit,USART_Receive,USART_Init需要根据不同的系统另外实现。由于代码中的类型定义基本使用类似uint8,int8等方式,所以在shell_cfg.h中还需要定义或者包含相关的类型定义语句
其他还有一些附加的功能,比如如果使用Windows的超级终端的话,可以通过发送转移字符来更改字体和背景的颜色,也可以增加用户登陆过程或者也可以自己加上启动的选项
整个代码(这个是测试版本,等到测试了足够长的时间后没有问题的话就可以认为是正式版本了):
点击此处下载armok01135383.rar
-----此内容被chengyingavr于2006-11-15,23:37:31编辑过
-----此内容被chengyingavr于2006-11-15,23:40:12编辑过 |
|