|
Learn lumit Step 6 : 做一个 Shell
++++++++++++++++++++++++++++++++++++++++++++++++++++++
在写前面这几步的时候,lumit4510 就在我的手边。每次新开一个目录写 readme
的时候,我就想象自己是个初学者这样一步一步跟着做下来,究竟是不是按照循序渐进
的步骤,有没有比较重要的地方被遗漏了? 也许有一天会有人觉得,这样地介绍从板子
加电启动到开发一个具体应用的过程很合他的心意。
从这一个小节开始,我们就要进入 bootloader 真正起作用的环节了。在我觉得,
功能繁多的 bootloader 是一个成品,就像景德镇的瓷器一样是放在那儿供人瞻仰的;
而我现在的过程好比是《人鬼情未了》里面捏陶的镜头,虽然捏出来的东西很粗陋,
但还是很有意思的。
这里我想先实现一个简单的 shell 命令解释器,它能够从串口输入中读取字符串
并从中解析出可以执行的内部命令。我们将在实现 printf 的基础上,做一些函数扩展,
以便更好的实现上述的功能。
首先我们来实现 gets 函数,用来从串口读入一行字符串到缓冲区 command_buf 中。
类似上一节的技巧,这一次需要实现的是 fgetc ,这个底层的输入函数可以从串口读入
一个字符,并把它回显出来。具体实现如下:
/* here we implement fgetc() for high-level function gets() to recieve commands */
FILE __stdin;
int fgetc(FILE *f)
{
char tempch;
// get a char and echo it to user
uart_getchar( UART0_BASE, &tempch );
uart_putchar( UART0_BASE, tempch );
// if user press Enter on keyboard, then here get a '\r'
if( tempch == '\r' )
return EOF;
return (int)tempch;
}
接着,我们用最简单的字符串比较函数 strcmp() 来分析输入的字符串是否是我们的
Shell 内部命令。
/* an endless loop for shell command interpreter */
void shell_command( void )
{
char command_buf[64];
while( 1 )
{
// Prompt of lumit shell
printf( "l-shell> " );
// get a line from user input
gets( command_buf );
printf( "Get Command: <%s> \n", command_buf );
// compare if we can interprete this command
if( strcmp( command_buf, "help" ) == 0 )
help();
if( strcmp( command_buf, "go" ) == 0 )
go();
if( strcmp( command_buf, "download" ) == 0 )
download();
if( strcmp( command_buf, "xload" ) == 0 )
xload();
// empty the command buffer
strcpy( command_buf, "" );
}
return;
}
一个最简单的 shell 我想至少要包含一条 help 命令,用来提示用户能输入哪些命令。
然后还需要一个下载命令 download 和 执行命令 go ,这样就能把 PC 上编好的程序下载
到板子上并执行。其他 bootloader 命令五花八门,而这三条是基本上都具备的,接下来
我们就来实现它们。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|