《嵌入式linux应用开发完全手册》核心笔记(全)

2019-07-13 04:38发布

转载来自:https://blog.csdn.net/sinat_36184075/article/details/71305568
** 本文未附任何实例代码,基于目标板的不同操作不尽相同,网络资源针对比较成熟的开发板均可找到对应的成套实例代码
【开发环境构建】
1. 开发环境搭建:操作系统或虚拟机Ubuntu安装、网络服务配置、工具安装等
    工具资源<云盘>:https://pan.baidu.com/s/1bpakJtP   // env/嵌入式linux软件开发环境(不定期更新)
    步骤整理<博客>:http://blog.csdn.net/sinat_36184075/article/details/71194832

2. 编程基础内容:交叉编译使用、Makefile规则、常用汇编指令
    交叉编译工具链制作<博客>:http://blog.csdn.net/sinat_36184075/article/details/71195114
    Makefile编写<博客>:http://blog.csdn.net/sinat_36184075/article/details/54917518
    汇编指令快速查询<博客>:http://blog.csdn.net/sinat_36184075/article/details/55819869

3. 常用工具使用:
    windows下工具的使用(SourceInsight、SecureCRT、keil、IAR等)
    linux下工具的使用(tftp、nfs、vi、man手册、基本命令行命令及grep/find/tar/diff/patch等)
    // 常用工具上手简单,可自查。

【ARM9嵌入式系统基础】

1. GPIO接口
1) 嵌入式开发步骤:
    编程:主要以.c .h文件为主;
    编译:make命令调用Makefile中写好的交叉编译规则来编译出.bin二进制文件;
    烧写:PC并口与JTAG连接或PC的USB与串口连接,使用对应的工具和命令烧写;
    运行测试:命令运行或复位开发板,观察运行效果。
2) 通过GPIO引脚实现软件如何控制硬件:
    单个引脚的操作有3种:输出高低电平、检测引脚状态、中断;
    对某个引脚的操作通过读、写寄存器来实现;
    读写寄存器方法:通过编程程序,读写寄存器的地址;
    // 需结合2点:目标板电路图(确定引脚)、ARM芯片手册Datasheet(操作说明)

2. 存储控制器
1)目标板地址空间布局:
    32位CPU虚拟地址4G,其中1G为CPU内核空间,3G为用户空间;
    // 1G:0x0000_0000 ~ 0x4000_0000
    // 3G:0x4000_0000 ~ 0xFFFF_FFFF
    // 表:目标板功能部件与寄存器地址对照表
    // 表:存储控制器与所接外设的访问地址对照表


3. 内存管理单元MMU
1) 虚拟地址和物理地址关系
    MMU:负责虚拟地址到物理地址的映射,提供硬件机制的内存访问权限检查。
    通过MMU使得各个用户进程都有自己独立的地址空间。
    ARM的CPU上地址转换有3个概念:虚拟地址VA、变换后的虚拟地址MVA、物理地址PA。
    没启动MMU时,CPU、cache、MMU、外设等所有部件使用的是物理地址;
    启动MMU之后,CPU对外发出虚拟地址VA,VA被转换为MVA供cache、MMU使用,MVA在这里被转换为PA,最后使用PA读写实际的硬件设备(内部寄存器或外接设备)。
    CPU核看到的、用到的只是虚拟地址VA。实际设备看不到VA和MVA,读写他们时使用的是物理地址PA。
2) 通过设置MMU来控制虚拟地址到物理地址的转化
    虚拟地址VA >> 物理地址PA 方法有2:用一个确定的数学公式转换、用表格存储虚拟地址对应的物理地址(表格:页表Page Table)。
    页表:由一个个条目(Entry)组成,每个条目存储了一段VA对应的PA及其访问权限,或者下一页表的地址。
    ARM的CPU核使用的是第二种方法:页表。
3) MMU的内存访问权限机制
    内存的访问权限检查是MMU的主要功能之一,决定了一块内存是否允许被读或被写。
    // 表:AP位、S、R位的访问权限对照表

