limingth 发表于 2005-5-28 01:37:16

Learn lumit Step 6 : 做一个 Shell

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;
       
        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 命令五花八门,而这三条是基本上都具备的,接下来
我们就来实现它们。
页: [1]
查看完整版本: Learn lumit Step 6 : 做一个 Shell