第一部分、章节目录
1.16.1.shell是什么鬼
1.16.2.shell实战1-从零写最简单shell
1.16.3.shell实战2-将简易shell移植到开发板中
1.16.4.shell实战3-定义标准命令集及解析
1.16.5.shell实战4-添加第一个命令
1.16.6.shell实战5-添加其他命令1
1.16.7.shell实战6-添加其他命令2
1.16.8.shell实战7-实现开机倒计时自动执行命令1
1.16.9.shell实战7-实现开机倒计时自动执行命令2
1.16.10.shell实战8-初步实现环境变量
1.16.11.shell实战8-初步实现环境变量2
第二部分、章节介绍
1.16.1.shell是什么鬼
本节为概念篇,主要讲解了什么是shell,shell的工作方式,常见的shell有哪些,shell的实现机制等,目的是让大家对shell有直观的认识,后面才好去写shell。
1.16.2.shell实战1-从零写最简单shell
本节是shell实战第一节,我们将从零开始编程自己写一个最简单的shell,并且调试运行。通过这个简单到不能再简单的shell让大家进一步理解shell的原理和实现方法。
1.16.3.shell实战2-将简易shell移植到开发板中
本节是shell实战第二节,将上节编写的shell程序移植到开发板中。我们在之前的裸机程序中随便选一个工程为基础进行移植,这个过程请大家体会嵌入式软件的移植。
1.16.4.shell实战3-定义标准命令集及解析
本节是shell实战第三节,本节我们将建立标准的命令集,并且写出命令集解析函数的框架结构,这个框架必须是一个具有可扩展性的结构以方便后续添加新的命令。
1.16.5.shell实战4-添加第一个命令
本节是shell实战第四节,我们将在上节构建的标准命令集基础上实现第一个命令-控制板载LED点亮和熄灭。通过这个命令的添加打通标准命令集下的shell运行。
1.16.6.shell实战5-添加其他命令1
本节是shell实战第五节,我们将继续向标准命令集的shell添加更多的命令,本节实现的是pwm蜂鸣器的控制和ADC采集的控制。
1.16.7.shell实战6-添加其他命令2
本节是shell实战第六节,我们将继续向标准命令集的shell添加更多的命令,本节实现的是LCD的控制和各种图像的显示。
1.16.8.shell实战7-实现开机倒计时自动执行命令1
本节是shell实战第七节,本节我们要添加的功能是开机倒计时自启动,这个功能是模仿PC机BIOS和uboot的自动启动功能的。
1.16.9.shell实战7-实现开机倒计时自动执行命令2
本节是shell实战第七节,本节我们要添加的功能是开机倒计时自启动,这个功能是模仿PC机BIOS和uboot的自动启动功能的。
1.16.10.shell实战8-初步实现环境变量1
本节是shell实战第八节,本节我们将为shell程序添加环境变量。这里的环境变量将被宏定义在程序代码中并且运行时存在于内存中工作,目的是使大家初步接受并且理解环境变量的概念和意义。
1.16.11.shell实战8-初步实现环境变量2
本节继续来实现环境变量。首先解决了代码大小超限导致的被截取的问题,然后实现了env_get和env_set方法。
第三部分、随堂记录
1.16.1.shell是什么鬼
1.16.1.1、壳与封装
(1)shell就是壳的意思,在计算机中经常提到shell是用户操作接口的意思。
(2)因为计算机程序本身很复杂,里面的实现和外面的调用必须分开。接口本身就是对内部复杂的实现的一种封装,外部只需要通过接口就可以很容易的实现效果,但是却不用理会内部实现的复杂性和原理。
1.16.1.2、程序或操作系统的用户接口
(1)操作系统运行起来后都会给用户提供一个操作界面,这个操作界面就叫shell。用户可以通过shell来调用操作系统内部的复杂实现。
(2)shell编程就是在shell层次上进行编程。譬如linux中的脚本编程、windows中的批处理。
1.16.1.3、两种shell:GUI和cmdline
(1)GUI(图形用户界面),特点是操作简单、易学易用,适合使用电脑来工作的人。
(2)cmdline(命令行界面),譬如linux的终端和windows的cmd,特点是不易用易学,优点是可以进行方便的shell编程,适合做开发的人。
(3)展望:将来的shell应该是声音图像等接口的。
1.16.1.4、shell的运行原理:由消息接收、解析、执行构成的死循环
(1)我们主要分析命令行shell的运行原理。
(2)命令行shell其实就是一个死循环。这个死循环包含3个模块,这3个模块是串联的,分别是命令接收、命令解析、命令执行。
(3)命令行有一个标准命令集,用户在操作的时候必须知道自己想要的操作用通过哪个命令来实现,不能随便输入命令。如果用户输入了一个不是标准命令的命令(不能识别的命令),提示用户这不是一个合法命令,然后重新回到命令行让用户输入下一个命令。
(4)用户输入命令的界面是一个命令行,命令行的意思就是用户输入的命令是以行为单位的,更好理解的说用户输入的命令在用户按下回车键之后就算是结束了,shell可以开始接收了。
1.16.1.5、shell举例:uboot、linux终端、Windows图形界面等
(1)常见的shell,uboot就是一个裸机程序构成的shell(本课程要完成的shell也是裸机的),clinux中断和windows的cmd是操作系统下的命令行shell。windows图形界面、ubuntu图形界面、android的图形界面这些都是图形界面的shell。突然想到另一个类型的shell,网页类型的shell,典型代表就是路由器。
1.16.2.shell实战1-从零写最简单shell
1.16.2.1、使用printf和scanf做输入回显
1.16.2.2、定义简单命令集
1.16.3.shell实战2-将简易shell移植到开发板中
1.16.3.1、工程选定、文件复制、Makefile书写
1.16.3.2、printf和scanf函数(本质是putc和getc函数)的移植
(1)puts和putchar函数比较简单,注意的地方就是windows和linux中的回车键定义的不同。
所以在putchar函数中如果用户要输出'\n'时,实际输出"\r\n"
(2)gets和getchar是从Windows中的SecureCRT终端输入字符串到裸机程序中。这里面至少有2个问题:用户输入回显问题、用户按回车键问题、用户按BackSpace退格键问题
(3)自己实现回显
(4)用户按回车键问题,在getchar中解决。方法是碰到'\r'时直接返回'\n'
1.16.3.3、编译下载和调试验证
1.16.4.shell实战3-定义标准命令集及解析
1.16.4.1、添加cmd_parser和cmd_exec
1.16.4.2、实现简单的cmd_parser
1.16.4.3、实现对应的cmd_exec
1.16.5.shell实战4-添加第一个命令
1.16.5.1、命令任务分析
(1)第一个命令:led,实现的功能是控制板载LED的亮和灭
(2)命令定义:led on 表示点亮led,led off 熄灭led
(3)扩展:led 1 on 表示点亮第一个led。(课堂不实现,留给大家做作业)
1.16.5.2、命令解析
(1)命令解析其实就是把一个类似 led on这种命令解析成led和on两个字符串,放在一个字符串数组中。
1.16.6.shell实战5-添加其他命令1
1.16.6.1、第一个硬件LED的控制
1.16.6.2、扩展其他硬件命令
1.16.7.shell实战6-添加其他命令2
1.16.8.shell实战7-实现开机倒计时自动执行命令1
(1)计时功能。要用计时的部件(定时器)来完成。
(2)主程序
注意:C语言中声明全局变量时不能加初始化,如果加了编译器就会把这个声明当作定义
1.16.9.shell实战7-实现开机倒计时自动执行命令2
1.16.10.shell实战8-初步实现环境变量1
1.16.10.1、环境变量就好象程序的全局变量一样,整个程序中唯一。可以影响程序的执行,环境变量可以支持一些命令来查询环境变量、设置环境变量、保存环境变量(必须借助flash才能完成。本节只在内存中实现环境变量所以无法保存)。
1.16.11.shell实战8-初步实现环境变量2