vivi中命令的实现

前些天看了一位大侠写的vivi的启动过程,但是对于后面vivi的命令解析和一些协议却没有介绍,这篇文章算是补充吧,小弟学习vivi时间还短,写的不好还希望大侠们多多指点!


首先说下vivi的启动后首先运行的函数是:boot_or_vivi();//目录:  vivi/init/main.c

该函数的功能是:运行vivi命令解析器还是启动内核,当然我们这里分析的是运行命令解

析器了!

首先函数判断是否需要启动延时的时间(boot_delay),如果不需要就直接进入vivi的命令解析器,如果需要就判断从终端输入的字符C(awaitkey()函数在 VIVI/driver/serial/serial_core.c),判断字符c如果是回车或者非空(也就是在等待时间内有任何键按下)则运行vivi命令解析器,否者运行内核启动代码。

函数的功能也就是这些了,我们主要分析的是vivi_shell(),这个函数,下面就开始分析该函数。

函数vivi_shell()// vivi/init/main.c


函数中有个宏定义,那么这个宏定义在哪呢,这个是我们的autoconf.h中定义的,其中autoconf.h是一个配置文件,里面定义了我们需要编译和不编译的条件选择宏。如果自己不写boot_loader的话,使用vivi的话一般都是选上的,对于不需要vivi_shel的则可以去掉该宏定义。

函数调用了serial_term函数,这个函数是在 VIVI/driver/serial/term.c中


该函数首先定义了一个接受命令的数组,然后就是一个循环语句了,到这里该明白,也就是vivi运行shell后最后是通过这个函数来交互的。我们首先分析getcmd,然后分析exec_string。

其中的printk函数是直接借用linux内核的,用法是一样的。

getcmd函数在VIVI/driver/serial/getcmd.c



此函数清空上次的命令行,然后如果得到的数据不是想要的数据就进行相应的处理。


这个函数调用了最底层的getc函数,getc函数是通过宏操作直接操作寄存器的函数,过会就分析这个函数。

//vivi/deriver/serial/serial_core.c


此函数首先判断;接受缓存区是否写好,如果写好就读数据,并且获得串口的状态。

里面的宏是在//  vivi/inlude/proc.h

到这里就算吧getcmd函数分析到底层了。


下面分析得到命令后的exec_string,// vivi/lib/command.c


这个函数首先分析命令字符串,这个函数也是在vivi/lib/command.c文件中,下面分析parseargs这个解析函数

函数太长就不贴了,还是要分析源码的,首先这个说明这个函数的作用和实现方法,这个函数就是把cmd_buf中的字符串解析为函数的参数。

下面介绍一个例子:load flash kernel x

当cmd_buf接受到参数后,就开始解析这个命令行,首先把argv[0]等于'l'的地址,argc++,这时命令行的第一个参数就确定了;然后到空格时,就把空格替换成空,当下一个字符到来时argv[1]等于'f'的地址了,argc++,第二个参数也确定了,知道最后一个参数确定。

解析后就调用execcmd()函数,

首先查找命令,然后调用命令的执行函数,这个例子调用的是load命令,这个命令在vivi/lib/load_file.c中load_cmd结构体中


里面的command_load函数就是我们的要执行的函数,这个函数也在load_file.c文件中这个函数调用了execsubcmd来执行命令,execsubcmd是在上面提到的comman.c这个文件中定义的,这个函数再次对照load命令的第二个参数也就是flash,重新调用执行函数,即是command_load_flash函数,此函数首先对照要下载的分区即是kernel分区,它首先通过下载到内存中,然后再下载到nand flash的方式下载,使用的协议就是我们常听说的x-model协议。


下篇文章介绍x-model协议。


到这里就算把一个完整的命令执行过程分析一遍了,大部分命令都是这样的,就不一一列举了!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值