4. Nand Flash控制器
1) Nand Flash芯片接口
    类似于PC上的硬盘,掉电不丢失,保存系统运行所必须的操作系统、应用程序、用户数据、其他数据等。
    容量:16M~512M
    与Nor Flash相比优点:Nand Flash性能高即擦写速度快3ms、可擦写次数多、生命周期10倍以上、容量大、价格低。
    与Nor Flash相比缺点:Nand Flash可靠性较低必须要有校验措施、易用性不如Nor Flash、不支持XIP(XIP:代码可以直接在Nor Flash上运行,无需加载到内存)。
    Flash存储器件的可靠性要考虑3点:位反转、坏块、可擦除次数。
    Nand Flash发生位反转的概率更高,推荐使用EDC/ECC进行错误检测和恢复。
    嵌入式linux对两种Flash的支持都很成熟,在Nor Flash上常用jffs2文件系统,在Nand Flash上常用yaffs文件系统。在更底层,有MTD驱动程序实现了对他们的读、写、擦除操作,也实现了EDC/ECC校验。
2) 通过Nand Flash控制器访问Nand Flash的方法
    对Nand Flash进行访问控制时,需要先发出命令,然后发出地址序列,最后读写数据;需要使用各个使能信号来分辨是命令、地址、还是数据。

5. 中断体系结构
1) ARM的CPU中7种工作模式
    用户模式usr、快速中断模式fiq、中断模式irq、管理模式svc、数据访问终止模式abt、系统模式sys、未定义指令终止模式und。
    大多数程序运行与用户模式usr,进入其他6种特权模式是为了处理中断、异常、或者访问被保护的系统资源。
    ARM的CPU中有两种工作状态:32bit的ARM指令、16bit的Thumb指令。
    ARM9中有31个32bit寄存器 + 6个状态寄存器 = 37个寄存器。
2) 中断服务程序编写方法
    CPU运行过程中,知道各类外设发生了某些事件如串口接收到了新数据、USB接口插入了设备、按下了某个按键等,主要通过2种方法:
    轮询:循环检查设备状态并作出相应反应。实现简单,常用在功能单一的系统中,如温控系统;缺点是占用CPU资源过高,不适用于多任务系统;
    中断:当某时间发生时,硬件会设置某个寄存器,中断当前程序,跳转执行此事件,最后返回被中断的程序。实现相对复杂,但效率很高,是常用的方法。
    使用中断的步骤:
    ①设置好中断模式和快速中断模式下的栈;
    ②准备好中断处理函数(ISR);
    ③设置中断优先级;
    ④进入、退出中断模式或快速中断模式时,需要保存、恢复被中断程序的运行环境;
    ⑤根据具体中断,设置相应外设;
    ⑥确定使用此中断的方式:FIQ或IRQ;
    ⑦使能中断。

6. 系统时钟和定时器
1) 系统时钟体系结构
    时钟控制逻辑给整个芯片提供三种时钟,
    FCLK:用于CPU核;
    HCLK:用于AHB总线(用高性能模块的连接)上的设备,如CPU核、存储器控制、中断控制器、LCD控制器、DMA和USB主机模块等;
    PCLK:用于APB总线(用于低带宽外设的连接)上的设备,如IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC和SPI;
2) 通过设置MPLL改变系统时钟的方法
    ①设置分频/倍频
    ②启动MPLL
    ③设置存储控制器SDRAM
    ④初始化定时器0
    ⑤定时器0中断使能及中断服务程序

7. 通用异步收发器UART
1) UART原理
    全双工方式串行双向数据收发。
    通信管脚跳线接线方式:
    RxD <=> TxD
    TxD <=> RxD
    GND <=> GND
    RS232逻辑电平:高电平(3~12V)表示0,低电平(-3~-12V)表示1。
    重要参数:
    >>数据位个数: 5 ~ 8 bit   (开发板那端定好的是 8 bit / 帧数据)
    >>验证方式:奇校验、偶校验、无校验
    >>停止位宽度:1~2bit
    >>通信的速率:bps (bit per second - 每秒传输bit位,即波特率)
    数据收发原理:
    发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到发送移位器(TS)中,发送移位器将数据一位一位的发送到TxDn数据线上。
    接收数据时,接收移位器(RS)将RxDn数据线上的数据一位一位的接收进来,然后复制到接收FIFO中,CPU即可从中读取数据。
2) UART使用
    ①将所涉及的UART通道管脚设为UART功能
    ②设置波特率
    ③设置传输格式
    ④设置时钟源、中断方式(或DMA模式)