1.嵌入式操作系统结构
一般情况下分为硬件子系统和软件子系统;
硬件子系统主要包括:CPU小系统,电源模块,调试模块,时钟模块,接口模块,复位和配置模块;
软件子系统主要包括:驱动层,中间层,应用层
2.实时操作系统
实时的本质是任务的处理是可预测的,也就说在确定的时间内完成任务的处理;实时操作系统是指在规定的时间内完成任务的处理。
实时操作系统分为两类:硬实时和软实时:通常是从精度上讲,软实时一般大于千分之一秒;硬实时一般都是微秒级的。
3.嵌入式处理器分类
主要分为MCU(C51,AVR),MPU(ARM,MIPS,PPC,X86),SOC,DSP。
4.嵌入式操作系统
按照实时性来分,强实时的有Vxworks,uc/OS, OSE;弱实时的有WinCE,Linux。
5.make
主要作用是读入所有的makefile文件,初始化变量,推导出变量的隐晦规则,并分析规则,为所有的文件生成依赖关系链,根据依赖关系和文件修改情况,决定什么文件重新生成,然后执行生成命令。
6.makefle的作用
在通常的IDE集成环境中,不需要makefile,只需要建立好工程就可以了,因此IDE环境简单一些;开发中使用makefile的很大程度上是指定编译链接规则, 实现自动化编译,由于makefile在开发中需要自己指定,所以相对于IDE要灵活。
7.GCC开发工具
由于Linux下是没有图形界面的,因此提供了相应的开发工具;
8.交叉编译
什么是交叉编译?在一个平台上编译出来可在另一个平台上运行的可执行代码,这个过程叫做交叉编译,这个过程要关注一下平台使用的硬件架构和操作系统。
为什么要使用交叉编译?主要原因有两点:1.当我们的目标机尚未建立起来,必须借助交叉编译生成需要的bootloader和内核;2.目标机上有限的资源,主要表现在CPU的低性能和非常小的内存空间,对于编译来说,不可能在目标机上构建编译环境(只工具链就会占用很大的空间),因此,就在我们的PC上建立交叉编译的环境,以生成在目标机上可执行文件。
我们经常在windows下面利用VC++编译和调试C代码,最终生成可以在windows下可执行的程序;同样的道理,我们也可以在PC上(不论是windows还是linux)编译可在目标机上运行的可执行程序,唯一不同的是我们需要安装相对应的交叉编译工具链(cross complication tool chain)。举例如下:
交叉开发环境可以自己建立,也可以采用厂家封装好的集成开发环境,比较典型的集成交叉开发环境如下:
这里注意,创建交叉编译器的时候要注意版本匹配问题,特别是Linux,要注意软件包、Kernel、编译器三者版本要match;设置交叉环境时,要把Tools和代码路径、makefile相关项都设置正确。
如何创建交叉开发环境呢?
1.打开目标板上的NFS,要求内核支持NFS,打开相应选项;
2.建立Gdb和Gdb Server;
基于GDB进行APP的调试,调试命令主要有:
9.模块编程
什么是模块?模块可以动态的改变内核的功能,这样做可以提高灵活性,主要用于前期调试代码时添加的调试模块;
工具主要有:1. insmod
2.lsmod
3.rmmod
模块的组成主要包括:内核头文件,模块加载和卸载的方法,设备的节点,File操作数据结构,open/close/write/read的方法,makefie
10.Bootloader
含义,boot是与硬件强相关的,主要是初始化硬件,为kernel的运行创造条件;loader是把kernel拷贝到内存中,并且跳转到相应地址开始运行;bootloader由于和硬件是强相关的,因此不同的CPU架构对应着不同类型的bootloader,主要有以下几种不同的bootloader,如下所示:
Bootloader CPU OS
Grub X86 linux,windows
Lilo X86 Linux
U-boot ARM,PPC,MIPS Linux,Vxworks,PSOS
Redboot ARM eCos
Vivi 三星ARM Linux
Bootrom PPC Vxworks
Blob Intel PXA系列 Linux
与主机通信协议:1.串口:kermit,xmodem,ymodem,速率较慢,适用于网口未初始化,相关工具主要有SecureCRT,putty;
2.网口:TFTP,NFS,速度很快;
不管是什么样的架构,bootloader遵循“stage1+stage2”原则:
Stage1:通常使用汇编,初始化CPU的核心寄存器,RAM检查和初始化,拷贝代码到RAM中,设置堆栈,跳转到C入口处执行;
Stage2:通常是C语言,初始化CPU非核心寄存器,初始化相关外设,等待用户输入,如果用户在设定时间内无输入就拷贝内核和文件系统到内存中,然后跳转到内核入口;