嵌入式笔记

北航嵌入式课程复习资料,好好背最后的题目

Posted by tianchen on September 6, 2019

Overview Of Embedded System

  • Def:
    • 以应用为中心
    • 以计算机技术为基础
    • 软硬件可裁剪
    • 适应对应系统对功能,可靠性、成本、体积,功耗严格要求的
    • 专用计算机系统
  • Feature: 内核小,系统精简,专用性强,资源有限,实时性要求高
  • Components:
    • Hardware: 嵌入式处理器,存储器,模拟电路与电路,接口控制
    • Software:
      • 板级支持包(BSP)
      • 设备驱动
      • OS
      • 协议栈(Protocal Stack)
      • 应用程序
  • 嵌入式处理器
    • MPU(微处理器)
      • 由CPU发展来: 最低功耗和资源
      • MIPS;X86;ARM;PowerPC;SC-400;SPARC
    • MCU(微控制器): STM32
    • 嵌入式DSP:
    • 嵌入式SoC
  • 开发流程: 先PC软件开发,再移植
    • 任务分析 - 处理器/OS选型 - 硬件设计 - 驱动与BSP设计 - 操作系统移植 - 应用程序设计 - 代码固化
  • 调试: —— 交叉编译: 在宿主机上编译生成可以在目标机上运行的程序,原因在于嵌入式可用资源有限。
    • :star: 调试方法
      • 模拟调试
        • ARMSimulator : 不能在线调试,实时仿真
      • ROM Monitor (Angel)
        • Code Warrior是运行在目标机ROM的一段程序,监控目标机的情况
      • 在线仿真(ICE)
        • 在线仿真器,支持单步等 比较昂贵
      • 内嵌JTAG仿真 (Joint Test Action Group)
        • 无需目标存储器,不占用目标系统端口 支持在线仿真 (主流方法)

ARM’s Structure

  • 几种架构:
    • Princeton:数据和指令公用存储空间,统一编址 (ARM7 & 8086)
      • 冯诺依曼架构 ARM7
    • Harvard: 程序指令存储以及数据存储分开,独立编址; 可同时读和写指令和数据,且两者可以用不同位宽 ARM A9
    • 典型结构:
      • ARM7
        • 支持16位压缩指令集 Thumbs
        • 支持片上Debug
        • 嵌入式ICE,支持片上断点
      • ARM9
        • 5级Pipeline,指令效率高
        • 1.1MIPS 哈佛架构
        • ARM/Thumbs指令集
        • Cache
        • Windows CE/Linux/Palm OS
  • CISC(复杂指令集) 2:8
    • 为了支持新的指令,计算机架构会越发复杂
  • RISC (Reduced Instrution Set Computer)
    • 采用固定长度的指令格式
    • 指令格式与寻址方式尽量少
    • 以控制逻辑为主
    • 大量用寄存器
    • 使用单周期指令
    • 只有载入和存储指令可以访问存储
  • ARM (Advanced RISC Machine)
    • 流水线结构: 把一个重复的过程分解为若干个子过程,子过程可并行
      • 基本Flow: fetc取指令h-dec译码-reg取操作数-exe执行操作-mem存数据-res存数据
      • ARM7 三级流水线: 取指令 - 译码(Thumbs解压缩-ARM译码) - 执行
        • 一条指令用三个周期,但是吞吐量每个周期一条指令
      • ARM9五级
      • More流水线级数,每一级边简单,提升主频;
      • 但是会增加系统延时,也会使段间数据相关
    • 处理器模式:
      • 工作模式由当前程序 状态寄存器 CPSR的低5位[4:0]所决定
        • HOW 2:
          1. 发生异常,处理器自动改CPSR进对应模式
          2. 处于特权模式时,用指令相CPSR写
          3. (用户模式不是发生异常不能改变)
      • 7种
        • 用户模式:
          • 除此之外都是非用户(特权模式,其中除了系统之外的5叫做异常模式)
        • 系统模式(sys) 11111 类似用户,只是可以切换
          • 与用户模式都不能通过中断进入
          • 与用户模式公用寄存器
        • 快速中断(FIQ) 异常响应时进入此模式,支持高速数据传输
        • 外部中断(IRQ)
        • 管理(SVC) OS保护,系统复位和软件中断进入
        • 中止(ABT)
        • 未定义(UND)
    • 异常中断:(总在ARM状态下)
      • 工作流程
        • 返回地址写入R14
        • 将CPSR复制到SPSR
        • 设定CPSR
      • 异常中断:(7种异常 5种异常模式)
        • 复位;未定义指令;软件中断;指令预取中止;数据访问中止;外部中断请求; 快速中断请求
    • 状态:ARM7有ARM状态(32)与Thumb状态(16位),改变状态不影响寄存器内容或是处理器模式,用BX切换状态
      • Thumbs指令(ARM的子集)
        • 提高性能,减少功耗;
        • 可与ARM互相调用,互相转换用EX指令
    • 存储系统:
      • 处理器核 与 外部存储器 之间有管理让总线信号是必须与外部总线时序对齐
      • 存储空间:
        • 2^32个8位, 单元地址用32位无符号数
        • 2^30个字(32)
        • 半字同理
        • (大小端)
          • 小端: 高字节高地址
          • 大端: 反之
    • 指令:
      • 支持单字节(Byte 8位)半字(16 2字节对齐) 字(32 需要4字节对齐)

