从uboot移植出来的shell命令界面.docx
- 文档编号:2065390
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:11
- 大小:138.50KB
从uboot移植出来的shell命令界面.docx
《从uboot移植出来的shell命令界面.docx》由会员分享,可在线阅读,更多相关《从uboot移植出来的shell命令界面.docx(11页珍藏版)》请在冰豆网上搜索。
从uboot移植出来的shell命令界面
从u-boot移植出来的shell命令界面
以前搞过u-boot,,有很多命令,,用超级终端操作,,比如help、tftp、erase、fatload,其实就是下面这段代码接受超级终端命令的。
因为最近打算给产品做一个shell,用超级终端输入命令,,所以从u-boot找到这段代码并移植出来了,就只有delete_char和readline_into_buffer两个函数,非常简单。
使用方法是:
main()
{
charbuffer[16];//缓冲区长度根据命令长度可调整
while
(1){
_delay_ms(100);
//其中"LW-C360#"就是显示在超级终端的输入命令前端的,叫什么?
readline_into_buffer("LW-C360#",buffer);
//这里为你的命令解析函数,然后调用对应的处理函数,如我的voidshell(void)函数
Your_Cmd_Parse_and_Process();
}
}
使用截图:
/*
**********************************************************************************
* 实现一个简单的Shell命令交互界面,命令行接收部分移植自u-boot-1.3.4
**********************************************************************************
*/
#define tab_seq (" ")/*usedtoexpandTABs*/
#define erase_seq ("\b\b")/*erasesequence*/
//删除一个字符
staticchar*delete_char(char*buffer,char*p,int*colp,int*np,intplen)
{
char*s;
if(*np==0){
return(p);
}
if(*(--p)=='\t'){ /*willretypethewholeline*/
while(*colp>plen){
USART_PutStr(COMMUNICATE_USART,erase_seq);
(*colp)--;
}
for(s=buffer;s
if(*s=='\t'){
USART_PutStr(COMMUNICATE_USART,tab_seq+((*colp)&07));
*colp+=8-((*colp)&07);
}else{
++(*colp);
USART_PutChar(COMMUNICATE_USART,*s);
}
}
}else{
USART_PutStr(COMMUNICATE_USART,erase_seq);
(*colp)--;
}
(*np)--;
return(p);
}
//从串口读取命令行
intreadline_into_buffer(constchar*constprompt,char*buffer)
{
char*p=buffer;
char*p_buf=p;
/*bufferindex*/
intn=0;
/*promptlength*/
intplen=0;
/*outputcolumncnt*/
intcol;
charc;
/*printprompt*/
if(prompt){
plen=strlen(prompt);
USART_PutStr(COMMUNICATE_USART,prompt);
}
col=plen;
for(;;){
//从at91sam9260串口读取一个字符
while(0==(AT91C_BASE_US1->US_CSR&AT91C_US_RXRDY));
c=AT91C_BASE_US1->US_RHR;
/*
*Specialcharacterhandling
*/
switch(c){
case'\r':
/*Enter*/
case'\n':
//回车表示命令输入结束
*p='\0';
USART_PutStr(COMMUNICATE_USART,"\r\n");
return(p-p_buf);
case'\0':
/*nul*/
continue;
case0x03:
/*^C-break*/
//CTRL+C表示取消命令输入
p_buf[0]='\0';/*discardinput*/
USART_PutStr(COMMUNICATE_USART,"\r\n");//luodefu
return(-1);
case0x15:
/*^U-eraseline*/
//CTRL+U表示擦除一行命令输入
while(col>plen){
USART_PutStr(COMMUNICATE_USART,erase_seq);
--col;
}
p=p_buf;
n=0;
continue;
case0x17:
/*^W-eraseword*/
//CTRL+W表示删除一个词
p=delete_char(p_buf,p,&col,&n,plen);
while((n>0)&&(*p!
='')){
p=delete_char(p_buf,p,&col,&n,plen);
}
continue;
case0x08:
/*^H -backspace*/
case0x7F:
/*DEL-backspace*/
//表示删除一个字符
p=delete_char(p_buf,p,&col,&n,plen);
continue;
default:
/*
*Mustbeanormalcharacterthen
*/
if(n<16-2){//luodefu-命令行缓冲区大小16
if(c=='\t'){/*expandTABs*/
USART_PutStr(COMMUNICATE_USART,tab_seq+(col&07));
col+=8-(col&07);
}else{
++col; /*echoinput*/
USART_PutChar(COMMUNICATE_USART,c);
}
*p++=c;
++n;
}else{ /*Bufferfull*/
USART_PutChar(COMMUNICATE_USART,'\a');
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uboot 移植 出来 shell 命令 界面
![提示](https://static.bdocx.com/images/bang_tan.gif)