1.1区分微处理器与微控制器
微控制器与微处理器的区别
嵌入式系统的处理器多是微控制器,微控制器的芯片内除了CPU外还集成有部分内存(片内内存)与外设(片内外设),因此微控制器与微处理器的区别在于:
是否存在片内内存与片内外设
注:片内、片外,这两个词语的主体在于芯片,以芯片的角度去看待,集成在芯片内部了,就是片内XX,否则片外XX
使用微控制器的好处:
1、 节约成本、节省功耗(在实现相同功能时,在片内继承更多的芯片将会获得更低的制造、使用、功耗开销)
2、 简化硬件设计
从编程的角度来说,微控制器与微处理器没有区别,书中统称为处理器
1.2寄存器
概念:
寄存器是处理器(CPU)中运行程序和加工数据的高速存储部件,寄存器内的值的变化决定了处理器的行为
处理器中主要寄存器分类:
1、 通用寄存器(GeneralPurpose Register, GPR) 执行指令、进行整形数据和逻辑运算 (所有处理器都含有通用寄存器)
2、 浮点寄存器(FloatingPiont Register, FPR) 运算具有小数点的数据,实现高效浮点运算 (具有浮点运算单元的处理器)
通用寄存器中的重要寄存器:
1、 程序计数器(ProgramCounter, PC), 也叫指令指针(Instruction Pointer, IP) 告诉处理器下一条需要执行的指令在地址空间的位置(地址空间不单指内存空间,还可以是闪存等)
2、 栈指针寄存器(StackPointer, SP), 也叫ESP(Extended Stack Pointer)
3、 其他寄存器 处理变量,参数传递
通过配置微控制器片内外设中寄存器可以控制外设行为、工作方式
1.3处理器是如何启动的
1. 处理器在出厂时,寄存器中固化有默认值,这些值影响了处理器在上电时刻的行为
2. 程序计数器的默认值决定了处理器上电时刻需要执行的指令在地址空间的位置。
3. 处理器在准备读取第一条指令时会发出指令对应地址空间的选信号,使能存储指令的存储器件
4. 一般来说,处理器所取得的第一条指令时引导加载器程序的一部分
1.4输入与输出
概念:
输入与输出(Input/Output, I/O):处理器与外设的通信被成为输入与输出
外设:
1. 全称为外部设备,外设可以集成在微控制器芯片内(片内外设),也可以是挂在处理器总线上的外部芯片(片外外设)
2. 外设寄存器被称为I/O端口(I/O port)
3. 每个外设在处理器的地址空间中占用不同的I/O端口
4. 处理器通过不同的I/O端口实现与对应外设的通信与中断
5. I/O端口所在的空间被称为I/O空间,I/O端口占用处理器的I/O空间
6. 根据处理器的架构的不同, I/O端口存在两种编址方式:
1).统一编址:
a) 统一编址也叫”内存映射I/O空间”,在这种编址方式中,I/O端口(外设寄存器地址)占用内存的部分地址空间,即I/O空间与内存在同一地址空间中
b) 从编程的角度来说,我们可以像访问内存那样访问I/O端口,也就是说对I/O端口的访问可以直接使用指针的形式完成
2).独立编址
a) 独立编址也叫”单独编址”,在这种编址方式中,I/O端口不占用内存空间,I/O空间独立于内存所在空间
b) 从编程的角度来说,访问I/O必须通过调用相应封装了I/O端口操作指令的函数,不能直接访问
7. 不同类型外所设占用I/O空间大小不同
8. 外设的配置寄存器值的不同,使外设的行为也不同
1.5指令与数据
指令是告诉处理器”干什么”的特殊数据
1.6中断
处理器关心”外部世界”的方式:
1. 应用程序以轮询方式不断读取外设配置寄存器以查询外设是否有事务需要处理
2. 当处理器得知外设有事务需要处理时,暂停正在运行的指令流,立即切换到中断模式并运行中断处理程序以处理事务
开启中断:
1. 在外设工作前初始化好处理器的中断控制器(使用控制器设置中断触发类型、开关中断)
2. 安装好对应的中断服务程序(Interrupt Service Routine, ISR)
实现中断服务程序:
1. 保护被中断的进程现场,将相关寄存器的值压入栈中保存
2. 读取外设中断状态寄存器以了解中断原因
3. 根据中断原因进行中断处理
4. 清中断:
1) 向外设寄存器写值通知外设中断事件已经被处理
2) 清除处理器的中断信号标识
5. 恢复现场,将栈中之前保存的值恢复到寄存器
中断触发方式:
1. 电平触发:
通过电平高低表示外设是否发出了中断信号
2. 边沿触发
1) 上升沿触发:中断线从低电平变为高电平
2) 下降沿触发:中断线从高电平转换为低电平
中断的栈来源:
1. 当前运行进程的栈,发生中断时使用当前进程的栈
2. 为中断状态提供的特定栈,发生中断时切换到特定栈
中断类型:
1. 硬中断:外设需要使用处理器的中断信号线
2. 软中断,也被成为陷阱(trap):与硬件毫无关系,通过执行处理器的指令触发
中断优先级:
1. 多个中断同时出现时,高优先级的中断将优先被处理
2. 当一个低优先级的中断正在被处理,低优先级的中断可再次被优先级高的中断打断,即中断嵌套
1.7字节序
内存以字节为单位进行寻址
数据类型大于1字节时,其所占用字节在内存中的顺序可分为:
1. 小端模式(little endian):地位字节放在低地址
2. 大端模式(big endian):高位字节放在低地址
由于存在大小端,为了良好的移植性,在传递指针时应该严格按照所需指针类型传递
1.8边界对齐(boundaryalignment)
1. 处理器为了提高处理器性能而对存取数据的起始地址所提出的要求
2. C/C++中结构体、联合体对齐也是边界对齐的表现
3. 默认情况下,编译器采用边界对齐的处理方法来提高程序的执行效率,但在进行网络通信时,可通过在结构之前加上”#pragma pack(1)”来避免编译器进行对齐处理,以避免传送对于字节占用
1.9程序断点与数据断点
断点
断点是一个信号,它通知调试器,在某个特定点上暂时将程序执行挂起,通过断点可以方便地对程序进行调试
断点分类:
1. 程序断点:处理器的指令断点,其可被再分为:
1) 软件程序断点:需要被调试的对象位于内存中
2) 硬件程序断点:通过配置处理器的断点寄存器实现,运行到断点寄存器所指示位置的指令时产生中断,硬件程序断点最多可能存在4个
2. 数据的断点:需要在寄存器中设置所监视数据变量的内存地址,通过数据断点与查看函数调用栈可以找到数据变量被更改的原因
1.10内存管理单元(MemoryManagement Unit, MMU)
通过MMU,可以实现:
1. 虚拟内存
2. 内存保护,通过内存保护可将特定内存块设置为读、写、可执行属性
进程中的.tetx段与.rdata段就是通过内存管理单元实现的只读与可执行保护
一个特性
1. 内存管理单元对所有与内存保护相关的操作都是以页的大小进行的(linux kernel默认页大小为4KB),这导致,在设置内存卡的读写属性时,内存块的开始地址必须是页的整数倍(开始地址必须以页大小作为边界对齐)
2. 需要通过连接脚本以保证.text段、.data段其实地址为页对齐的
1.11缓存(cache)
概念:
缓存是可以进行高速数据交换存储部件
缓存的意义:
1. 由于处理器的速度远远高于内存,如果处理器直接从内存读取指令与数据,将大大降低处理器性能
2. 使用缓存提高处理器读取外部内存的瓶颈,处理器先去缓存中查找指令与数据,命中了直接拿去使用,否则从外部内存读取以突发方式(burst mode)读取一行到缓存
注意事项:
当对闪存进行编程(烧写)时一定要禁用缓存功能,否则写入的命令序列将会存在缓存中导致不能正常的进行闪存编程