shell架构,环境变量
来源:互联网 发布:数据库置疑修复工具 编辑:程序博客网 时间:2024/06/05 20:04
本文总结自《朱有鹏老师嵌入式linux核心课程》的《1.16.ARM裸机第十六部分-shell原理和问答机制引入》中的《1.16.4.shell实战3-定义标准命令集及解析》至《1.16.7.shell实战6-添加其他命令2》。
shell包括三个部分:
(1)第1步:命令获取
(2)第2步:命令解析
(3)第3步:命令执行
shell中的三部分在程序中表示如下:
int main(void){ char buf[MAX_LINE_LENGTH] = {0};// 用来暂存用户输入的命令 shell_init(); //这里面应该包括所应用硬件的初始化,以及命令集初始化 while(1) //shell是个死循环,处理完一个命令的获取、解析、执行之后进入下一个命令的循环 { // 第1步:命令获取 puts("aston#"); // buf弄干净好存储这次用户输入 memset(buf, 0, sizeof(buf)); // 读取用户输入放入buf中, 注:这个地方没有命令输入的时候是阻塞在 //这个位置的,gets函数内部实现的功能是当从键盘上输入‘\n’的时候才解除阻塞,继续执行。 gets(buf); cmd_parser(buf);// 第2步:命令解析 cmd_exec(); // 第3步:命令执行 } return 0;}
cmd_parser(buf):解析命令的方法主要是和标准命令集中的字符串进行比较,如果找到命令,就记录此命令在命令集中所在的下标。找到下标即解析完成。
cmd_exec():利用找到的下标来调用硬件驱动,从而完成对硬件的控制。主要应用的是switch case语句,这样做可以方便扩展其他硬件操作。
void cmd_exec(void){ switch (cmd_index) { case 0: // led do_cmd_led(); break; case 1: // lcd do_cmd_lcd(); break; case 2: // buzzer do_cmd_buzzer();break; case 3: // adc do_cmd_adc(); break; default: do_cmd_notfound();break; }}
以do_cmd_led()为例,由于对led的操作的多样化,因此在 do_cmd_led函数中还需要利用if语句选择相应的操作,这和S5PV210的中断服务程序的写法比较类似。
// led命令的处理方法void do_cmd_led(void){int flag = -1;// 真正的led命令的操作实现// 目前支持的命令有led on | led off // cmd[0]里面是led,cmd[1]里面是on|offif (!strcmp(cmd[1], "on")){// led onled_on();flag = 1;}if (!strcmp(cmd[1], "off")){// led offled_off();flag = 1;}// ..... 还可以继续扩展if (-1 == flag){// 如果一个都没匹配,则打印使用方法puts("command error, try: led on | led off");puts("\n");}}
如果要扩展硬件,在命令集初始的时候要扩展命令集,命令解析不用更改,主要是更改命令执行部分,增加switch-case的相关分支,同时再编写do_cmd_xxx的时候也要正确增加if分支。
上面添加的部分也只是硬件操作功能,然而在uboot这样的shell中,管理环境变量也是shell的重要组成部分,添加方式和硬件功能加入shell的方式一样。
环境变量:
环境变量就好象程序的全局变量一样,整个程序中唯一。
可以影响程序的执行,环境变量可以支持一些命令(这个命令要在shell中实现)来查询环境变量、设置环境变量、保存环境变量(必须借助flash才能完成。等开机的时候,就会直接利用flash中存储的环境变量参数来完成环境变量的初始化)
环境变量相关函数为(在扩展shell功能的时候相当于硬件do_cmd_led中led_on()):
void env_init(void);
int env_get(const char *pEnv, char *val);
void env_set(const char *pEnv, const char *val);
环境变量通常是个结构体(例如):
typedef struct env{char env_name[10];//记录环境变量的名字char env_val[20]; //记录环境变量的值,这个才是真正干活的数据,其他两个都是辅助标记int is_used; // 标志位,0表示这个环境变量没用,1表示用了}env_t;
在shell中增加环境变量的查询,设置以及保存功能时一定要记住扩展相应的命令集(即命令集初始化):
void init_cmd_set(void){memset((char *)g_cmdset, 0, sizeof(g_cmdset));// 先全部清零strcpy(g_cmdset[0], led);strcpy(g_cmdset[1], lcd);strcpy(g_cmdset[2], pwm);strcpy(g_cmdset[3], adc);strcpy(g_cmdset[4], printenv);strcpy(g_cmdset[5], setenv);memset((char *)cmd, 0, sizeof(cmd));}
0 0
- shell架构,环境变量
- shell环境变量
- shell环境变量
- shell环境变量
- shell环境变量
- shell环境变量
- shell环境变量
- Shell:环境变量
- shell环境变量
- Shell:环境变量
- shell环境变量
- 环境变量和shell变量
- 修改shell的环境变量
- Ubuntu 设置shell环境变量
- shell 变量 & 环境变量 (bash)
- SHELL环境变量+参数变量
- shell输入输出和环境变量
- shell系统环境变量
- Oil Deposits——个人c++解
- 龙芯相关
- JVM(十二) 创建用户自定义的类加载器
- Qt设置horizontal line 和vertical line 的颜色
- caffe 视觉层
- shell架构,环境变量
- P1307数字反转
- iOS集成友盟第三方登录
- python基础
- ARM程序状态寄存器
- 一些常用的第三方框架之xUtils
- 在(Eclipse)Myeclipse中创建Maven项目
- 商品展示
- 关于差分放大器INA143的使用