嵌入式的基础知识

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下是没有图形界面的,因此提供了相应的开发工具;

  • GCC:编译工具,主要参数如下:
  • -v:查看编译器的版本;
  • -c:只编译不链接;
  • -o:链接,适合c文件;
  • -g:编译时生成调试信息;
  • -gdwarf-2:附带宏调试信息;
  • -fomit-frame-pointer:
  • -o1/2/3:编译优化选项;
  • -l:指定头文件目录; 
  • ld:与makefile结合使用链接目标文件;
  • objdump:反汇编;
  • strip:剥离符号信息,减少目标或lib的大小;
  • gdb:命令行方式调试,-g参数编译elf可执行文件
  • ddd:图形界面

 

8.交叉编译

什么是交叉编译?在一个平台上编译出来可在另一个平台上运行的可执行代码,这个过程叫做交叉编译,这个过程要关注一下平台使用的硬件架构和操作系统。

为什么要使用交叉编译?主要原因有两点:1.当我们的目标机尚未建立起来,必须借助交叉编译生成需要的bootloader和内核;2.目标机上有限的资源,主要表现在CPU的低性能和非常小的内存空间,对于编译来说,不可能在目标机上构建编译环境(只工具链就会占用很大的空间),因此,就在我们的PC上建立交叉编译的环境,以生成在目标机上可执行文件。

我们经常在windows下面利用VC++编译和调试C代码,最终生成可以在windows下可执行的程序;同样的道理,我们也可以在PC上(不论是windows还是linux)编译可在目标机上运行的可执行程序,唯一不同的是我们需要安装相对应的交叉编译工具链(cross complication tool chain)。举例如下:

  • 在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
  • 在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
  • 在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

交叉开发环境可以自己建立,也可以采用厂家封装好的集成开发环境,比较典型的集成交叉开发环境如下:

  • ARM ADS or SDT
  • MS E-VC or Windows Mobile
  • WindRiver Tornado,用于Vxworks
  • TI的CSS,用于DSP;
  • Freescale的Codewarrior,用于PPC;
  • GCC用于Linux的开发;

这里注意,创建交叉编译器的时候要注意版本匹配问题,特别是Linux,要注意软件包、Kernel、编译器三者版本要match;设置交叉环境时,要把Tools和代码路径、makefile相关项都设置正确。

 

如何创建交叉开发环境呢?

1.打开目标板上的NFS,要求内核支持NFS,打开相应选项;

2.建立Gdb和Gdb Server;

基于GDB进行APP的调试,调试命令主要有: 

  • File:载入elf文件;
  • Run:启动运行;
  • List:显示当前的程序和函数;
  • Break:设置断点;
  • Delete b:删除断点;
  • Next,step:单步运行;
  • Continue:断点停止后继续执行;
  • Bt,backtrace,显示调用栈;
  • Print,查看变量;
  • Display:动态监视变量;

 

 

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”原则:

  • 与体系架构强相关,与体系架构无关;
  • Flash+RAM;
  • 汇编+C;

Stage1:通常使用汇编,初始化CPU的核心寄存器,RAM检查和初始化,拷贝代码到RAM中,设置堆栈,跳转到C入口处执行;

Stage2:通常是C语言,初始化CPU非核心寄存器,初始化相关外设,等待用户输入,如果用户在设定时间内无输入就拷贝内核和文件系统到内存中,然后跳转到内核入口;

你可能感兴趣的:(嵌入式的基础知识)