发明内容
本发明实施例提供一种处理计算机壳层Shell命令的方法和装置,以实现对Shell命令的处理,从而在实时操作系统上实现对Shell命令的处理。
第一方面,本发明实施例提供一种处理计算机壳层Shell命令的方法,包括:
获取Shell命令;
根据所述Shell命令从预设映射表中查找与所述Shell命令对应的执行函数;
调用所述Shell命令对应的执行函数;
其中,所述预设映射表中存储有Shell命令和执行函数的对应关系。
可选的,所述获取Shell命令,包括:通过串口接收Shell命令。
可选的,所述通过串口接收Shell命令,包括:
查询所述串口是否接收到字符;若是,则将所述字符保存在缓存中;若所述字符为回车字符,则将所述缓存中的字符作为Shell命令。
可选的,所述获取Shell命令之后还包括:解析所述Shell命令,以得到所述Shell命令的命令名称;
所述根据所述Shell命令从预设映射表中查找与所述Shell命令对应的执行函数,包括:根据所述Shell命令的命令名称从预设映射表中查找与所述Shell命令对应的执行函数。
可选的,所述方法还包括:解析所述Shell命令,以得到所述Shell命令的命令参数,所述调用所述Shell命令对应的执行函数,包括:将所述命令参数作为所述Shell命令对应的执行函数的输入参数,调用所述Shell命令对应的执行函数。
可选的,所述调用所述Shell命令对应的执行函数之后还包括:通过串口向外设反馈所述Shell命令对应的执行函数的运行结果。
可选的,所述Shell命令对应的执行函数的功能为以下中任意一项:重置微处理器、通过微处理器读取寄存器、通过微处理器写入寄存器、通过微处理器批量写入寄存器、通过总线读取数据和通过总线写入数据。
可选的,当所述Shell命令对应的执行函数用于通过微处理器读取寄存器时,所述Shell命令的命令参数包括寄存器地址、读取数据的长度和读取单位。
第二方面,本发明实施例提供一种处理计算机壳层Shell命令的装置,包括:
存储器,用于存储计算机程序;
处理器,用于执行所述计算机程序,以实现如第一方面任一项所述的方法。
第三方面,本发明实施例提供一种计算机存储介质,包括:所述计算机存储介质用于存储计算机程序,所述计算机程序执行时用于实现如第一方面任一项所述的方法。
本发明实施例在处理计算机壳层Shell命令的方法和装置,通过获取Shell命令,根据该Shell命令从预设映射表中查找与该Shell命令对应的执行函数,调用该Shell命令对应的执行函数,由此可以实现对Shell命令的处理,例如,在实时操作系统上实现对Shell命令的处理,根据预设映射表确定Shell命令对应的执行函数,无需安装和调用系统文件,实现简单、方便,使得小型芯片也可以使用Shell命令实现程序故障排除(debug),适用于测试不同的软件项目。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明的的处理Shell命令的系统的示意图,如图1所示,该系统包括小型芯片1和外设2,其中,该小型芯片1可以包括微处理器、电源模块、系统时钟、复位模块、硬盘(Flash)、RAM以及ROM等,其中,微处理器可以是中央处理器(Central Processing Unit,CPU),该小型芯片1承载有适用于小型芯片的操作系统,如RTOS,该外设2可以包括液晶显示器(Liquid Crystal Display,LCD)、键盘(keyborad)等。使用本发明实施例的系统可以测试不同的软件项目。具体的,通过本发明实施例的系统的外设输入Shell命令,小型芯片执行该Shell命令以测试不同的软件项目。本发明实施例的系统可以在RTOS中实现对Shell命令的处理,从而可以利用本发明实施例的系统测试不同的软件项目,其可以省去根据测试项目对芯片烧写不同的程序的步骤,实现简单、方便,可以提升软件开发效率。
其中,上述小型芯片与外设之间的通信接口可以是串行通信接口,即串口,当然也可以采用其他通信接口,例如并行通信接口,此处不一一举例说明,本发明实施例不以此作为限制。
需要说明的是,本发明实例的系统还可以包括与该小型芯片连接的其他芯片。
本发明实施例的的处理Shell命令的方法可以适用于上述RTOS,也可以适用于其他非Linux系统。
图2为本发明的处理Shell命令实施例一的流程图,本实施的执行主体可以是处理Shell命令的装置,该处理Shell命令的装置可以是独立的部件,也可以内置于小型芯片中,当然可以理解的,本实施的执行主体还可以是小型芯片,如图2所示,本实施例的方法可以包括:
步骤101、获取Shell命令。
其中,该Shell命令可以是通过如图1所示外设输入的Shell命令。
其中,该Shell命令可以包括复位微处理器(reset)、通过微处理器读取寄存器(mr)、通过微处理器写入寄存器(mw)、通过微处理器批量写入寄存器(bmw)、通过总线读取数据、通过总线写入数据等。其中,通过总线读取数据具体可以是通过I2C总线读数据(i2cr),其中,I2C是一种串行总线通讯协议,通过总线写入数据具体可以是通过I2C总线写入数据(i2cw),即通过总线实现与其他芯片的通信。上述Shell命令仅为举例说明,还包括很多Shell命令,此处不一一举例说明。可以理解的,上述各个Shell命令还包括输入的命令参数,以读取寄存器(mr)为例做举例说明,通过外设输入的Shell命令具体可以是mr[address][len]w,其中[address]、[len]、w即为命令参数,[address]表示具体的寄存器地址,[len]表示读取的数据长度,w表示以32位的字为单位读取。
步骤102、根据所述Shell命令从预设映射表中查找与所述Shell命令对应的执行函数。
其中,该预设映射表中存储有Shell命令和执行函数的对应关系,一个执行函数用于实现一种功能,例如读取、写入等。即该预设映射表包括Shell命令和执行函数的对应关系,该对应关系可以是一一对应。获取到Shell命令后,可以通过查找该预设映射表中包括的Shell命令,确定获取到的Shell命令对应的执行函数。
以上述Shell命令具体可以是mr[address][len]w为例做进一步举例说明,预设映射表中存储有mr对应int vssh_cmd_memread(int argc,char*argv[]),则根据该Shell命令从预设映射表中查找与该Shell命令对应的执行函数为int vssh_cmd_memread(intargc,char*argv[])。
步骤103、调用所述Shell命令对应的执行函数。
具体的,调用获取到的Shell命令对应的执行函数,以完成该Shell命令,从而实现该Shell命令的功能,例如读取、写入等。
本实施例,通过获取Shell命令,根据该Shell命令从预设映射表中查找与该Shell命令对应的执行函数,调用该Shell命令对应的执行函数,由此可以实现对Shell命令的处理,例如在实时操作系统上实现对Shell命令的处理,根据预设映射表确定Shell命令对应的执行函数,无需安装和调用系统文件,实现简单、方便,使得小型芯片也可以使用Shell实现程序故障排除(debug),适用于测试不同的软件项目。
需要说明的是,在Linux Shell中,是在Linux的文件系统中找到Shell命令所对应的可执行文件,并执行该可执行文件,其中可执行文件是在文件系统中的各个文件夹目录下,即需要在各级目录下查找可执行文件,处理过程涉及Linux内核调用,实现复杂。而本发明实施例的实现Shell的方法是通过查表的方式确定Shell命令对应的执行函数,从而可以在代码中直接调用该执行函数,其可以在非Linux系统中实现,实现简单、方便。
下面采用几个具体的实施例,对图2所示方法实施例的技术方案进行详细说明。
图3为本发明的处理Shell命令的方法实施例二的流程图,如图3所示,本实施例以在实时操作系统中处理Shell命令为例进行举例说明,本实施例的方法可以包括:
步骤201、通过串口接收Shell命令。
一种可实现方式,在执行步骤201之前,可以在实时操作系统中创建Shell任务。
其中,在该实时操作系统中创建一个任务(task),该任务专门用于处理Shell任务,Shell任务用于完成Shell命令的处理过程,该Shell命令的处理过程具体可以包括Shell命令的接收、解析、执行和反馈等,例如,该Shell命令的处理过程可以包括上述步骤101至步骤103。
在该实时操作系统中还可以有其他多个任务,每个任务用于处理一类事务,举例而言,在该实时操作系统中有三个任务,分别为任务1(task1)、任务2(task2)和任务3(task3),其中,task1为Shell任务,即处理Shell命令,task2用于处理音频事务,task3用于处理视频事务。
实时操作系统在一个时间点只能运行一个任务(task),每个任务处于一个状态,由实时操作系统来统一调度该实时操作系统中的多个任务。任务的状态具体可以包括无法使用(Not Available,NA)、运行(RUNNING)、准备(READY)、等待消息(WAIT_MSG)、等待定时器(WAIT_TIMER)、暂停(SUSPEND)。实时操作系统对任务进行调度时,任务在上述状态之间切换,其中,一个时间点只有一个任务处于运行(RUNNING)状态,该任务在运行期间,实时操作系统执行该任务的处理。其中,图4为任务状态转换示意图,如图4所示,一个任务在未被用于处理事务时,处于NA状态,在被用于处理事务时,处于READY状态,在系统运行该任务时,处于RUNNING状态,在运行过程中,可以处于WAIT_MSG或者WAIT_TIMER状态,运行结束后进入SUSPEND状态,进而回转至READY状态,待系统调用。
步骤202、根据所述Shell命令从预设映射表中查找与所述Shell命令对应的执行函数。
在接收到Shell命令后,可以对其进行解析,以获取该Shell命令对应的执行函数。
一种可实现方式,可以解析该Shell命令,获取该Shell命令的命令名称和命令参数,根据该Shell命令的命令名称从预设映射表中查找与该Shell命令对应的执行函数。
以上述Shell命令具体是mw[address][len]w为例做举例说明,对该Shell命令进行解析,获取该Shell命令的命令名称为mw,命令参数为[address]、[len]、w,其中,[address]表示具体的寄存器地址,[len]表示读取的数据长度,w表示以32位的字为单位读取。根据该Shell命令的命令名称从预设映射表中查找与该命令名称对应的执行函数为intvssh_cmd_memwrite(int argc,char*argv[])。
本发明实施例的预设映射表具体可以如下表1所示。
表1预设映射表
命令的名称 |
执行函数 |
命令的功能描述 |
reset |
hal_soc_reset |
重置微处理器 |
mr |
vssh_cmd_memread |
通过微处理器读取寄存器 |
mw |
vssh_cmd_memwrite |
通过微处理器写入寄存器 |
bmw |
vssh_cmd_burst_memwrite |
通过微处理器批量写入寄存器 |
i2cr |
vssh_cmd_i2cread |
通过I2C总线读数据 |
i2cw |
vssh_cmd_i2cwrite |
通过I2C总线写数据 |
…… |
…… |
…… |
A |
Function_a |
实现……功能 |
其中,A以及A对应的执行函数Function_a可以根据需求进行灵活设置。
步骤203、调用所述Shell命令对应的执行函数。
具体的,可以根据所述命令参数调用所述Shell命令对应的执行函数,以上述举例做进一步举例说明,即可以根据命令参数:[address]、[len]、w调用int vssh_cmd_memwrite(int argc,char*argv[]),即将命令参数写入int argc和char*argv[]中。
需要说明的是,实时操作系统上的每个任务都是一个死循环,例如,Shell任务在死循环中处理Shell的事务。所以,在任务之间切换需要依赖系统时钟,即system timer,每个任务都有自己的时间片(timeslice),该时间片用于系统上的任务轮转。具体的,系统时钟根据任务的时间片的值,时间到了,就会触发system timer硬中断,系统时钟中断的优先级很高,系统必须立即响应中断,在中断处理函数中,就可以将一个任务切换到另外一个任务,保护好任务的数据,切换任务的状态。即通过时间片轮转来调度各个任务,每个任务占用一小片时间,系统就能保证每个任务能执行到。以在该实时操作系统中有三个任务,分别为task1、task2和task3为例做进一步举例说明,图5为系统任务调度的示意图,如图5所示,实时操作系统的系统时钟依据任务的时间片的值,在一个任务的时间到达时,中断处理函数可以将一个任务切换到另外一个任务,通过时间片轮转来调度各个任务,每个任务占用一小片时间。
例如,在到达所述Shell任务的时间片的值时,将所述Shell任务的状态从运行状态切换至暂停状态。
本实施例,通过在实时操作系统中创建Shell任务,在Shell任务处于运行状态时,通过串口接收外设发送的Shell命令,根据该Shell命令从预设映射表中查找该Shell命令对应的执行函数,调用该Shell命令对应的执行函数,由此可以在实时操作系统上实现Shell,根据预设映射表确定Shell命令对应的执行函数,无需安装和调用系统文件,实现简单、方便,使得小型芯片也可以使用Shell实现程序故障排除(debug),适用于测试不同的软件项目。
并且,该Shell任务不影响实时操作系统上其他任务的执行。
图6为本发明的处理Shell命令的方法实施例三的流程图,如图6所示,本实施例的方法可以包括:
步骤301、输出提示符“>:”。
具体的,向外设发送输出提示符,通过提示符“>:”来提示用户通过外设进行输入操作。
需要说明的是,本发明实施例以“>:”作为举例说明,该输出提示符还可以是其他提示符,本发明实施例不以此作为限制。
步骤302、查询串口是否接收到字符,若是,则执行步骤303,若否,则重复执行步骤302。
具体的,查询该串口是否接收到外设发送的字符。
步骤303、将所述字符保存在缓存中。
步骤304、判断所述字符是否为回车字符,若是回车字符,则执行步骤305、若否,则执行步骤302。
具体的,串口依次读取一个字符,并保存在buffer中,如果获取到一个字符是回车字符,则说明已经获取到一个字符串作为一个Shell命令。
步骤305、将所述缓存中的字符作为Shell命令。
步骤306、根据所述Shell命令从预设映射表中查找所述Shell命令对应的执行函数。
步骤307、调用所述Shell命令对应的执行函数。
其中,步骤306和步骤307的具体解释说明可以参见图2所示实施例的步骤102和步骤103的具体解释说明,此处不再赘述。
可选的,在步骤307之后,还可以通过串口向外设反馈所述Shell命令对应的执行函数的运行结果。
本实施例,通过获取Shell命令,根据该Shell命令从预设映射表中查找该Shell命令对应的执行函数,调用该Shell命令对应的执行函数,由此可以在实时操作系统上实现Shell,根据预设映射表确定Shell命令对应的执行函数,无需安装和调用系统文件,实现简单、方便,使得小型芯片也可以使用Shell实现程序故障排除(debug),适用于测试不同的软件项目。
并且通过反馈所述Shell命令对应的执行函数的运行结果,提升实时操作系统与用户的交互性。
图7为本发明的处理Shell命令的装置实施例一的结构示意图,如图7所示,本实施例的装置可以包括:存储器11和处理器12,其中,存储器11用于存储计算机程序,处理器12,用于执行所述计算机程序,用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
其中,该处理器102可以是一个中央处理器(Central Processing Unit,CPU),或者是特定集成电路(Application Specific Integrated Circuit,ASIC),或者完成实施本申请实施例的一个或多个集成电路。
可以理解的,该RTOS上实现Shell的装置还可以包括通信接口,该通信接口用于与外设或者其他芯片进行通信。
当本发明实施例的在RTOS上实现Shell的方法的至少一部分功能通过软件实现时,本发明实施例还提供一种计算机存储介质,计算机存储介质用于储存为上述在RTOS上实现Shell的装置的计算机软件指令,当其在计算机上运行时,使得计算机可以执行上述方法实施例中各种可能的在RTOS上实现Shell的方法。在计算机上加载和执行所述计算机执行指令时,可全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机指令可以存储在计算机存储介质中,或者从一个计算机存储介质向另一个计算机存储介质传输,所述传输可以通过无线(例如蜂窝通信、红外、短距离无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如SSD)等。
此外,本发明实施例还提供一种包含指令的计算机程序产品,即软件产品,当其在计算机上运行时,使得计算机执行上述方法实施例中各种可能的在RTOS上实现Shell的方法。其实现原理和技术效果类似,此处不再赘述。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。