shell原理和问答机制引入

来源:互联网 发布:天津网络推广公司 编辑:程序博客网 时间:2024/06/15 22:11

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


(1).

shell,
壳,
用户接口,
一种实现和调用分离的实现,

操作界面,是操作系统提供的shell,


linux中脚本编程,windows中的批处理都是shell编程,

cmdline是一种shell,GUI也是一种shell,
举个例子,创建一个文件,适合使用GUI,但是创建1000个文件呢?这就适合使用cmdline了,


cmdline运行原理,
while(1)
{
 消息接受;
 消息解析;
 命令执行;
}

uboot是一个裸机程序构成的shell,
人机交互必须要有shell,
家用路由器配置界面,就是路由器内置的一个嵌入式web服务器形式的shell,


(2).

版本1#include <stdio.h>#define MAX_LINE_LENGTH256//命令行长度int main( void ){char str[ MAX_LINE_LENGTH ]; //用来存放用户输入的命令内容while( 1 ){//打印命令行提示符,这里不要加换行符哦~printf("YQ");memset( str, 0, sizeof( str ) );//获取用户输入的命令,scanf("%s", str );//解析用户输入的命令,暂时没有//处理用户输入命令,printf(" %s \n", str);}return 0;}版本2,定义命令集,#include <stdio.h>#define MAX_LINE_LENGTH256//命令行长度#define MAX_CMD_NUM 3//最多支持的命令数量//定义一些标准命令#defineled "led"#define lcd"lcd"#definepwm"pwm"char g_cmdset[ MAX_CMD_NUM ][ MAX_LINE_LENGTH];void init_set( void );int main( void ){int i = 0;char str[ MAX_LINE_LENGTH ]; //用来存放用户输入的命令内容init_cmd_set();while( 1 ){//打印命令行提示符,这里不要加换行符哦~printf("YQ");memset( str, 0, sizeof( str ) );//获取用户输入的命令,scanf("%s", str );//解析用户输入的命令,暂时没有for( i = 0; i<MAX_CMD_NUM; i++ ){if(!strcmp( str, g_cmdset[ i ] ) ); //此处比较相同返回0,所以要取反{//相等,就说明找到了命令,去执行命令所对应的命令,//处理用户输入命令,printf(" %s 是合法的\n", str);break;}}if( i>= CMD_NUM ){//说明没有找到这个命令printf("%s不是一个合法命令,请重新输入\n",str );}}return 0;}//初始化命令列表static void init_set( void ){memset( g_cmdset, 0, sizeof(g_cmdset) );strcpy( g_cmdset[ 0 ], led );strcpy( g_cmdset[ 1 ], lcd );strcpy( g_cmdset[ 2 ], pwm );}







(3).
移植到开发板上,
项目源自uart那章,


涉及到自己写stdio.c,
包含各种输入输出的函数,
由于标准库中的输入输出不是输入到串口中的,所以我们需要自己写,哪怕具体实现一样,




回车在windows和linux中不一样,


注意3个功能的细节,
1.命令回显,
2.按回车键问题,
3.按退格键问题,




start.s中,由于代码简单,不需要重定位,






(4).
//cmd.c,命令解析,
int cmd_parser( char *str );//解析命令,
void cmd_exec( char *str ); //执行命令
涉及很多的字符串函数,


可以直接从内核中学习函数的实现,比如字符串,




(5).
添加第一个命令,
led是一级命令,on,off是二级命令,
































0 0