6 参数解析
命令行模块要从用户输入的字符串中解析出命令名和参数。为命令提供与DOS和Linux类似的两个参数,argc和argv。argc表示参数的个数;argv是字符串指针的数组,最多10个字符串。argv[0]是第一个参数,argv[1]是第二个参数,如此类推。
7 函数解析
在代码中使用SHELL_CMD_DECL创建了命令列表,使用工具创建了自动命令列表。这两个表实际上都是数据结构ncommand_t的数组,其中有命令名和函数地址的信息。解析函数实际上就是根据在这两个数组中依次比较函数名。如果用户输入的命令名和数组中的命令名一致,就使用对应的函数地址。
8 命令执行
得到函数地址后,就可以执行命令对应的函数。对于主动创建的命令,使用argc和argv作为参数。对于自动命令,命令行模块先尝试将原始参数转换无符号整数。如果成功,使用无符号整数作为参数;如果不成功,则将原始参数的地址作为参数,实际上是一个字符串。
命令设计
完成总体设计后,就可以逐个添加开发需要的命令了。
● 帮助命令用于显示所有命令名及其用法。
● IO命令用来访问输入输出设备的寄存器,可以实现对外部设备的控制。
● 存储器命令用来显示、修改存储器的值。最基本的包括:dump命令显示指定位置的内存的值;modify命令用来修改指定内存单元的值。
● 用户在使用过程中,会使用很多命令。能够查询历史命令、循环执行历史命令将给用户带来很多方便。因此笔者实现了三条命令。history_show用来显示所有已经使用了的命令;history_del用来删除指定的历史命令;history_exec用来执行指定的历史命令。
优化处理
Altera提供了简化版的输出函数alt_printf来替代printf,降低了嵌入式系统的开销,笔者在命令行中也支持这个这个函数。命令行的代码中,只调用SHELL_PRINT;在头文件中,根据用户设置,SHELL_PRINT使用标准的printf或者简化的alt_printf。如果使用简化的alt_printf,这个命令行占用的内存小于14KB。
在SOPC系统中的应用
Altera为SOPC系统开发提供的集成开发环境NIOS II IDE附带了多个软件实例。在使用这些软件实例时,用户只需要选择模块,完全不用新编代码,非常简单。
智能命令行模块也可以作为NIOS II IDE的一个实例。先在“nios2edsexamplessoftware”目录下为命令行创建一个子目录shell_standard,再以其他软件实例的template.xml为模板创为命令行建一个template.xml文件,然后复制命令行模块的所有文件到这个目录中。这样,用户在创建工程时,直接选中智能命令行模板,就可以使用智能命令行模块了。