写在前面:其实这些并不能包含全部内容,命令(make shell部分)和驱动程序不太想打了这个还是看ppt吧
选择填空部分
- 嵌入式计算机是专用计算机的代表、没有固定的形态、嵌入到设备中
- 嵌入式计算机已经成为最主流的计算机,它开启了一个时代,即PC失去主角位置的时代——后PC时代。
- 嵌入式系统是由嵌入式硬件和嵌入式软件组成。
- 嵌入式系统和台式计算机硬件比较:CPU(ARM等,Intel,AMD的x86处理器)、内存(SDRAM等,内存条)、存储设备(Flash eMMc,硬盘或固态盘)、输入设备(按键触摸屏,鼠标键盘),输出(LCD,显示器),声音设备(音频芯片,声卡),接口(MAX3232等,主板集成),其他设备(USB及网络等芯片,主板集成或外接卡)
PS:加黑为嵌入式 - 嵌入式系统和台式计算机软件比较:引导代码(BootLoader引导,主板Bios引导)、操作系统(Linux WinCE VxWorks 需要移植,一般为Windows不需要移植)、驱动程序(每个设备驱动程序都必须针对电路板进行重新开发或移植,一般不能直接下载使用,操作系统含有大量驱动程序或从网上直接下载使用)、协议栈(需要移植,操作系统或第三方提供),开发环境(借助主机进行交叉编译,在本机就可以调试),仿真器(通常需要,不需要)
PS:加黑为嵌入式 - 主流的嵌入式系统包含着操作系统,然而在嵌入式系统的定义中却没有必须使用操作系统的明确要求。
- 嵌入式系统和单片机硬件比较:硬件平台(厂家提供的硬件平台,自己制作),硬件设计(以硬件平台为基础的裁剪和扩展,重新设计)、CPU(一般为32位,多为8和16位)、MMU(支持,不支持)、功能(能够支持实现复杂功能,难以实现复杂功能),开发人员(主要为计算机专业人员,硬件设计人员)、仿真器(通常初始化需要 以后可不用,全程使用)、仿真头(不需要,需要)
PS:加黑为嵌入式 - 嵌入式系统和单片机软件比较:开发平台(主机上匹配的操作系统,主机上的仿真软件)、功能(相对复杂,通常简单)、运行环境(嵌入式操作系统,直接运行在硬件上)、编程语言(C JAVA及框架,C 汇编)、协议支持(嵌入式操作系统提供 移植后使用,自己实现)、驱动程序(操作系统提供大部分驱动,自己实现)、调试(交叉编译 操作系统环境调试,专门的仿真软件在线调试)
- 三种传统处理器:微控制单元(MCU)、数字信号处理器(DSP)、微处理器(MPU)
- 嵌入式处理器中ARM7/9/11(由低端到高端,ARM7没有MMU,ARM11带有多媒体支持),Cortex-A应用于高性能的应用开发平台,Cortex-M一般应用于单片机,像是STM32中的M即代表Cortex-M的处理器。
- ARM是一个公司名字,也是一类微处理器名字,也是一种技术名字,ARM公司主要出售ARM技术IP核的授权,不直接从事芯片生产,从事RISC技术的芯片开发。
- ARM的其他产片:OptimoDE(支持超长指令字)、MPCore(多核产品)、SecurCore(面向信息安全应用)
- ARM处理器特性:支持16位Thumb,提供SIMD功能,支持DSP指令,含有java加速器Jazelle。
- x86完全可以在嵌入式系统中使用,在嵌入式系统中可以直接使用x86计算机的部分或全部硬件,不过应用不算广泛。
- X86和嵌入式处理器硬件比较:应用(家用PC,特定应用)、组成(ALU等片内资源有限 其他需拓展,ALU等)、指令系统(CISC,RISC)、IO编制方式(独立编制,统一编址)、系统存储(硬盘 按需调入,Flash/eMMC 启动后全部加载)、软件(多样复杂全面,面向特定需求 小 精简)、产品使用(通过人机交互实现,嵌入设备自动完成)X86常作为嵌入式系统的开发主机
PS:加黑为嵌入式 - 其他嵌入式处理器:MIPS(也有MIPS公司 既开发结构又生产芯片,RISC指令集)、PowerPC(价格贵 高端 RISC)
- 非实时操作系统采用基于优先级的调度算法,着重于提供高速响应和大吞吐量。
- Linux不是一个实时操作系统,如果面向实时应用,则必须进行实时性改造
- Linux存在着许多不同的版本,在嵌入式系统领域,Linux是应用最广泛的首选操作系统,一般为2.6或3.0版本
- RT-Linux做到了既兼容通常的Linux任务,又保证强实时性能的目的
- uClinux是针对没有MMU的处理器而设计的,程序中访问的都是物理地址
- 安卓(Android)是一种基于Linux的自由及开放源代码的操作系统
- Android操作系统的智能手机市场份额为87%,iOS的市场份额为13%,前者是后者的6倍多。
- iOS与苹果的Mac OS X一样,属于类Unix的商业操作系统
- uC/OS是一个实时嵌入式操作系统,代表版本是uC/OS-Ⅱ,可固化、可裁剪、抢先式、实时多任务(max-60)、可确定性
- Windows CE是微软的产品,但并不是PC上的Windows,是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统,基本内核需要200KBROM,256个优先级,使开发人员在时序安排方面有更大的灵活性
- VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种实时操作系统,价格昂贵
- 传统单片机系统的开发采用的是“主机+仿真器+仿真头+自制硬件”模式,嵌入式系统开发的“主机+仿真器+硬件平台” 模式或“主机+硬件平台”模式:
- 一些新的嵌入式硬件平台不再提供仿真器,而是使用SD卡或USB接口
- 个人移动设备,即PMD(Personal mobile device) ,是指一类带有多媒体用户界面的无线设备,比如手机、平板电脑等
- PAD摆脱了电脑作为开发者开发平台的最后一点痕迹,已经成为一个纯粹的应用平台
- 传统的嵌入式系统通常是不支持二次开发的,而类似手机、平板电脑这样的PMD产品已经打破了这个限制,PMD已经拥有了独立的应用平台,允许第3方软件的运行,而传统的嵌入式系统则不能,实时性能需求也是重要的。
- PMD并不象PC一样作为开发环境被使用,它仅是一个应用平台而不是开发平台
- Android平台是开源的,包括内容提供器、资源管理器、通知管理器和活动管理器,系统构架包括包括应用程序层、应用程序框架层、系统运行库层和Linux内核层,其开发基于Java语言。
- 嵌入式处理器内部带有存储器、NandFlash及LCD等I/O接口,可以直接连接这类外设一些接口甚至连同外设一起被集成到芯片内部,如看门狗(watchdog),实时时钟(RTC)等
- 嵌入式主机板分为两种主要类型:一体式主机板和核心式主机板
- 片内接口的编程通过操作嵌入式处理器内部一组特殊寄存器的完成,本课程称为特殊功能寄存器SFR,外部接口则与外部总线相连,通过端口进行操作。
- 通常嵌入式系统中可配置的复用引脚功能中至少都包含有通用目的的输入输出(GPIO)
- IM6运行频率高达1.2GHz,包括单核、双核、四核产品
- IM6内部有各32KB的一级指令和数据缓存、256KB到1MB的二级缓存
- IM6支持1080p60解码、1080p30编码和3D高清视频播放,出色的3D图形性能支持OpenCL
- IM6 96K启动ROM、16K加密RAM、128个GPIO口
- IM6集成HDMI、SD、USB2.0、千兆以太网、SATA、PCIe 、MIPI及FlexCAN
- NandFlash命令锁存引脚CLE、芯片写引脚nWE、地址锁存引脚ALE、芯片读引脚nRE、芯片使能引脚nCE、就绪/忙引脚R/nB
- NandFlash发生位交换错误的次数多,需要使用ECC校验算法 ,需要初始化扫描,标记坏块
- NandFlash使用地址和数据引脚构成通用的I/O口,通过多次寻址存取数据,其读和写操作以512(或者2K)字节的页为单位
- eMMC (Embedded Multi Media Card)在封装中集成了一个控制器,提供标准接口并管理闪存就是nand flash+主控IC,对外的接口协议,生产厂家有台湾的Phison、SMI, 大陆的SiliconGo。
- IMX6有大量的复用引脚,每个引脚最多可配置成8种不同的功能,其中就包括GPIO功能
- PWM是指对一个方波序列信号的占空比按照要求进行调制,而不改变信号的幅度和周期,因此脉宽调制信号是数字式的
- 如果调制信号的频率远远大于信号接受者的分辨率,则接收者获得的是信号的平均效果,因此模拟信号可以使用PWM实现
- IMX6 PWM 4个带时钟源选择的16位递增计数器、4x16位FIFO,最大限度减少中断开销、12位预分频器等等。
- IM6中UART引脚 TXD:发送数据引脚、RXD:接收数据引脚(最简单的串行通信除了共同的地线外,只需要上述这2个引脚),如果需要握手,则需要流控信号:nRTS:请求对方发送,nCTS:清除请求发送,数据帧包含1个开始位、5到8个数据位、1个可选的奇偶校验位、1个或2个停止位,常设置成8N1(8数据有效位,无奇偶校验,1停止位),IMX6处理器最多可配置成5个串口。
- USB(Universal Serial Bus)即通用串行总线,是应用最广泛的外设接口规范
- 一个完整的USB拓扑,只有一个主机,可以连接127个设备, 既可以使用菊花链形式串行连接,也可以使用集线器连接。
- USB1.1(最高12Mb/s)、USB2.0(最高480Mb/s)、USB3.0(最高5Gb/s)
- IMX6处理器中显示接口包括HDMI、LVDS、MIPI及EPDC(e-ink电子墨水屏接口),摄像头接口为20位CSI
- 行同步脉冲信号,驱动行数据传送;像素同步信号:上升沿传送,下降沿采样;帧同步信号,指示一个新帧的开始;LCD驱动的交流信号,控制打开或关闭像素。
- IIC总线只需要2个引脚,即串行数据线SDA和串行时钟线SCL;总线空闲时,SDA和SCL为高电平,启动数据传输时SCL保持为高,SDA由高变低,停止数据传输时SCL为高SDA由低变高;数据传输时,SCL为高期间,SDA必须保持稳定,数据的改变必须在SCL为低时完成, 时钟上升沿采集数据。IMX6最多可配置3个IIC总线控制器。
- AC’97(Audio Codec 1997)是以Intel为首的五个PC厂商共同提出的规格标准
- IIS(Inter-IC Sound),也称I2S总线, 即集成电路内置音频总线,是为音频数据传输而制定的一种总线标准
- SPI(Serial Peripheral Interface)串行外围设备接口,是处理器与外设芯片间一种高速、低成本、易使用的全双工同步串行总线,SPI接口占用了四根线,IMX6最多可配置5个:SDO:主设备数据输出,从设备数据输入;SDI:主设备数据输入,从设备数据输出;SCLK:用来为数据通信提供同步时钟信号,由主设备产生;CS:从设备使能信号,由主设备控制,SPI接口也可以直接连接SD卡
- 随着嵌入式系统的发展,情况有了改变,如三星的A8处理器提供了TF卡启动方式,我们的实验平台提供了专门基于USB接口的烧写软件,不再需要仿真器
- 常用的JTAG接口有20针、14针和10针3种,IEEE1149.1规定了JTAG的引脚信号,最主要的信号有4个:TCK:时钟信号,输入;TMS:模式选择信号,输入,控制状态机的转换;TDI:数据输入信号;TDO:数据输出信号
- JTAG的基本思想是在靠近芯片的输入/输出引脚上增加一个移位寄存器单元,也就是边界扫描寄存器。当芯片处于调试状态时,边界扫描寄存器可以将芯片和外围的输入/输出隔离开来
通过边界扫描寄存器单元,可以实现对芯片输入/输出信号的观察和控制。 - arm920t的JTAG指令有10条,其中,INTEST 1100将边界扫描寄存器连接到TDI和TDO之间,IDCODE 1110将设备标识寄存器连接到TDI和TDO之间,BYPASS 1111 旁路寄存器连接到TDI和TDO之间。
- Bootloader又称系统启动加载器,主要功能是在开机进入系统之前,加载某些硬件初始化程序,启动系统进程,Bootloader在引导系统前会检查系统的数字签名。
- 通常引导加载程序包括固化在固件(firmware)中的Boot代码(可选)和Bootloader两大部分,是系统加电后运行的第一段软件代码;
相对于操作系统内核来说,它是一个硬件抽象层。 - PC机启动加载两部分组成:
BIOS(其本质就是一段固件程序)
位于硬盘MBR(Main Boot Record,主引导记录)中的操作系统”Bootloader”(如LILO和 GRUB等)
(1)BIOS在完成硬件检测和资源分配后,将硬盘 MBR中的 “Bootloader”读到系统的RAM 中,然后将控制权交给操作系统“Bootloader“
(2)”Bootloader”的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。 - 嵌入式系统中通常没有BIOS那样的固件程序,其引导加载程序系统的加载启动任务就完全由Bootloader来完成,例如ARM7TDMI中,系统在上电或复位时从地址 0x00000000 处开始执行,这个地址存放的是BootLoader程序。
- 典型的嵌入式系统 Bootloader:Blob、U-Boot、Vivi
- vivi是韩国MIZI公司开发的Bootloader,适用于ARM9处理器,其作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境设置成一个合适的状态,以便为运行操作系统准备正确的环境。引导程序执行完后会将控制权交给内核(zImage),内核是操作系统的核心,内核需要的各种配置文件、数据及上层软件都存放在根文件系统之中。
- 系统第一条指令:51单片机:100H,8086:FFFF:0000,ARM:地址 0x00000000,嵌入式系统通常把固态存储设备(比如:ROM、EEPROM 或 FLASH 等)映射到这个预先安排的地址上,而Bootloader就放在这里
- Bootloader不通用:依赖于硬件;依赖于具体的板级配置 ,有些Bootloader支持多种CPU,如U-Boot支持 ARM和MIPS
- RAMDISK虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术
- 从固态存储设备上启动的Bootloader大多都是 2 阶段的启动过程,启动过程分为 stage 1和 stage 2 两部分;汇编语言部分执行简单的硬件初始化,C语言部分负责复制OS数据, 设置OS启动参数,通过串口通信显示信息等功能
- 通常目标机上的 Bootloader 通过串口与主机之间进行文件传输,也可通过以太网连接并借助 TFTP 协议来下载文件(U-Boot的常用方式)
- glibc是GNU发布的libc库,即c运行库。glibc是Linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装Linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。而就像其他的 UNIX 系统一样,其内含的档案群分散于系统的树状目录结构中,像一个支架一般撑起整个操作系统。在 GNU/Linux 系统中,其C函式库发展史点出了GNU/Linux 演进的几个重要里程碑,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑。
- stage2不能使用glibc库中的任何支持函数,没有直接把main地址直接作为stage2的入口点
- 用trampoline(弹簧床)小程序来作为main()函数的外部包裹(external wrapper)
- stage1为stage2的执行以及随后的内核的执行准备好一些基本的硬件环境,包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、初始化 LED、关闭CPU内部指令/数据Cache
- 中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(如ARM的”当前程序状态寄存器CPSR”)来完成
- RAM初始化包括正确地设置系统的内存控制器的功能寄存器以及各内存控制寄存器等。
- stage2通常是C语言执行代码,考虑堆栈空间,空间大小最好是存储器页大小(通常是4KB)的倍数,必须确保所安排的地址范围为可读写的RAM 空间
- SA-1100中(Intel公司的StrongArm-1100芯片),从0xC0000000开始的512M空间被用作系统的RAM空间;在S3C44B0中(ARM7芯片),从0x0c000000到0x10000000之间的64M 地址空间被用作系统的RAM地址空间;在S3C2410(ARM9芯片)中,从0x3000,0000到0x4000,0000之间的256M地址空间被用作系统的RAM地址空间
- 加载内核映像和根文件系统映像规划内存占用的布局:内核映像所占用的内存范围、根文件系统所占用的内存范围
- Linux 2.3.x以后的内核都以标记列表(tagged list)的形式来传递启动参数,启动参数标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束,每个标记由【标识被传递参数的tag_header结构以及随后的参数值】数据结构来组成
在嵌入式 Linux 系统中,通常需要由 Bootloader 设置的常见启动参数:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK(虚拟内存盘)、ATAG_INITRD等 - U-Boot遵循GPL条款的开放源码项目
从FADSROM、8xxROM 、PPCBOOT发展而来
其源码目录、编译形式与Linux内核很相似
源码就是相应Linux内核源程序的简化,尤其是设备驱动程序 - U-boot特点
开放源码;
支持多种嵌入式操作系统内核(尤其对Linux支持最为功能强劲);
支持多个处理器系列;
较高的可靠性和稳定性;
高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等;
丰富的设备驱动源码(BootLoader中可以含有驱动);
较丰富的开发调试文档与强大的网络支持,支持NFS挂载。 - U-Boot主要目录
Board:目标板相关文件,主要包含SDRAM、FLASH驱动;
Common:独立于处理器体系结构的通用代码,如内存大小探测与故障检测;
Cpu:与处理器相关的文件。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;
Driver:通用设备驱动,如CFI(Common Flash Interface的作用是把 NOR Flash 的信息通过统一的方法读出来) FLASH驱动(目前对INTEL FLASH支持较好)
Doc:U-Boot的说明文档;
Include:U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;
lib_xxx:处理器体系相关的文件,如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相
关的文件;
net:与网络功能相关的文件目录,如BOOTP,NFS,TFTP;
Post:上电自检文件目录;
Tools:用于创建U-Boot S-RECORD和BIN镜像文件的工具;
Rtc:RTC驱动程序。 - U-Boot调试方法
方法一
先用仿真器(可以直接操纵内存)创建目标板初始运行环境,将U-Boot镜像文件U-Boot.bin下载到目标板RAM中的指定位置,然后进行跟踪调试
好处:不用将Uboot镜像文件烧写到Flash中去;
弊端:对移植开发人员的移植调试技能要求较高,调试器的配置文件较为复杂。
方法二
用调试器(JTAG小板)先将U-Boot镜像文件烧写到Flash中去,然后用GDB调试器调试(GDB, GNU symbolic debugger, 简单地说就是一个调试工具)
特点
(1)所用的调试器配置文件较为简单,调试过程与U-Boot移植后运行过程相吻合;
(2)U-Boot先从Flash中运行(即XIP本地执行),再重载至RAM 中相应位置,并从那里正式投入运行;
(3)需要不断烧写Flash。 - 移植的主要步骤(S3C2410为例)
(1) 修改Makefile文件
@./mkconfig $(@:_config=) arm arm920t whhit2410 NULL s3c24x0
含义如下:
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
whhit2410: 开发板的型号(BOARD),对应于board/whhit2410目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
(2) 建立board/whhit2410目录,拷贝board/smdk2410下的文件到board/whhit2410目录,将smdk2410.c更名为whhit2410.c
(3) cp include/configs/smdk2410.h include/configs/whhit2410.h
(4) 将arm-linux-gcc的目录加入到PATH环境变量中
(5) 测试编译能否成功:(1)make whhit2410_config(2)make all ARCH=arm 生成U-Boot.bin就OK了
(6) 依照你自己开发板的内存地址分配情况修改board/whhit2410/memsetup.S文件
(7) 在board/whhit2410目录加入NAND Flash读函数,建立nand_read.c 。
(8) 修改board/whhit2410/Makefile
(9) 修改cpu/arm920t/start.S文件
(10) 修改include/configs/whhit2410.h文件
(11) 重新编译U-Boot:make all ARCH=arm
(12) 通过JTAG将U-Boot烧写到flash - 主要命令
printenv :打印环境变量
setenv serverip 192.168.0.66:tftp服务器的ip地址(临时)
setenv ipaddr 192.168.0.11:本机(开发板)的ip地址(临时)
saveenv:保存环境变量
通过tftp下载内核(串口下载命令为loady)
tftp 0x30008000 uImage:用tftp协议,从主机向目标板内存芯片的地址下载内核
nand erase 0x80000(Flash某地址) 0x200000(2MB):擦除目标板Flash中地址开始的2MB空间内容
nand write 0x30008000 0x80000 0x200000:从内存地址中存放的内核向目标板上Flash中地址开始的2MB空间写入 - vivi设计为ARM 处理器系列设计的一个Bootloader,支持使用串口和主机通信;vivi与其它Bootloader相比,增加了对分区的命令支持。
- 编译vivi
(1)首先,进入vivi 源代码目录:#cd /vivi
(2)然后配置和编译它,执行:#make menuconfig,实际上,你不需要自己手工选择配置它,已经配置好了,只需装载一个缺省的配置文件即可,使用这个配置文件生成的vivi 正好适合于目标板,这个配置文件在vivi/arch/def-configs 目录中,该目录包含了一些适合于各种板的配置文件。
(3)装载“arch/def-configs/smdk2410(此文件无扩展名)”配置文件后保存该设置,并执行 #make 命令编译vivi: - 一般完全安装大部分发行版的 Linux 时都会包含它minicom
- Ldd(用来查看程序运行所需的共享库 )、iconv(可以将一种已知的字符集文件转换成另一种已知的字符集文件)、locale(将有关当前语言环境或全部公共语言环境的信息写到标准输出上 )
- as 将汇编语言程序转换为ELF(Executable and Linking Format执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或库易于定位和链接。
- 由#define 所定义的都是由预处理器处理的
- gcc优化选项多用于生成固化代码,而不是生成调试代码
-O1 部分减小代码尺寸,对速度有一定的提高。使用了寄存器变量,提高指令并行度。
-O2 除了解循环、函数插装和静态变量优化,几乎包含所有优化。一般在生成固化代码时使用。
-O3 包含-O2的所有优化,还包含了解循环、函数插装和静态变量优化。该级优化生成的代码执行速度最快,但是代码尺寸比-O2大一些。 - as 将汇编语言程序转换为ELF(Executable and Linking Format执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或库易于定位和链接。as 产生一个交叉参考表(又叫做“交叉引用表”)和一个标准的符号表(又叫做“列表文件(.lst格式文件)”),产生的代码和数据能够放在多个段(Section)中。
- as命令选项
-a[dhlns] 显示as信息
-f 不进行预处理
-I path 设置头文件搜索路径
-o 设定输出文件名
-v 显示版本信息
-W 不显示警告提示
-Z 不显示错误提示 - ld根据链接定位文件(也叫链接命令文件)Linkcmds中代码段、数据段、BSS段和堆栈段等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序,该目标程序是ELF(Executable and Linking Format执行时链接文件)格式,并且可以包含调试信息。
ld可以输出一个内存映象文件,该文件标明所有目标模块、段和符号的绝对定位地址,它也产生目标模块对全局符号引用的交叉参考列表。
ld支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依次对目标模块进行链接,这个特性称为增量链接。
ld会自动从库中装载被调用函数所在的模块。 - linkcmds连接命令文件是用ld的命令语言写成的文件
- 可执行程序包括BSS段、数据段、代码段(也称文本段)
- ld命令选项
-e entry 指定程序入口
-M 输出链接信息
-lar 指定链接库
-L dir 添加搜索路径
-o 设置输出文件名
-T commandfile 指定链接命令文件
-v 显示版本信息
-Map 指定输出映像文件 - 程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。可分为两种类型:静态函数库和共享函数库。
- ar将多个可重定位的目标模块归档为一个函数库文件。
- ar参数
-d 删除库文件中的成员文件。
-m 变更成员文件在库文件中的次序。
-p 显示库文件中的成员文件内容。
-q 将成员文件附加在库文件末端。
-r 将文件插入库文件中。
-t 显示库文件中所包含的文件。
-x 自库文件中取出成员文件。
c 建立库文件。
f 为避免过长的文件名不兼容于其他系统的ar指令,因此可利用此参数,截掉要放入库文件中过长的成员文件名称。
o 保留库文件中文件的日期。
s 利用此参数建立库文件的符号表。
S 不产生符号表。
u 只将日期较新文件插入库文件中。
v 程序执行时显示详细的信息。
V 显示版本信息。 - Gdb是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。它使你能在程序运行时观察程序的内部结构和内存的使用情况.
- make是用于自动编译、链接程序的实用工具。使用make后就不需要手工编译每个程序文件。
- make部分参数
-e 使环境变量优先于makefile的变量
-i 忽略make过程中所有错误
-r 使隐含规则无效 - $@——表示目标名
$^ ——表示所有的依赖文件
$< ——第一个依赖文件 - Makefile是一种配置文件, Makefile 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
- 在makefile中,可以通过给VPATH(特殊变量)赋值来设置规则中目标文件和依赖文件的搜索目录。make首先搜索当前目录,如果未找到依赖的文件,make将按照VPATH中给的目录依次搜索。
- nfs文件
编辑**/etc/exports**(设置nfs给谁服务) - 使某个平台的代码运行在其他平台上的过程就叫做移植
- 大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 小端模式相反。
- Linux内核对多平台有很好的支持
内核的对外部接口是统一的,并且与平台无关
内核的大多数代码也是与平台无关的 - linux主要的体系结构相关代码存在于
arch/architecture
include/asm-architecture - arch任何平台下包含子目录
boot:包含启动内核所使用的部分或全部平台特有代码
kernel:存放支持体系结构特有的(如信号处理和SMP(SMP的全称是“对称多处理“(Symmetrical Multi-Processing)技术,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构))特征的实现
lib:存放高速的体系结构特有的(如strlen和memcpy)通用函数的实现
mm:存放体系结构特有的内存管理程序的实现
math-emu:模拟FPU(Float Point Unit,浮点运算单元,FPU是专用于浮点运算的处理器,以前的FPU是一种单独芯片,在486之后,英特尔把FPU集成在CPU之内)的代码。对于arm处理器来说,此目录用mach-xxx代替 - timer是一个sys_timer类型的结构,它包含以下成员:
init调用执行硬件相关的timer初始化(指向函数的指针)
offset调用返回自从上次timer中断以来经过的微秒数(指向函数的指针)
resume调用执行系统唤醒后的timer恢复操作,一般实现上和init里面的初始化类似(指向函数的指针) - Linux内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信
- Linux内核代码可以分为平台相关部分和平台无关部分
- 文件系统是指操作系统中与管理文件有关的软件和数据。它是操作系统的一部分。
- 这个把分区和目录对应的过程叫做挂载(mount),而这个挂载在文件树中的位置就是挂载点。这种对应关系可以由用户随时中断和改变
- Linux启动时挂载的文件系统被称为根文件系统,是存放运行、维护系统所必需的各种工具软件、库文件、脚本、配置文件和其它各种文件的地方,也可以安装各种软件包。
- Linux系统中的每个文件都被赋予一个唯一的数值,而这个数值被称做索引节点。一个索引节点包含文件的所有信息 。
- Linux文件系统把索引节点号1 赋于根目录。
- linux设备文件类型:一种是块设备文件,另一种是字符设备文件。
- 超级块(super block): 用于存放文件系统信息,一个文件系统内,每个块组的超级块均包含相同内容块组描述(block group descriptior): 用于存放块组信息
数据块位图(data block bitmaps): 用于管理空闲数据块
i-node位图(i-node bitmaps): 用于管理空闲i-node
i-node表(i-node tables): 用于存放i-node表,每个文件对应一个i-node表,i-node表用于管理文件的元数据(如uid、gid、ctime、dtime、指向数据块的指针等)
数据块(data blocks): 用于存放实际用户数据 - Linux的文件系统主要分3块:一个是上层文件系统的系统调用,一是VFS,一是挂载到VFS中的各种实际的文件系统。
- VFS并不是一个实际的文件系统,只是物理文件系统和服务之间的接口层,它对每个Linux文件系统的所有细节进行抽象,使得不同的文件系统在Linux核心和系统中运行的其它进程看来是相同的;
- VFS的主要功能是记录可用的文件系统类型、把设备同对应的文件系统联系起来、处理面向文件的通用操作;
- VFS四个数据对象:超级块对象、索引节点对象、目录项对象、文件对象
- 在Linux下,MTD(Memory Technology Device,存储技术设备)是用于访问存储设备(如ROM和Flash等)的系统,提供了一系列的标准函数。
- MTD驱动程序主要是专门针对各种非易失性存储器(以Flash为主)而设计的,四层:Flash硬件驱动层、MTD原始设备层、MTD设备层、设备节点,MTD的所有源代码在**/drivers/mtd**子目录
- 嵌入式Linux专用的文件系统: YAFFS/YAFFS2文件系统 、Cramfs文件系统
- linux目录
bin 必要的用户命令(二进制文件)
boot 引导加载程序使用的静态文件
dev 设备文件和其他特殊文件
etc 系统配置文件,包括启动文件
home 用户主目录,包括供服务帐号所使用的主目录,如FTP
lib 必要的链接库,如C链接库、内核模块
mnt 安装点,用于暂时安装文件系统
opt 附加的软件套件
proc 用来提供内核与进程信息的虚拟文件系统
root root用户的主目录
sbin 必要的系统管理员命令(二进制文件)
tmp 暂时性文件
usr 在下层包含对大多数用户都有用的大量应用程序和文件
var 监控程序和工具程序所存放的可变数据 - 嵌入式Linux系统的根文件系统的制作
第一步:确定根文件系统的目录结构(/bin,/dev,/etc/,/lib,/proc,/sbin,和/usr必选)
第二步:在各个目录的添加必要的内容: - linux中三种设备:字符设备、块设备、网络设备
- 字符设备原意是指那些只能按顺序一个字节一个字节读取的设备,但事实上一些高级的字符设备也可以从指定位置一次读取一块数据。
- 块设备指那些可以从任意位置读取任意长度数据的设备,它以块为单位进行处理
问答题部分
-
嵌入式系统定义
是指以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 -
嵌入式系统特点
专用、精简、多样、独特、捆绑、OS -
IP核(知识产权核)和SoC
构成系统芯片的功能模块,被设计厂家以知识产权的形式提供给用户,这些模块被称为IP核,SoC是一种基于IP核的嵌入式系统设计技术,在处理器内部的部件通过内部总线连接起来,就像计算机系统一样,这正是片上系统SOC含义所在。 -
硬实时系统和软实时系统的区别和联系
都是实时系统,执行的正确性不仅取决于计算的逻辑结果,而且还取决于结果的产生时间。
硬实时系统:必须对事件做出及时的反应,绝对不能错过事件处理的时限,比如说航天飞机的控制系统,如果出现故障,后果不堪想象。
软实时系统:在系统负荷较重的时候,允许发生错过时限的情况而且不会造成太大的危害,如液晶屏刷新允许有短暂的延迟。 -
完整的有交互能力的嵌入式操作系统2个不可或缺的特性
单独安装独立运行、提供用户接口 -
与应用程序一体化嵌入式操作系统特点
不需要单独安装独立运行
不存在提供交互能力的用户界面(Shell)
操作系统和应用程序一起形成最终可执行程序,两位一体
和单片机系统一样通过仿真器及配套软件进行开发调试 -
一体式主机板和核心式主机板比较
一体式主机板会裁剪掉实际应用中不需要使用的多余功能,形成一个整体,嵌入到设备中使用,这种类型的嵌入式主机板有固定的功能和应用领域,更具专用性,一般不需要再改变,适合在有一定批量和通用性的嵌入式产品中使用。
核心式主机板只包含核心硬件,相当于基于嵌入式处理器的最小系统,使用时通过外围板扩展功能。 -
Flash和EEPROM比较
Flash和EEPROM都是常用的非易失性存储技术,但Flash的容量远远超过EEPROM,二者的最主要的区别还是在读写特性上
Flash在写入之前,必须要经过擦除(erase)操作,而且擦除只能以块(block)为单位,整块擦除,即使要修改一个字节的数据,也需要擦除整个块的内容;而EEPROM是可以逐字节修改的 -
NandFlash和NorFlash比较
NandFlash擦除时数据变为0xFF,写入时只能由1变0,NorFlash擦除时数据变为0x00,写入时只能由0变1;NandFlash读速度不如Nor flash,而擦、写速度高,容量大,价格低,有取代磁盘的趋势,NorFlash读速度高,而擦、写速度低,容量小,价格高等等。 -
几种情况要进行嵌入式系统调试
通过JTAG小板或仿真器烧写启动代码
通过仿真器调试无操作系统的简单应用程序
通过仿真器调试操作系统与应用程序一体化的嵌入式系统
无法装入操作系统时通过仿真器调试硬件故障 -
介绍Vivi(感觉了解就好)
vivi是韩国MIZI公司开发的Bootloader,适用于ARM9处理器,其作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境设置成一个合适的状态,以便为运行操作系统准备正确的环境。引导程序执行完后会将控制权交给内核(zImage),内核是操作系统的核心,内核需要的各种配置文件、数据及上层软件都存放在根文件系统之中。 -
bootloader功能
初始化硬件设备
初始化内存空间
调整系统的软硬件环境,以便操作系统内核启动 -
Bootloader的生命周期
初始化硬件
设置启动参数,告诉内核硬件的信息
跳转到操作系统的首地址
消亡 -
Bootloader的操作模式
启动加载模式
从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行
下载模式
通过串口连接或网络连接等通信手段连接主机(Host),能下载文件,如下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Bootloader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。 -
BootLoader两个阶段的任务
stage1
硬件设备初始化
为加载Bootloader的stage2准备RAM空间
拷贝Bootloader的stage2到RAM空间中
设置好堆栈
跳转到stage2的C入口点
stage2
初始化本阶段要使用到的硬件设备
检测系统内存映射
将内核kernel映像和根文件系统映像从flash上读到RAM空间中
为内核设置启动参数
调用内核 -
串口终端显示乱码或根本没有显示
(1) Bootloader对串口的初始化设置不正确。
(2) 运行在Host端(即主机端)的终端仿真程序对串口的设置不正确,这包括:波特率、奇偶校验、数据位和停止位等方面的设置 -
跳转内核第一条指令满足条件
CPU寄存器的设置
R0=0;@R1=机器类型 ID;@R2=启动参数标记列表在RAM中起始基地址
CPU 模式
必须禁止中断(IRQs和FIQs);
CPU必须SVC模式(超级用户模式);
Cache和MMU的设置
MMU必须关闭;
指令Cache可以打开也可以关闭;
数据Cache必须关 -
GCC概述
(1)gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件;
(2)编译时它首先调用预处理程序(cpp)对输入的源程序进行处理;
(3)然后调用cc1将预处理后的程序编译成汇编代码;
(4)最后由as将汇编代码编译成目标代码;
(5)gcc具有丰富的命令选项,控制编译的各个阶段,满足用户的各种编译需求 -
GNU编译工具链的工作流程
hello.c-(预处理)->hello.i-(编译)-> hello.s-(汇编)->hello.o-(链接)->hello -
GNU工具链的基本组成
GCC(GNU Compiler Collection):是GNU的c和c++编译器,可以配置编译为多种体系结构目标的交叉编译器
Binutils(GNU binary utilities):是二进制文件的处理工具,其中包括GNU的链接器ld,汇编代码编译器as,用来将文件打包重组的ar以及为ar打包的文件建立符号表的ranlib等工具
Glibc(GNU C Library):Gcc使用的C函数库和针对Linux的线程库。 -
硬件平台对移植的影响
处理器字长(不同处理器字长可能不同,可以显式定义)
数据对齐(地址是某个特定大小的整数倍)
字节顺序(一个字中字节排列的顺序)
时间(采用平台无关的时间表达方法可以提高代码可移植性)
内存页面大小 -
linux文件类型
普通文件(-)——如文本文件、C语言源代码、SHELL脚本、二进制的可执行文件等,可用cat、less、more、vi、emacs来察看内容,用mv来改名。
目录文件(d)——包括文件名、子目录名及其指针。它是LINUX储存文件名的唯一地方,可用ls列出目录文件。
链接文件(l)——是指向同一索引节点的那些目录条目。用ls来查看时,连接文件的标志用l开头,而文件面后以"->"指向所连接的文件。
设备文件——LINUX的一些设备如磁盘、终端、打印机等都在文件系统中表示出来,这一类文件就是特殊文件,常放在/dev目录内。例如,软驱A称为/dev/fd0。LINUX无C:的概念,而是用/dev/had来自第一硬盘。 -
硬链接和软链接区别
硬链接是一个指针,指向文件索引节点,系统并不为它重新分配索引节点。软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
硬链接原文件和链接文件公用一个索引节点号,说明他们是同一个文件,而软链接原文件和链接文件拥有不同的索引节点号,表明他们是两个不同的文件;在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全等同关系;