《朱老师物联网大讲堂》学习笔记
学习地址: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_LENGTH 256 //命令行长度
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_LENGTH 256 //命令行长度
#define MAX_CMD_NUM 3 //最多支持的命令数量
//定义一些标准命令
#define led "led"
#define lcd "lcd"
#define pwm "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是二级命令,