ARM Programming

  • ARM编程模型:
    • 取指令: CPU从控制总线(CB)上发读指令,从地址总线(AB)上给地址,通过数据总线(DB)把地址送到CPU指令寄存器中
    • 指令译码
    • 执行
  • 37个寄存器 32 位
    • 31个通用 6个状态(1个PC(Program Counter) 1个CPSR(当前程序状态寄存器 Current Program State Reg) 5个SPSR(Saved Program State Reg))
    • 每种模式下有一组对应的寄存器组,最多18个活动的寄存器
    • SPSR (在普通和系统模式下看不到,只有进入异常时候用)
    • R0~R13 汇编语言中存数据的通用寄存器
      • R0-R7 为未分组,对于任何处理器模式,都对应着相同的物理寄存器
      • R8-R14 为分组,所对应的物理寄存器决定于工作模式
        • R8-R12 两个分组 FIQ
        • R13 R14 6个分组,一组用于系统/用户,另外5组给5个中断
          • R13 (Stack Pointer - SP堆栈指针) Thumbs集中有使用R13的指令
          • R14 (LR) 连接寄存器
            • 每种模式下,模式自身的R14用于存储子程序返回地址
              • Usage: A程序使用中,采用“BL B”,跳转到B程序(BL的下一条指令地址放入LR),在B程序的最后写”MOV PC,LR”返回程序A
            • 发生异常时,R14对应的异常模式设置为异常返回地址
              • 类似上面,有一个小偏移
        • R15 (程序计数器)
          • 指向程序正在取指的地点(当前正在执行的指令+8字节-2条ARM指令【一条执行,一条译码 0x4000-0x4008】),虽然是通用寄存器但是使用起来有很多限制(因为ARM指令是字,所以低两位总为0)
        • CPSR (程序状态寄存器)
          • 与SPSR (保存程序状态寄存器对应)
  • ARM指令格式:
    • {指令助记符 ADD} *{执行条件} *{是否影响CPSR值} {目标寄存器},{第一个操作数} *{第二个操作数}
    • (带星号的可以省略)
    • 第二个操作数
      • /# immed_8r 常数表达 (一个8位常数向右循环移动偶数位)
      • Rm 寄存器表达
      • Rm,Shift 寄存器移位表达
        • 移位不消耗额外时间
          • ASR算数右移 (符号位填充)
          • LSR逻辑左移 (填充0)
          • ROR循环右移 (纯循环)
    • 指令会被编成32位指令
  • ARM寻址
    • 立即数
      • “#0x55”
      • ? 最后8位移动偶数位得到立即数
        • 合法立即数:(有效数据在8位里面,而且可以从最后移位偶数位得到)
    • 寄存器
    • 寄存器移位
      • 寄存器带一个移位 MOV R0,R1, LSL R3 (逻辑左移R3位)
    • 寄存器间接
      • LDR R0,[R1] 寄存器R1中的值才是操作数的物理地址
    • 基址变址
      • LDR R0, [R1, #5]
    • 相对
      • 将程序计数器PC作为基址寄存器,指令中的标记记作地址偏移
      • :question: : 相对寻址以及基址变址的区别
    • 多寄存器
      • 一组传送: LDMIA R0,{R1-R5} ;R1 = [R0],R2=[R0+4],R3=[R0+8] 地址自增
      • 不连续的地址用 {R1,R3,R6}
    • 块拷贝
      • 上面的连续形式
    • 堆栈
      • 堆栈与寄存器组之间的批量传输
      • STMFD R13!,{R0,R1,R2,R3} ;R13为堆栈指针。R0-R3压入堆栈
  • ARM指令集
    • 基本数据处理
      • MOV
      • ADD / SUB
        • ADC ; RSB 反向减法; SBC 带借位减法
        • SUBGT R3, R1, #2 // 如果上一步结果 >0 那么R3=R2-R1
      • MUL 乘法 MLA 乘加
      • AND/ORR/EOR
      • CMP (不存储结果,但是改变CPSR中的值)
      • TEQ 测试相等
    • 存储器访问 ( Load 内存 - 存储器 Store反之)
      • 粗略分为三类: 单一数据传送(LDR/STR) 多数据传送指令(LDM/STM) 数据交换(SWP/SWPB)
      • LDR 字数据加载 LDR Rd, [Rn] (相对寻址的最后加!表示将新地址写入Rn) ;把内存中地址为Rn的数据装入Rd
        • Rm, LSL #5 -> Rm*32
        • LDR还有一些变体:
          • LDRB 加字节数据 LDRH
          • LDRBT 用户模式加载数据
          • LDRSB 有符号数字节读取
      • STR 与LDR对偶
        • Save Reg STR R0,[R1],#8
      • LDM 批量数据加载 LDM {Type} Rn{!}, Regs {^} (当regs不包含PC时,用于表示指示为用户模式下的寄存器,否则要将SPSR复制到CPSR) ;
        • 将一片连续的内存单元数据读取到各寄存器,内存单元起始地址为Rn
        • Type字段:
          • IA/IB 传送后/前地址加1 increase before/after
          • DA/DB 传送后/前地址减1
          • FD/EA 满递减堆栈
            • Decreasing 降序-在内存中反向增长
            • Ascending
            • Full 指向上次写的最后一个单元
            • Empty 指向第一个空的
          • ED/EA 空递减堆栈
      • 数据块操作 堆栈操作 (类似)
        • STMDA(存储) STMED(压栈) 空递减
        • STMIA STMEA 空递增
        • STMDB STMFD 满递减
        • STMIB STMFA 满递增
        • 解题时; F-A D-I
      • SWP 字数据交换 SWP R0,R1,[R2] R2中的数据存到R0,R1的数据存到R2
    • 跳转 : 实现跳转可以通过跳转指令(空间受限),也可以直接向PC写入目标地址
      • B addr (等价于 PC + addr左移两位(由于ADDR的值是相对于当前PC的一个偏移量,是24位有符号,拓展为32位之后要左移两位))
      • BL 带返回的跳转 (在B的基础上将PC(R15)中的值赋值给LR(R14)) 常用于实现子程序调用
    • 状态寄存器指令 (状态reg与通用reg之间传递数据)
      • MRS: MRS R0, CPSR 将CPSR的值存储到R0(Move State Reg)
      • MSR: MSR CPSR_f, R0
    • 异常中断指令
      • SWI 软件中断 SWI 0x05 (调用编号为5的) 指令后24位立即数用语产生中断,若无,默认R0
  • ARM伪指令:
    • 小范围数据读取: ADR R0, Delay(Delay是一个汇编程序端)
      • 用一条指令实现
    • 中范围地址读取: ADRL
      • 用两条指令实现
    • 大范围地址读取: LDR
    • 空操作 NOP
  • ARM伪操作
    • DCD DCDU 分配一段字对其的内存单元
    • AREA 定义一个代码/数据段
    • CODE16/CODE32 告知指令序列位数
    • ENTRY 程序入口
    • ALIGN 对其
    • EXPORT/GLOBAL 声明符号可以被其他文件引用
    • IMPORT/EXTERN 表示符号是引用来的
    • EQU 对数字常量,基于寄存器的值和程序中的标号定义符号名称

Embedded System OS

  • 操作系统:
    • 控制和管理计算机系统的软硬件资源
    • 组织多通道程序运行
    • 用户与计算机之间接口
    • Exm: UNIX,DOS,Linux,Windows98,Windows NT
  • 多道程序技术,在内存中存放互相独立程序,在管理下互相穿插运行(微观上穿行,宏观上并行)
    • 减少作业之间的交接
    • 用户响应时间长
  • 分时OS: 一台计算机连接多个中断的计算机系统
    • 把处理及的响应时间分为多个时间片,每个中断获得CPU相当于获得一个时间片
  • 内核:
    • 职能
      • 负责为每个任务 分配CPU时间
      • 负责任务间的通信
      • 负责任务切换工作
      • 负责任务调度(基于优先级)
    • 非抢占式内核 Non-Preemptive
      • 要求每个任务放弃CPU所有权
      • 利用中断使高优先级任务从挂起变为就绪,但中断之后还会返回,直至任务主动放弃CPU使用权
      • 更高优先级的任务不能打断正在执行的低优先级任务
    • 抢占式内核 Preemptive
      • 最高优先级任务一旦就绪,就可以得到CPU控制权
      • 高优先级任务可以打断下一级,被抢占的任务进入就绪任务队列,等待下一次调度
      • 实时内核一般都是抢占式
  • 单模块操作系统 - 单内核操作系统
    • 进程,内存,设备,文件管理 - 内核与各服务器之间进行通信,效率低
    • 复杂的程序调用使系统难以维护 - 各模块相对独立
  • 进程 (在内存中的几个相互独立的程序,它们在内存中需要中断交叉运行,且共享资源)
    • 是程序在并发环境之中的执行过程
    • :question: : 进程和程序的区别?
      • 进程动态,程序静态
      • 并发性,程序的并发执行借助进程实现
      • 独立性:进程是一个独立运行的单位,是运行调度的基本单位
      • 进程与程序没有一一对应关系
      • 进程异步潜行
      • 进程实体有一定的结构
    • 描述:
      • 进程控制块(PCB Process Control Block)
        • 伴随进程的全过程,进程管理和控制的数据结构
      • 进程的执行程序
      • 进程处于某个队列(就绪,等待时间队列)
      • 处于某种状态
        • 创建 fork()
          • 有两个返回: 子进程返回 0 (-1如果失败) 父进程返回子进程ID
        • 执行 execve()
        • 消亡
          • 主动中止: 调用exit(),或是进程从某个程序的主函数返回
          • 被动: 接收到异常,接受到中止信号
          • linux并不在进程中止时释放所有资源
            • 首先,调用do_exit()释放与进程相关的大部分资源,让其进入ZOMBIE
            • 然后: 若子进程先于父进程中止,将一直ZOMBIE,直至父进程调用Wait()[能获取子进程的中止消息,消除子进程共享资源],释放所有资源; 如果父进程已经中止,则新寻找一个 Init()
      • 占用资源(内存,文件,外设)
    • 进程同步 (避免并发竞争)
      • 进程间联系 相交/无关
      • 进程间作用:直接(只在相关) 简介(均可能)
      • 进程同步(Synchronism)
        • 运行都某一处需要另一进程为其提供信息,没有获得消息之前,处于等待,之后处于就绪
      • 进程互斥
        • 抢占资源: 临界资源和互斥
        • 处于互斥区域的原则:
          • 空让进, 忙等待, 有限等待, 让权等待 (硬件:屏蔽中断 软件:忙等待)
    • 进程调度
      • Linux基于分时(Time-Sharing)
        • 时间片轮转调度: 当多任务具有相同优先级
        • 基于优先级调度
      • :question: : 实时内核存在 - 优先级反转: 高优先级任务在申请已经被低优先级内核抢占的资源时被迫进入等待,导致其不能执行。 solu:优先级继承
    • 信号量: 控制共享资源的使用权,通常是一个递减的技数(可为二进制也可以是多进制)
  • 任务
    • 一个任务可以称为一个进程
    • 任务有自己的一套CPU寄存器和栈空间,每个典型任务都是一个无限循环
    • 每个任务都有确定状态
      • 同一时刻只有一个任务占有CPU,其为就绪的任务中优先级最高的
      • 休眠; 就绪; 运行; 挂起; 被中断
  • 中断处理:是一种硬件机制
    • 一旦被识别,CPU将保存Reg的值,调到中断服务子程序ISR进行处理,之后
      • 非抢占: 回到原来的任务
      • 抢占: 进入就绪态中优先度最高的任务

Linux Commands

  • cat 显示文件内容 more/less分屏幕显示文件内 head/tail显示文件若干行
  • touch创建一个空文件
  • find {directory} (Name)
  • grep 给出模式匹配:
    • -v 列出不匹配串/正则表达式行
    • -c 对匹配计数
    • -l 只显示匹配的文件名
    • -i 不区分大小写的匹配
  • sort 逐行对文件内容排序
  • comm比较文件内容: 产生两个文件中都存在的
  • diff 列出不一样的
  • cp/rm/mv
    • -f 覆盖存在的,无提示
    • -i 覆盖给提示
  • wc 统计
  • 目录
    • /bin 存放各种命令程序 比如ls cp sh等
    • /boot 存放系统核心文件和系统启动必须读取的文件
    • /dev 接口设备文件目录
    • /etc 存放系统管理和配置的文件 比如passwd
    • /home 主目录
    • /lib 用来存放系统动态链接共享库
    • /mnt 各项设备的文件挂载点
    • /Proc 目前系统内核与程序执行的信息 ps free
    • /root
    • /tmp
    • /usr bin/ src/ include/
    • 目录操作: cd mkdir pwd
  • 链接: 对于新的文件名,可以指定不同权限,保证安全;
    • Hard Link: 文件的节点将被多个目录文件使用 ln (Source) {Target}
      • 会增加链接数
      • 删除源文件,文件不会消失,知识链接数-1
    • 软链接,将路径名链接 ln -s
  • 改权限: chmod umask chrgp chown
  • 联机指令:
    • ps 查看系统运行的进程信息
      • -a 当前终端的进程信息
      • -e 所有进程
      • -l 长格式显示
    • top 监控系统资源
    • kill 中止进程
    • sleep 暂停

BootLoader

  • 嵌入式Linux层次结构:
    • 引导加载程序(Boot,BootLoader)
    • Linux内核
    • 文件系统
    • 用户程序
  • 概念:
    • OS内运行之前运行的一段小程序
    • 初始化硬件设备,建立内存空间映射
    • 将系统的硬件环境带到合适状态,准备调用内核
    • 依赖于硬件,难以通用
  • 存储方式:(嵌入式系统无BIOS,系统上电复位之后从0x00000000开始执行,需要将静态存储ROM,以及BootLoader映射到上述地址)
  • 在执行Bootloader的时候,通常系统还不可用,一般与Host(主机)相连
  • 2 Stage:
    • Stage1 简单,依赖硬件,用汇编
      • 硬件设备初始化
      • 为Stage2准备RAM空间
      • 拷贝Stage2到RAM中
      • 设置堆栈
      • 跳转到Stage2程序入口
    • Satge2: 复杂,用C
      • 初始化Satge2需要的设备
      • 检测系统内存映射 (Memory Map)
      • 将Kernel映象和跟文件系统从Flash读取到RAM
      • 为内核启动设置参数
      • 调用内核
  • 操作模式:
    • 启动模式 Boot Loading,或是自动模式
      • 系统上电,CPU从BootLoader处开始运行
      • BootLoader运行,将代码复制到RAM中,转到RAM上运行
      • BootLoader准备好内核运行所需要的环境,运行内核
    • 下载模式
      • 系统上电,CPU从BootLoader处开始运行
      • 用户干预,进入下载模式 *从控制台输入信息
  • 文件传输:
    • 串口(xyz-modem)/以太网/USB
  • Bootstrap:
    • 在开发板上将Bootstrap PIn 打开
    • BootLoader在Bootstrap模式下被加载到Flash上
    • 允许开发者通过UART对设备初始化,允许通过UART将程序下载到系统RAM,可以接受命令,运行程序,支持内存
    • 流程: 上电后,Bootstrap模式将UART1,2设置为自动波特率,同时设置为8bit,无校验,1停止位.等待用户输入a/A,通过Bootstrap Record语句将CPU芯片内部寄存器初始化为目标寄存器.

Makefile

  • 由于项目文件之中互相引用,修改一个文件会导致多个文件重新编译,避免重复键入GCC进行编译,因而Makefile中要说明文件之间的依赖关系
    • gcc -o exc_file file.c 指定文件名
    • gcc -c filename.c 产生filename.o
    • gcc filename.c
    • gcc -o exc_file *.o 产生名为exc_file的文件且建立连接
  • gcc flag
    • -g 生成调试信息
    • -c 只编译不连接成为可执行文件
    • -o 确定输出文件名称
    • -O 优化
    • -w 禁止警告
    • -W 打开所有类型警告

myprog: foo.o bar.o (表示依赖关系,只要myprog比后面的文件旧,就要执行重建) ` gcc -o myprog foo.o bar.os`

  • 定义规则:

OBJS = foo.o bar.o $(CC) = gcc $(CFLAGS) = -Wall -O -g

之后用 $(OBJS) 之类的替代

  • 自动变量:
    • $@ 目标的完整名称
    • $^ 所有的依赖文件,空格分隔,不包含重复
    • $< 第一个依赖文件
    • $? 所有依赖文件,比目标文件出现的晚
    • $* 不含扩展名的目标文件名
    • $+ 所有依赖文件,可能包含重复
  • 隐含规则:
    • GNU Make1发现依赖关系语句时自动按照内嵌规则处理
      • 对C程序: X.o 由 X.c

      $(CC) -c $(CPPFLAGS) $(CFLAGS)

      • 对C++ “N.o” 由 “N.cc/N.C”产生

      $(CXX) -c $(CPPFLAGS) $(CFLAGS)

    • 重建/取消隐含规则

    %.o : %.c ` $(CC) $(CFLAGS) –D__DEBUG__ $< -o $@ //下一行为空则为取消规则`

  • 伪目标: all:exc1 exc2
    • make把all来作为主要目的,虽然all不是实际文件
    • 可以用于产生非预设的动作
      • EXM 若没有其他规则依赖于clean,其不会被执行,但是当执行make clean的时候被执行
          clean:
         rm *.o
         rm myprog
        
    • make clean 清楚编译过程中中间文件
    • make dep 设置Makefile中目录所依赖的文件列表
    • make install 将编译好的可执行文件复制到指定目录

Qemu Experiment

  • Procedure:
    • Qemu安装
    • 编译并运行U-boot(用的是Xilinx的Toolchain)
    • 编译并运行Linux
      • 编译BusyBox
      • 制作根文件目录
      • 根文件系统镜像
    • 在目标机中运行应用程序
      • 在Linux上安装NFS网络文件系统
      • 在宿主机中开启NFS服务
    • 6Steps
      • LInux交叉编译环境搭建
      • Uboot原理编译
      • 设备数原理编译
      • 内核原理编译
      • 根文件系统的编译
      • Uboot以及内核的椅子

Examples 2 Memorize

  1. ARM体系架构(?)
    • 硬件: 处理器,存储器,模拟电路与电源,接口
    • 软件: BSP,驱动,OS,PS,应用程序
    • 冯诺依曼架构,哈佛架构
    • 流水线结构
  2. Qemu实验概述
  3. 注释程序阅读?
  4. 思考进程同步 (?)
    • 基于时间片轮转调度
    • 基于优先级的调度
  5. ARM内核是否一定是MPU,请举例说明。
    • 除了MPU,还有MCU(微控制器)比如STM32
    • DSP
    • SOC
  6. ARM V5和V7指什么?
    • ARM V5架构:
      • 3级流水线
      • Thumbs指令集
      • 支持ICE片上断电调试Debug
    • ARM V7架构:
      • 5级流水线
      • 嵌入式实时OS支持
      • 高精度乘法DSP
      • ARM/Thumbs指令集
      • Cache
  7. ARM的特权和异常模式
    • 除了用户模式之外,都属于特权模式
    • 有几种异常模式由异常产生: IRQ,FIQ
    • 各种工作模式由当前 程序状态寄存器 CPSR的低5位决定
    • 除了用户模式不能改变工作模式,其他有两种: 1. 发生异常,处理器自动改变CPSR,处理器处于特权模式也可以通过指令往CPSR写入
  8. ARM有几种类型的中断,对应几种异常模式
    • 7种中断 5种异常模式
    • 复位,未定义指令,软件,指令读取中止,数据访问中止,外部中断请求,快速中断请求
  9. ADR和LDR两种伪指令
    • LDR用于大范围地址读取,用于加载一个32位立即数,或者是一个地址到对应的寄存器,与ARM的LDR相比,参数带有”=”
    • ADR用于小范围,一般被编译器替换成一条合适的指令,若不能用一条指令实现,就产生错误
  10. 嵌入式调试方法
    • 模拟调试
    • ROM Monitor(Angel)
    • 在线仿真ICE
    • JTAG
  11. 什么是临界段
    • 临界资源: 系统中某些资源只允许一个进程使用
    • 临界段只能用于一个进程中不同线程的通信
    • 涉及到临界资源的程序段叫临界区(访问公用资源的那段程序)
  12. thumbs指令集优点
    • 指令长度固定
    • 执行效率高
    • 单字节指令
    • 大量使用寄存器
  13. 画地址内存的题目:
    • LDMIA R1!, {R2-R4,R6}
      • 由于有”!” R1 = R1+4*4
      • R2,R3,R4,R6 分别是地址为R1+4,R1+8.地方的数据
    • LDR RD <- [RI] // reg到reg
    • LDMIA R1! -> {R2,R3} // reg到存储器
    • LDMIA == LDMFD ( Full - After) (Descending - Increase) (?6)

Qs To Memorize

  • ARM7TDMI - ARM V4T架构(?)
  • $(CC) $(CFLAGS) -c foo.c -o foo.o $(OBJS)
  • $(CC) $(CFLAGS) -c $< -o $@ $^
  • (开发流程): 任务分析 - 处理器/OS选型 - 硬件设计 - 驱动与BSP设计 - 操作系统移植 - 应用程序设计 - 代码固化
  • 7x工作模式: USR,FIQ,IRQ(填)
  • 硬件部分: 嵌入式处理器,存储器,接口,模拟电路与电源; 软件: BSP,驱动,OS,PS,应用程序
  • 嵌入式微处理器(MPU) 有ARM,X86,PowerPC,MIPS,SPARC
  • 应用为中心 计算机技术为基础,软硬件可裁剪,对可靠性,成本,体积,功耗有严格要求专用计算机系统
  • 嵌入式系统开发过程: 任务分析,处理器-OS选型-硬件设计-驱动BSP设计-OS移植-代码固化
  • 嵌入式处理器包括? MPU MCU DSP Soc
  • 占先式内核: 1. 不要求任务主动放弃CPU所有权 2. 更高优先级任务可以打断
  • 交叉编译: 先在宿主机上完成编译,再下载到目标机 嵌入式系统存储有限
  • 哈佛与冯诺依曼架构: 指令和数据是否采用一样的数据位宽,程序与指令是否使用同一存储空间,是否可以同时读写数据
  • 进程与程序的区别: 1. 进程动态概念,程序静态 2 进程是独立运行的基本单元,程序无此意义 3. 进程和程序没有一一对应 4. 进程可以并行,异步前进,互相制约
  • 优先级翻转: 高优先级任务在申请低优先级任务的资源的时候一直等待,如果有一个中优先级,将一直执行
  • Bootstrap的原理: 将Bootloader加载到Flash中 设置串口UART12 将Bootstrap Pin打开 (不可以引导操作系统)
  • Bootloader支持的文件传输接口 : 串口(xyz-modem) 以太网 USB
    • 两种模式: 启动和下载
  • 寻址方式判断
  • 采用的Arm伪指令 : Ldr 带=
  • PC(R15) 程序计数器 LR(R14) 保存返回地址 SP(R13) 堆栈指针 [R13,15各6个]
  • VIM三种工作模式: 指令,文本输入,行末
  • 判断合法立即数:8bit 移动偶数位
  • Thumbs(见上)
  • linux设备驱动添加到内核
  • 伪指令: EQU: 一个数值或寄存器名赋给一个指定的符号名 DCD:分配一片连续的存储空间
  • CISC 20% 80%
  • Cortex ARM, 单片机是M

  • Bootstrap题目:
    • 00000000408 E3Axx E1A0xxx 0000000400
    • mov Pc r4 ;跳转到镜像
  • 汇编程序题目
    • ENTRY的部分开始
    • LDR PC,SWI (0008/4)
    • 0x1122
    • 0xA000
    • rtmp 0x1
    • 0x004