【嵌入式系统原理与实践】课程笔记+期末复习

第一章

嵌入式系统基本概念
  • 嵌入式系统是一种专用的计算机系统,它通常被包含在一些机械或电子系统中;

  • 嵌入式系统还是一种计算性能受限制的实时系统,它经常作为某一部件嵌入到一个完整设备中。

  • 嵌入式系统是硬件和软件的集合体,其硬件包括嵌入式处理器、控制器、数字信号处理器、存储器、外设接口器件等,其软件包括引导程序、嵌入式操作系统和应用程序等。

嵌入式系统的特点
  • 专用性
  • 实时性:对实时多任务有很好的支持,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核的执行时间减少到最低限度。
  • 可靠性:固件化,高质量,高可靠性的代码
  • 低功耗
  • 可裁剪
  • 多样性:性能、功能差异很大、覆盖面广
嵌入式处理器分类
  • 微处理器(MPU)

  • 微控制器(MCU)

  • 数字信号处理器(DSP)

  • 片上系统(SoC)

    SoC最大的特点是成功实现了软硬件无缝结合,它可以直接在处理器芯片内嵌入操作系统的代码模块。将整个嵌入式系统集成到一块芯片中去,这一做法使得系统电路板变得很简洁,对于减小系统的体积和功耗,提高系统的可靠性和设计生产效率非常有利。

嵌入式系统的调试方法
  1. 软件模拟器:软件模拟器是运行在宿主机上的纯软件工具,它通过模拟目标机的指令系统或目标机操作系统的系统调用,以此来达到在宿主机上运行并调试嵌入式应用程序的目的。

  2. ROM监控器:在该方式下嵌入式系统的调试环境由宿主机端的调试器、目标机端的监控器以及两者间的连接构成。

    image-20230919082935848
  3. ROM仿真器:一种用于替代目标机上的ROM 芯片的设备。对于宿主机上的调试器, ROM 仿真器上的ROM 芯片的地址可以实时映射到目标机ROM 的地址空间,从而仿真目标机的ROM。

    image-20230919083002865
  4. 在线仿真器

    是最直接的仿真调试方法。一种用于替代目标机上的CPU 来模拟目标机上CPU 行为的设备。它有自己的CPU、RAM 和ROM,可以执行目标机CPU 的指令,不再依赖目标机的处理器和内存。

  5. 片上调试

    内置于目标板CPU 芯片内的调试模块提供的一种调试功能,其中,JTAG是目前最主流的片上方式。

第二章

ARM处理器概述

RISC(精简指令集结构):RISC处理器简化了处理器结构、减少了复杂功能的指令,同时支持处理器扩展。

16/32位微处理器:此处的16/32位指的是CPU的字长

用于通用计算机

  • x86
  • amd

用于嵌入式系统

  • arm
  • mips
  • risc-v(完全开源)
Arm处理器的特点
  • 小体积、低功耗、低成本、高性能

  • 支持thumb(16bit)/arm(32bit)双指令集

  • 大量使用寄存器,指令执行速度更快

    sram和dram

    寄存器多:大量指令在处理器上(减少数据传输的开销(减少Load次数))

    处理器<-(冯诺依曼墙)->内存

    寄存器过多:性能下降,解析电路变得复杂

  • 大多数数据操作都在寄存器中完成,更多单周期指令,便于指令流水线执行

  • 寻址方式灵活简单,执行效率高

  • 指令长度固定

区分

  • 指令集架构(体系结构版本)
  • 处理器型号
Cortex-M处理器

嵌套向量中断控制器(NVIC)

每次最多可以处理32个中断请求和一个不可屏蔽中断(NMI)输入。NVIC比较正在执行中断和处于请求状态中断的优先级,然后自动执行高优先级中断。当需要处理一个中断时,NVIC会和处理器进行通信,通知处理器执行正确的中断处理。

Cortex-M4的异常类型

Cortex-M4 的异常类型包括系统异常和外设中断两种,其中编号 0~ 15是 16 种系统异常,编号 16~255 为 240 种外设中断。

Cortex-M4的异常优先级

处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。Cortex-M4 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持 128 级抢占。复位、NMI 和硬件故障这 3 个系统异常的优先级是固定的,并且是负数,它们的优先级高于所有其他异常。其他异常的优先级则都是可编程的,范围为 0~255。优先级的数值越小,优先级越高。更高优先级的异常可以抢占低优先级的异常实现异常/中断嵌套。

image-20240109003102978 image-20240109003219841 image-20240109003306615 image-20240107005352369
处理器状态

ARM Cortex-M4 处理器有2种操作状态

  • 调试状态:当处理器由于触发断点等原因被暂停后,进入调试状态并停止指令执行
  • Thumb状态:若处理器在执行程序代码(Thumb指令),则会处于此状态
处理器模式
  • 线程模式:用于执行应用程序软件
  • 处理模式:处理异常时处理器工作于处理模式,完成异常处理后返回线程模式
特权等级
  • 非特权级(用户级)

    1. 有限访问MSR和MRS指令,并且不能使用CPR指令
    2. 可以访问系统定时器,NVIC或者系统控制块
    3. 有对存储器或外设的限制访问
  • 特权级:非特权状态可以使用SVC(Supervisor Calls)指令产生一个系统调用把控制权转移到特权状态。只有特权状态可以在线程模式下通过写控制寄存器来改变状态执行的特权等级。

image-20230927210005421
寄存器

Cortex-M4主要寄存器包括R0~R12通用寄存器、R13堆栈指针寄存器、R14链接寄存器、R15程序计数寄存器、程序状态寄存器、中断屏蔽寄存器和控制寄存器。

image-20230927210318130
通用寄存器
  • 32位通用寄存器R0-R12

    R0-R7为低组寄存器(Low Register),所有访问通用寄存器的指令都可以访问;

    R8-R12为高组寄存器(High Register),所有32位通用寄存器指令都可以访问,但是所有的16位指令都不能访问

  • 堆栈指针寄存器R13

    用于访问堆栈。包括两个物理寄存器,分别是主堆栈指针(MSP)寄存器和进程堆栈指针(PSP)寄存器,系统可以同时支持这两个堆栈寄存器

    1. PSP(Process Stack Pointer)

      • PSP是用于线程或进程的栈指针。在多任务操作系统中,每个任务通常都有自己的栈,PSP指向当前任务的栈顶。当任务切换时,PSP会切换到新任务的栈。
      • PSP主要用于处理多任务操作系统中的任务切换。当发生任务切换时,系统会保存当前任务的PSP,然后加载新任务的PSP。
    2. MSP(Main Stack Pointer)

      • MSP是用于系统级别的栈指针。它通常用于存储异常处理、中断处理和初始化代码的栈帧。当处理器启动时,MSP会初始化为系统的主栈,它负责处理系统启动和异常处理。
      • MSP主要用于处理系统级别的操作,如异常处理、中断处理和系统初始化。当发生异常或中断时,系统会使用MSP来管理栈帧。

    这样即使用户程序错误导致堆栈崩溃,也可将其隔离在内核之外,不至于引起内核崩溃

  • 链接寄存器R14

    链接寄存器(LR)在执行分支(B)和链接(BL)指令或带有交换分支(BX)和链接指令(BLX)时,PC的返回地址自动保存进LR。例如,在子程序调用时用于保存子程序的返回地址。LR也用于异常返回,但是在这里保存的是返回后的状态,不是返回的地址,异常返回是通过硬件自动出栈弹出之前压入的PC完成的

  • 程序计数器R15

    指向当前程序执行指令的地址程序,可以直接对寄存器进行操作,从而改变程序流程。若用BL指令来进行跳转,会更新LR和PC寄存器。用MOV指令来操作PC实现跳转时,不更新LR。由于Cortex-M4内部采用指令流水线技术,所以读PC时返回值是当前指令的地址+4。

特殊功能寄存器
  • xPSR程序状态寄存器

    • APSR:应用状态寄存器
    • IPSR:中断状态寄存器
    • EPSR:执行状态寄存器
    image-20230927213631341 image-20230927235454659
  • 中断屏蔽寄存器

    image-20230927213758951
  • 控制寄存器

    image-20230927213825521

第三章

汇编语言的一般格式

image-20231015122436097

AREA:定义一个段,说明所定义段的相关属性,包括段的名字和段的属性

CODE:声明程序为ARM指令

ENTRY:标识程序的入口点

END:声明程序结束,每一个汇编程序段都必须有一条END指令,指示代码段的结束

READONLY/READWRITE

;:注释符号

段的分类

  • 代码段
  • 数据段

一个汇编程序至少有一个代码段,如果程序较长时,可以分割为多个代码段和数据段。多个段在程序编译链接时最终形成一个可执行的映像文件

伪指令

伪指令是用于对汇编过程进行控制的指令。这类指令并不是可执行指令,没有对应的机器代码,只用于汇编过程中为汇编程序提供汇编信息。伪指令在编译的时候并不生成代码,编译之后就不存在了。
END:汇编结束命令。伪指令可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。
总的来说,伪指令是给汇编器来解释的,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息,在汇编之后就消失了。

条件码

ARM指令的基本格式:<opcode>{<cond>}{S} <Rd>,<Rn>,{<Op2>}

{<cond>}表示一个可选的条件码

只有在CPSR中的条件码对应的标志满足指定条件时,带条件码的指令才被执行,否则指令被忽略

条件码位于ARM 指令的最高4 位[31:28]。条件码共有16 种,但是只有15 种可以使用,第16 种(1111)为系统保留暂不使用。

image-20231015123635930

image-20231015123641164

寻址方式
立即寻址

操作数紧跟在操作码后,与操作码一起放在指令代码段中。在程序运行时,程序直接调用该操作数,而不需要到其他地址单元中去取相应的操作数

十进制数以#为前缀,十六进制数在#后加0x/&

image-20231015124056018

寄存器寻址

操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,指令执行时直接取出寄存器值来操作

image-20231015124428886

助记符 结果寄存器,第一操作数寄存器,第二操作数寄存器

image-20231015124552323

寄存器移位寻址

操作数由寄存器相应移位而得到,移位的方式在指令中以助记符的形式给出,移位的位数用立即数或寄存器寻址方式表示

image-20231015124925404

寄存器间接寻址

寄存器是操作数的地址指针

用于间接寻址的寄存器必须用[]括起来

image-20231015125256204

image-20231015130735826

基址寻址

将基址寄存器的内容与地址偏移量相加得到操作数的有效地址

image-20231015130920142

image-20231015130924658

带自动变址的基址寻址

image-20231015131021397

R1的内容加上位移量4形成操作数的有效地址,从该地址取的操作数存入R0,然后将R1的内容自增4字节

!:指令在完成数据传输后应该更新基址寄存器。

ARM的自动变址不消耗额外时间

后变址寻址

基址不带偏移作为传送的地址,传送后自动变址

image-20231015131518752

将R1的内容作为操作数的有效地址,从该地址取得操作数存入寄存器R0中,然后将R1的内容自增4字节

寄存器变址

指令指定一个基址寄存器,再指定另一个寄存器(变址),其值作为位移与基址相加形成存储器地址。

image-20231015131645274

相对寻址

以PC的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加得到操作数的有效地址

image-20231015131813085

多寄存器寻址

允许一条指令传送 16 个寄存器的任何子集或所有寄存器

image-20231015131852820

该条指令的后缀IA 即表示在每次执行完加载/存储操作之后,R0 按字长度(即4 字节)增加。因此指令可以将连续多个存储单元的值传送到R1~R4 中。

image-20231015131939696

堆栈寻址
  • 向上生长:当堆栈由低地址向高地址生成时,称为递增堆栈(Ascending Stack)
  • 向下生长:当堆栈由高地址向低地址生成时,称为递减堆栈(Descending Stack)

image-20231015132242142

  • 满递增堆栈(Full Ascending Stack,FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成;
  • 满递减堆栈(Full Descending Stack,FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成;
  • 空递增堆栈(Empty Ascending Stack,EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成;
  • 空递减堆栈(Empty Descending Stack,ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
  • (1)STMFA(进栈),LDMFA(出栈);
    (2)STMFD(进栈),LDMFD(出栈);
    (3)STMEA(进栈),LDMEA(出栈);
    (4)STMED(进栈),LDMED(出栈)。

image-20231015133614915

每次执行完加载操作后,SP+=4

每次执行完存储操作后,SP-=4

ARM v7 架构指令集——Thumb-2指令集

Thumb-2指令集是一种兼容16 位和32 位指令的指令集,应用于ARM v7架构。

  • 在书写指令时不需要分析这条指令是32位指令还是 16 位指令,汇编器会自动按照最简化的原则汇编

    一般有立即数的语句会汇编成32 位代码。

  • 编译环境提供了一种方法,由编程人员指定是哪一种代码格式。如果在指令后面加后缀“.N”则指定是16位代码格式(Narrow),如果在指令后面加后缀“.W”则指定是32 位代码格式(Wide)。

    注意:“.W”只适用于原来是16 位代码的指令上,如果原来是32 位代码,那么使用“.W”就没有意义了;而“.N”不能把32 位代码变成16 位代码。

存储器访问指令

image-20231015134220053

寄存器组加载/存储指令LDM/STM

用于在寄存器和存储器之间进行成组的数据传输

格式:LDM/STM{条件} {类型} 基址寄存器 {!},寄存器列表

类型分为以下几种情况

IA 每次传送后地址加1; IB 每次传送前地址加1;
DA 每次传送后地址减1; DB 每次传送前地址减1;
FD 满递减堆栈; ED 空递减堆栈;
FA 满递增堆栈; EA 空递增堆栈

{!}为可选后缀。若选用该后缀。则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

image-20231015134945158

加载单个寄存器指令LDR/STR

用于在寄存器和存储器之间进行字、半字以及字节传送。

指令格式:LDR/STR{条件}{T},目标地址,<地址>

例如LDRB 用于把存储器中的8位数据字节加载到寄存器中,STRB 用于把寄存器中低字节存储到存储器中;LDRH 用于把存储器中的半字加载到寄存器中;STRH用于把寄存器中的低半字存储到存储器中

  • {T}是可选后缀:B、H、SB 和SH。H表示半字传送,B 表示字节传送,S 表示有符号操作,SB 表示带符号字节传送,SH 表示带符号半字传送。
  • SB和SH不可用于STR指令

image-20231015135547849

image-20231015135551945

使用PC 关联方法,加载单个寄存器指令LDR

image-20231015135834853

说明:Rd、Rd2 为目标寄存器,两者不同,Rd2 不可以是SP(Stack Pointer,堆栈指针)或PC。

无特权访问,加载/存储单个寄存器

无特权访问,加载/存储单个寄存器指令LDRT/STRT 和以上介绍的立即数偏移的加载/存储指令LDR/STR 只有一点不同,就是在指令助记符后加了一个T 后缀,其余完全相同,包括B、H、SB、SH 的使用方法,以及立即数偏移的前索引和后索引等。因此使用中可以完全按照立即数偏移的加载/存储指令的方法

指令格式:LDRT/STRT Rd,[Rb,#立即数]

T后缀的含义是:指令在特权模式下对存储器的访问,将被存储器看成是用户模式(无特权)的访问。这条指令在特权模式下不享有特权。

互斥访问指令LDREX/STREX

互斥访问总是成对出现,每个LDREX 语句后面总是跟随一个STREX 语句。互斥访问可以使用B 和H 后缀,即可以实现半字和字节访问,但不可以实现带符号数据的存储和加载,也就是不可以使用SH和SB。

指令格式:LDREX Rd,[Rb,#立即数]STREX Rt,Rd,[Rb,#立即数]

  • Rd 作为目标和源寄存器,不能是SP 和PC;
  • Rt 记录指令执行结果,既不能是Rd 和Rb,也不能是PC 或SP;

互斥清除指令CLREX

指令格式:CLREX

互斥清除指令用来清除由指令LDREX 标注的互斥状态,在执行这条指令以后,内核不再处于互斥状态,后面的指令STREX 不能正确执行,Rt 将返回1。

  1. sub指令:
    • sub指令用于执行减法操作,但它不会更新条件码寄存器的标志位。
    • 这意味着不会影响标志寄存器的值,即使执行减法后结果为零,零标志位(ZF)也不会被设置为1。
    • 通常用于不需要检查结果的情况,或者在另外的指令后手动设置条件码寄存器的标志位。
  2. subs指令:
    • subs指令也用于执行减法操作,但与sub不同,它会更新条件码寄存器的标志位。
    • 如果执行减法后的结果为零,subs指令将设置零标志位(ZF)为1,表示结果为零。
    • 如果结果为负数,它将设置负数标志位(NF)为1。
    • 如果发生借位,它将设置进位标志位(CF)为1。

subs通常用于需要检查结果并根据结果执行条件分支的情况,因为它会自动更新条件码寄存器,而sub用于无需条件检查的情况,或者在以后手动更新条件码寄存器的情况下使用。

入栈指令PUSH和出栈指令POP

以SP为基址的加载和存储指令

堆栈指针SP是隐含的地址指针,堆是满栈递减堆栈,堆栈向下增长,堆栈指针总是指向最后入栈的数据。

指令格式:

PUSH {寄存器列表}

POP {寄存器列表}

通用数据处理指令
image-20231020231934031
加法指令与减法指令

相加:ADDADC(进位加),ADDW(包含12位立即数的加法操作)

相减:SUBSBC(借位减),RSB(反减),SUBW(包含12位立即数的减法操作)

指令格式:

<op1>{S} Rd,Rn,<operand2>

<op2>{S} Rd,Rn,#立即数

image-20231020232608741
计算前导零个数指令CLZ

指令格式:CLZ Rd,Rs

image-20231020232754385
逻辑操作指令

AND:相与

ORR:相或

EOR:异或

BIC:对寄存器按位清零

ORN:非或(先对第2操作对象进行“非”操作,然后和第1操作对象进行“或”操作)

指令格式:OP{条件}{S} 目的寄存器,操作数1,操作数2

image-20231020233316862

移位操作指令

LSL:逻辑左移,寄存器中字的低端空出的有效位补0

LSR:逻辑右移,寄存器中字的高端空出的有效位补0

ASR:算数右移,在移位过程中必须保持操作数的符号位不变。若源操作数为负,则字的高端空出的有效位补1

ROR:循环右移,从字的最低端移出的有效位依次填入空出的字的高端有效位

RRX:扩展为1的循环右移,按操作数所指定的数量向右循环移位,空位(位[1])用原来C标志位填充

image-20231020235546322

指令格式:<op> Rd,{Rn},Rs/#n

比较操作指令

image-20231021000838591

数据传送指令

MOV:把第2操作对象内容传送到第1操作对象

MVN:把第2对象的“非”传送到第1对象

MOVW:把16位立即数放到寄存器的低16位,高16位清零

MOVT:把16位立即数放到寄存器的高16位,低16位不影响

指令格式:<OP>{条件}{S} 目的寄存器,源操作数

{S}是可选后缀,表示指令执行时是否更新CPSR。若指定S,将根据结果更新条件码标志N(negative)、Z(zero)和C(carry)到状态寄存器的条件标志位,标志V(overflow)不受影响。

image-20231021001517071
字节交换指令

用于在一个32位的字内实现字节交换,交换的结果使源字的大端和小端的格式发生变化。

REV:32位的字在大端和小端之间转换

REV16:16位的半字在大端和小端之间转换

REVSH:把16位的带符号半字转换成相反格式的32位带符号字

RBIT:位翻转

指令格式:REV/REV16/REVSH/RBIT 目标寄存器,源寄存器

字节交换指令举例,其中R5 中数据是0x0A0B0504

image-20231021002825321

测试指令

TST:按位“与”,不保存结果但会根据结果更新CPSR中条件标志位的值,操作数1是要检测的数据,操作数2是一个位掩码。该指令一般用来检测是否设置了特定的位

TEQ:按位“异或”,不保存结果但会根据结果更新CPSR中条件标志位的值,该指令通常用于比较两个操作数是否相等

指令格式:TST/TEQ{条件} 操作数1,操作数2

乘法和除法指令
乘法指令

image-20231021004137414

MUL:32位乘法运算

MLA:32位乘加运算

MLS:32位乘减运算

image-20231021004331923

image-20231021004336179

除法指令

UDIV:无符号除法运算

SDIV:带符号除法运算

指令格式:SDIV/UDIV Rd,Rm,Rs

这是2条32位运算指令,结果是一个32位数据存储在目标寄存器中。如果不能被整除,余数将丢失

长乘法指令

UMULL:64位无符号长乘法指令

UMLAL:64位无符号长乘加指令

SMULL:64位有符号长乘法指令

SMLAL:64位有符号长乘加指令

指令格式:op{条件}{S} 目标寄存器低字节,目标寄存器高字节,操作数1,操作数2

SMULL 指令将两个操作数解释为带符号的补码整数。该指令将这两个整数相乘,并把结果的低32 位放置到目的寄存器低字节中,结果的高32 位放置到目的寄存器高字节中

SMLAL 指令将两个操作数解释为带符号的补码整数。该指令将这两个整数相乘,并把乘积累加到目的寄存器中的64位带符号的补码整数上,得到结果的低32 位放置到目的寄存器低字节中,结果的高32 位放置到目的寄存器高字节中。

UMULL 指令将两个操作数解释为无符号整数。该指令将这两个整数相乘,并把结果的低32 位放置到目的寄存器低字节中,结果的高32 位放置到目的寄存器高字节中。

UMLAL 指令将两个操作数解释为无符号整数。该指令将这两个整数相乘,并把乘积累加到目的寄存器中的64 位无符号整数上,得到结果的低32 位放置到目的寄存器低字节中,结果的高32 位放置到目的寄存器高字节中。

image-20231021005445464

分支和控制指令
分支指令

image-20231021005613743

程序简单跳转使用分支指令B和BX,在需要保存跳转处地址时,使用分支链接指令BL和BLX。

指令格式:

B/BL Label

BX/BLX Rm

Label 是目标地址;Rm 是含有转移地址的寄存器。

分支指令B使得程序跳转到给定的目标地址;分支指令BX使得程序跳转到由Rm指定的地址处。

指令BL 和BLX 除引导程序跳转外,还把下一条语句的地址记录在链接寄存器LR 中,以便程序返回使用。

image-20231021005919577

比较分支指令

比较结果为0 的跳转使用指令CBZ,比较结果非0 的跳转使用指令CBNZ。

指令格式:CBZ/CBNZ Rn,Label

Rn是比较寄存器,只能是低位寄存器R0-R7

这两条指令不可以使用条件后缀,这些指令不会改变条件标志位,但是可以判断是否需要跳转

image-20231021010318712
条件分支指令

指令IT 必须和一个条件后缀组成一条语句,随后跟随的语句由条件是否成立决定是否执行。如果本条语句的条件成立,则执行随后被标注T 的语句;如果本条语句的条件不成立,则执行随后被标注E的语句。

每条IT 语句最多可以跟随4 条被执行的语句,每条语句的标注符号T 和E 紧随IT,不适用有其他符号或空格。需要注意的是,指令本身已经有一个T,这个T 标注了随后的第1条语句是否条件成立

image-20231021010802768

image-20231021010819993

查表分支

指令格式:

TBB [Rn,Rm]

TBH [Rn,Rm,LSL#1]

Rn 指的是基址寄存器,存放跳转表的基址;Rm指的是索引寄存器,存放的是跳转表中数据相对基址的偏移量。这两条指令不可使用条件后缀。

指令TBB 需要由8 位的字节组成的数据表,每个字节都是基址的一个偏移量。而指令TBH 需要的数据表是由16 位半字组成,每个半字都是基址的一个偏移量。程序按照这些偏移量进行跳转

image-20231021011151377

饱和运算指令

指令格式

SSAT/USAT Rd,#立即数,Rn

SSAT/USAT Rd,#立即数,Rn,移位,#S

Rd 是指目标寄存器。
Rn 是存储要求计算饱和值的源寄存器。

#立即数是指在SSAT 指令中,表示饱和位数,范围在1~32 之间;在USAT 指令中,范围在0~31 之间;
移位#S 是指只包括ASR #S 运算和LSL #S 运算。在ASR #S 运算中,S 在1~31 之间;在LSL #S 运算中,S在0~31 之间。

位段操作指令

image-20231021012052415

位段清零指令BFC 和位段插入指令BFI

指令格式

BFC Rd,#lsb,#width

BFI Rd,Rn,#lsb,#width

image-20231021012225135

位段提取指令SBFX 和UBFX

指令格式:SBFX/UBFX Rd,Rn,#lsb,#width

Rd 指的是目标寄存器;
Rn 指的是源寄存器;

#lsb 指的是指定位域最低位的位置,范围在0~31之间;

#width 指的是指定位域的宽度(位数),最小是1,最大是32-lsb。

image-20231021012600994

字扩展指令

无符号地将一个字节扩展到32 位使用指令UXTB;带符号地将一个字节扩展到32位使用指令SXTB;无符号地将一个半字扩展到32 位使用指令UXTH;带符号地将一个半字扩展到32 位使用指令SXTH。

image-20231021012904362

Rd 指的是目标寄存器;
Rn 指的是源寄存器;
#n 只能是0、8、16 和24。

image-20231021012935733

杂项指令
空指令,发送事件

NOP 是一条空语句,SEV 用来发送事件

空语句NOP 并不实现任何动作,只起到填充作用,在汇编时将会被代替成ARM中的空操作,比如可能为“MOV R0,R0”指令等。另外,NOP 还可用于软件延时

发送事件指令SEV 用在多核处理器中。使用指令SEV可以在事件发生时,在唤醒当前处理器的同时给其他处理器发送唤醒信号,其他处理器被同步唤醒。

系统调用指令SVC

指令格式:SVC #立即数

其中#立即数是一个8 位的表达式,范围在0~255 之间。

执行这条指令会引起一次异常中断。一般在操作系统的环境下应用,后面的立即数是系统调用的代号。

第四章

系统控制

复位控制

复位,即当出现程序跑飞的情况或程序跳转时,可用手动或自动的方法发信号给硬件特定接口,使软件恢复到特定的程序段运行。

系统复位的流程如下图

image-20231028173747483

复位源

image-20231028173845072

系统复位

外部复位

如果应用程序仅使用内部上电复位(POR)电路,那么RESET输入端必须通过一个可选的上拉电阻连接到电源(VDD)

image-20231028174528349

看门狗复位

在看门狗计数器发生溢出时,可以事先设定程序的下一步去向,避免溢出时程序运行的不确定性,增加程序的可靠性

看门狗计数发生溢出时仅将程序计数器清零,而不是像上电复位那样,将所有的寄存器都要清零。

软件复位

软件复位则是通过软件触发让MCU自己对自己进行复位,软件复位是一种通过执行某个指令来触发MCU复位的系统复位。

软件复位可以复位某个特定的外设或者复位整个微控制器,包括内核在内的整个微控制器,均可以通过设置中断和复位控制器的相应位实现复位。

电源复位

上电复位

image-20231028175142881

掉电复位

如果嵌入式系统在运行过程中电源电压突然发生跌落,会导致程序运行的不确定,所以此时需要将硬件板复位,使其处于一个确定的状态。当电压跌落到一定的阈值以下内部的掉电复位控制器中的条件检测位(BOR)就会被置为1,表示将执行掉电复位程序

image-20231028175454544

时钟控制
输入时钟
时钟源频率/芯片片内时钟片外时钟
高速时钟高速内部时钟高速外部时钟
低速时钟低速内部时钟低速外部时钟

片内时钟:由芯片内部RC振荡器产生,具有起振较快的优点,因此在系统刚刚启动的时候默认采用内部高速时钟。

片外时钟:通常由外部晶体振荡器输入,在精度和稳定性上都具有较大的优势。因此上电后通过软件配置的方式将系统时钟转而采用高速外部时钟信号

高速外部时钟

通常以外部晶体作为时钟源,常用的晶体频率根据芯片的不同而发生变化

高速内部时钟

高速内部时钟由芯片内 RC 电阻、电容时钟振荡器产生,常见频率参数有 5MHz,8MHz 等,虽然不稳定,但是它的启动时间比 HSE晶体振荡器短。然而,即使在校准之后它的时钟频率精度仍较差,Cortex-M4 从上电开始即采用 HIS 作为初始的系统时钟。

低速外部时钟

通常以外部晶振作为时钟源,晶体一般选择一个低速外部晶体或陶瓷谐振器,常见频率参数有 32.768kHz,11.0592kHz 等,它为实时时钟或者其他定时功能提供一个低功耗且精确的时钟源。

低速内部时钟

由片内 RC 电阻、电容时钟振荡器产生,LSI RC 担当一个低功耗时钟源的角色,常见频率参数有 10kHz、32.768kHz、128kHz 等,可以提供给实时时钟模块和看门狗模块。

系统时钟

系统时钟 SYSCLK 由多路选择器 SW 根据用户设置来选择 PLLCLK、HSE 或者 HIS 中的一路作为输出而得,SYSCLK 是片上大部分部件的时钟来源。

系统时钟分频得到的其他时钟

HCLK:HCLK 是高速总线 AHB 时钟,AHB 主要用于高性能模块,如 CPU、DMA和 DSP 等之间的连接。

FCLK:Cortex-M4 内核的“自由运行”时钟,同样由系统时钟 SYSCLK 经过 AHB预分频器分频后直接得到,并且与 HCLK 互相同步。

PCLK1:外设时钟,由系统时钟 SYSCLK 经过 AHB 预分频器,再经过 APB1 预分频器分频后得到。其主要作用是为挂载在 APB1 总线上的时钟提供时钟信号。

电源/功耗控制
睡眠模式

状态:Cortex的内核停止工作,但外设还在继续工作

进入:执行了WFE或WFI指令

退出:某个外设产生事件或者中断请求,内核才会被唤醒,从而退出睡眠模式

停机模式

状态:内核和外设均停止工作

进入:电源控制寄存器中的相应位清零时,遇到WFE或WFI指令,就会进入停机模式

退出:任意一个外部中断/事件控制(EXIT)信号唤醒

待机模式

状态:内核的外设都停止工作,而且内部的电压调压器也被关闭

进入:电源控制器中的相应位置位时,遇到WFI或WFE指令,就会进入待机模式

退出:/RESET引脚上的外部复位信号或者RTC的闹钟事件

嵌套向量中断控制器

中断,即当出现了某个特殊事件时,CPU会终止当前程序的执行,转而去执行该事件的处理程序(中断服务程序),待中断服务程序执行完毕,再返回断点继续执行原来的程序

中断基本概念

中断源

  • 微处理器引发的系统异常中断,包括非屏蔽中断、存储器管理,总线故障等
  • 外设引发的外部中断,包括定时器溢出,串口收到数据等

中断屏蔽

可以通过设置相应的中断屏蔽位,禁止 CPU 响应某个中断,从而实现中断屏蔽。

一个中断源能否被响应,一般由总“中断允许控制位”和该中断自身的“中断允许控制位”共同决定,这两个中断控制位中的任何一个被关闭,该中断就无法被响应。

中断处理过程

  1. 中断响应

    image-20231028183453775

    image-20231028183459556

  2. 执行中断服务程序

    每个中断都有自己的对应的中断服务程序,用来处理中断,CPU 响应中断后转而执行对
    应的中断服务程序,通常中断服务程序又称为中断服务函数,由用户根据具体的应用使用汇编语言或 C 语言编写,用来实现对中断真正的处理操作。

  3. 中断返回

    CPU 执行中断服务程序完毕后,通过恢复现场,即CPU 关键寄存器出栈实现中断返回,从断点处继续执行源程序

中断优先级

中断的优先级是根据中断实时性、重要性、软件处理的方便性预先设定的。当同时有多个中断请求产生时,CPU会优先响应优先级较高的中断请求。

中断嵌套

当新发生的中断的优先级高于正在处理的中断时,CPU可以终止执行优先级低的当前中断处理程序,转去执行新发生的、优先级较高的中断,处理完毕后才返回原来的中断处理程序继续执行。

中断原理
image-20231101134002213 image-20231101134011993

中断配置

首先建立中断向量表,并在中断向量表中为将要使用的中断源设置好中断向量。其次系统需要分配栈空间并初始化;接下来需要在NVIC寄存器中设置该中断源的优先级;完成中断源的优先级设置后需要使能该中断;最后编写中断服务函数,并将相应的外部设备设置好,打开设备的中断功能。

DMA控制器

DMA是在主存与外设之间直接开辟的数据通路,可以进行基本上不需要CPU介入的主存与外设之间的消息传送,这样不仅能保证CPU的高效率,而且能满足高速外设的需要。

在DMA传输方式下,外设通过DMA控制器向CPU提出接管总线控制权的请求。CPU在当前总线周期结束后,响应DMA请求,把总线控制权交给DMA控制器。在DMAC的控制下,外设和内存直接进行数据交换,无须CPU对数据传输控制加以干预,DMA传输结束后,再将总线使用权交还给CPU

传输过程
  1. DMA请求,CPU初始化DMA控制器,外设I/O接口向DMA控制器发出DMA请求
  2. DMA响应,DMA控制器判断DMA请求的优先级,决定是否屏蔽DMA请求,如果接受请求则向总线仲裁器提出总线请求。当CPU执行完当前总线周期时,可释放总线控制权。此时,总线仲裁器输出总线应答,表示DMA已经响应,DMA控制器从CPU接管对总线的控制,并通知外设开始DMA传输
  3. DMA传输,DMA数据以规定的传输单位(通常是字)进行传输。每个单位的数据传送完成后,DMA控制器修改地址,并对数据量的传送单位个数进行计数,继而开始下一个单位数据的传送,直到达到预先设定的传送单位数量为止。
  4. DMA结束,当规定数量的DMA数据传输完成后,DMA控制器通知外设停止传输,并向CPU发送一个信号,例如,产生中断或事件,报告DMA数据传输操作结束,同时释放总线控制权
传送模式
  1. 停止CPU访问内存

    当外围设备要求传送一批数据时,由DMA控制器发送一个停止信号给CPU,要求CPU放弃对地址总线、数据总线和有关控制总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传送,在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。

    优点是控制简单,适用于数据传输率很高的设备进行成组传送

    缺点是在DMA控制器访内阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的

    image-20231101144625298
  2. 周期挪用

    I/O 设备没有 DMA 请求、CPU 按程序要求访问内存时,一旦 I/O 设备有 DMA 请求,则由 I/O 设备挪用一个或几个内存周期,这就是周期挪用方式。

    既实现了 I/O 传送,又较好地发挥了内存和 CPU 的效率,是一种更为广泛采用的方法。

    适用于 I/O 设备读写周期大于内存存储周期的情况。

    image-20231101145037623
  3. DMA与CPU交替访存

    如果CPU的工作周期比内存存取周期长很多,此时就用交替访内的方法可以使DMA传送和CPU同时发挥最高的效率。
    这种方式总线使用权是通过C1和C2分时控制,不需要总线使用权的申请、建立和归还过程

假设CPU工作周期为1.2us,内存存取周期小于0.6us,那么一个CPU周期可分为C1和C2两个分周期,其中C1专供DMA控制器访内,C2专供CPU访内

image-20231101145244234
工作原理
image-20231101145904736

在每个DMA中,DMA仲裁器根据通道请求的优先级来启动外设/存储器的访问,同一时刻一个DMA的多个通道可以同时发起DMA传送请求,但对于一个DMA控制器来说只能允许有一个请求有效。

DMA优先级管理分为两个层次,软件优先级和硬件优先级,软件优先级由软件指定,硬件优先级则是由触发通道所处位置的物理编号决定。

如果同一个DMA的两个请求有相同的软件优先级,则较低编号的通道比较髙编号的通道有更高的优先权。例如,如果DMA1的通道2和通道4具有相同的软件优先级,则通道2的优先级要高于通道4。

DMA的特点

优点:

  • 减轻了CPU的负担
  • 提高了数据传输的效率
  • 减少了用户开发的代码量

缺点:

  • 由于DMA允许外设直接访问内存,从而形成在一段时间内对总线的独占
  • 如果DMA传输的数据量过大,会造成中断延时过长,不适于在一些实时性较强的嵌入式系统中使用

DMA一般用于高速传送成组数据的应用场合

CPU与I/O数据传输的三种方式及其适用性

方式有四种:程序查询方式、中断控制方式、DMA方式、通道方式。

  1. 程序查询方式:输入和输出完全是通过CPU执行程序来完成的。一旦某一外设被选中并启动之后,主机将查询这个外设的某些状态位,看其是否准备就绪。若外设未准备就绪,主机将再次查询;若外设已准备就绪,则执行一次I/O操作。这种方式适用于数据传输速率较低的外设。
  2. 中断控制方式:在主机启动外设后,无须等待查询,而是继续执行原来的程序,外设在做好输入输出准备时,向主机发出中断请求,主机接到请求后就暂时中止原来执行的程序,转去执行中断服务程序对外部请求进行处理,在中断处理完毕后返回原来的程序继续执行。这种方式适用于数据传输速率较高的外设。
  3. DMA方式:在主存和外设之间开辟直接的数据通路,可以进行基本上不需要CPU介入的主存和外设之间的信息传送,这样不仅能保证CPU的高效率,而且能满足高速外设的需要。DMA方式只能进行简单的数据传送操作,在数据块传送的起始和结束时还需CPU及中断系统进行预处理和后处理。这种方式适用于数据传输速率非常高的外设。
  4. 通道方式:通道控制方式是DMA方式的进一步发展,在系统中设有通道控制部件,每个通道挂若干外设,主机在执行I/O操作时,只需启动有关通道,通道将执行通道程序,从而完成I/O操作。通道是一个具有特殊功能的处理器,它能独立地执行通道程序,产生相应的控制信号,实现对外设的统一管理和外设与主存之间的数据传送。但它不是一个完全独立的处理器。它要在CPU的I/O指令指挥下才能启动、停止或改变工作状态,是从属于CPU的一个专用处理器。这种方式适用于大型计算机系统,可以处理大量的I/O设备。

第五章

存储器

image-20231108200532016

半导体存储器主要分为随机存储器(RAM)、只读存储器(ROM)和闪存(Flash)。其中RAM又分为静态随机存储器 (SRAM)以及动态随机存储器(DRAM);ROM分为掩膜只读存储器(MROM),一次可编程只读存储器(PROM),多次可编程只读存储器(EPROM 和 EERPOM);Flash分为 NOR Flash和 NAND Flash。

RAM存储器(掉电易失)

随机存储器,当存储器中的信息被读取或写入时,所需要的时间与这段信息所在位置无关。

静态随机存储器SRAM(CPUcache)

SRAM是靠双稳态触发器来存储一位信息的,因此只要工作电压不存在,存储单元的状态就立即消失,当再次上电时,由于触发器的状态是不稳定的,原来的信息不能恢复。SRAM最大的特点就是信息的易失性,即掉电后RAM中的信息全部丢失。

SRAM不需要刷新电路即能保存内部存储的数据

但是存储1bit的信息需要4-6只晶体管,成本高,性能快

具有n根地址线,m根数据线的SRAM芯片的地址空间为 2 n 2^n 2n,数据宽度为m位,其存储容量为 2 n × m / 8 2^n\times m/8 2n×m/8字节

image-20231108201921151

动态随机存储器DRAM(memory)

动态随机存储器DRAM的存储单元以电容的电荷来表示数据,有电荷代表1,无电荷代表0

处理器通过32位地址总线与内存连接
横向32位总线通过地址译码器
2位(定位字节)
30位经过译码器伸入DRAM(字线)
纵向32位线连接(一个字)(位线)
相交点存储单元1bit

数据通过数据总线传回处理器

image-20231108202500984

具有n根地址线,m根数据线的SRAM芯片的地址空间为 2 2 n 2^{2n} 22n(地址复用),数据宽度为m位,其存储容量为 2 2 n × m / 8 2^{2n}\times m/8 22n×m/8字节

image-20231108203244045
DRAM和SRAM对比

SRAM一般只用于CPU内部的高速缓存(cache),以及MCU内置的数据存储器,而外部扩展的内存一般使用DRAM

image-20231108203549252
  • SRAM和DRAM均掉电易失

  • SRAM不需要定期充电以维持电子,DRAM需要定期充电刷新,因此,SRAM更省电

  • SRAM需要更多晶体管构成一个存储单元,因此SRAM更贵,也更占空间;DRAM可以做的容量更大

与CPU的关系
  • CPU并不知道cache的存在,其认为是从Memory取数据
  • CPU每次从Memory取数据(最小一个字节),但一些数据其实直接从cache取(命中)
  • 根据局部性原理,一些数据从Moemory被加载到Cache,每次加载一个Block(cache line)
image-20231109203227588
MMU

MMU的主要功能是将虚拟地址映射到物理地址,并提供访问控制和保护机制。在带有MMU的嵌入式Linux中,CPU访问的地址都是虚拟地址,而MMU负责将程序中代码或数据的虚拟地址翻译为物理地址,以便程序访问内存。

ROM存储器(掉电非易失)

  • 内嵌于处理器中
  • 闪存

信息只能读出不能随意写入的存储器,称为只读存储器。特点是通过一定方式将信息写入之后,信息就固定在ROM中且具有非易失性。

MROM

存储在MROM内部的数据是在出厂时使用特殊工艺固化的,生产后就不可修改,其主要优势是大批量生产时成本低。

在生产量大、代码或数据不需要修改的场合有很多应用,如处理器芯片的内置启动代码、固定的字码库等

PROM

可编程只读存储器的基本存储单元是一只晶体管或MOS管和一个"熔丝"

image-20231108204739404

存储单元中的“熔丝”是否熔断决定信息0和1。当熔丝未断时,信息是1;当熔丝烧断时,信息为0。由于存储单元的熔丝一旦被烧断就不能恢复,因此PROM只能写入一次。

熔丝的通断状态与是否通电无关,PROM是一种非易失性存储器。

EPROM

EPROM是可擦除可编程的只读存储器。其基本存储单元由一个MOS管组成,但与其他电路相比管内多增加了一个浮置栅

image-20231108205818507

写入时,控制栅上接12V编程序电压Vpp,源极接地,漏极上加5V电压。漏极和源极之间的电场作用使电子穿越沟道形成接通状态。

信息存储在周围都被氧化层绝缘的浮置栅上,即使掉电,信息仍保存。

当EPROM中的内容需要改写时,先将其全部内容擦除,然后再编程。

EPPROM

可电擦除可编程只读存储器,在正常情况下和EPROM一样,可以在掉电的情况下保存数据

不同的是它可以在特定引脚上十家特定电压或使用特定的总线擦写命令完成数据的擦除和写入

EEPROM常用于保存一些系统参数、配置信息等,如网卡的MAC地址、用户设置的参数(音量、频道)等,数据量一般都不大,读写速率要求也不高。

Flash(外设)

快速擦写存储器

Flash 的数据非易失,写入的过程是充电,压入电子,锁电荷。基于锁住电荷的多少,定义信息01。

浮置栅有绝缘氧化层,使电荷只进不出,除非加反向电压,将电荷清除

使用电子设备时,数据会缓存到闪存上,当采血次数过多时,浮置栅的氧化层会变薄,导致其无法锁住电荷。

热数据的频繁擦写会导致存储单元的损坏程度不平衡,软件通过算法计算存储单元的使用次数,将数据写到不同的存储单元。

image-20231109204807706 image-20231109204815736 image-20231109203319328
NORFlash
  • 采用SRAM接口,提供有足够的地址来寻址,可以很容易地存取片内的每一个字节。
  • 地址线和数据线分开,传输效率很高,程序可以在芯片内执行。NOR的读速度比NAND快一些
  • 在NOR Flash上运行代码不需要任何的软件支持

NOR型Flash在读写上与RAM有何异同?

  • 相同点:NOR型Flash与RAM都采用随机读取技术,读取速度都比较快。
  • 不同点:RAM是随机存储器,即能读出又能写入;NOR型Flash(快速擦写存储器)是在EEPROM基础上的改进,可读并且可以多次擦除写入,擦除重写速度较传统的EEPROM更快,但没有RAM快。
NANDFlash
  • 使用I/O总线接口,采用8/16个引脚来传送控制、地址和数据信息
  • 内置数据缓冲器(RAM),批量数据写入速度比NOR快
  • 具有极高的单元密度,容量可以做得比较大,其生产过程更为简单,价格相应较低
  • 在NAND Flash上运行代码通常需要NAND Flash控制器和对应的驱动程序,即内存技术驱动程序MTD
闪存的局限性
  • 写前擦除
  • 块擦除次数有限
  • 读写干扰
  • 电荷泄露

Flash存储器空间越大,则寿命越高,且相对性能越好

铁电存储器FRAM

工作原理

利用晶振中的每个自由浮动的中心原子只有两个稳定状态来记忆逻辑中的0和1

不需要定时刷新,能在断电情况下保存数据。

存储优势
  • 随总线速度写入,在写入后无须任何等待
  • 近乎无限次写入
  • 超低功耗
应用
  • 数据采集和记录
  • 存储配置参数
  • 非易失性缓冲记忆
  • SRAM的取代和扩展
image-20231115005818060

存储器控制器

对齐/非对齐访问

计算机中内存空间都是按照字节(Byte)编址划分的。

对齐访问是指处理器访问的数据的内存地址必须是某个值(通常是2、4或8)的倍数。这种对齐限制简化了处理器和存储器系统之间接口的硬件设计,可以用一个存储器操作周期来读或者写一个数据值。例如,如果一个处理器总是从存储器中取出4字节,则内存地址必须为4的倍数,这样就可以用一个存储器操作周期来读或者写一个int值(4字节)。

非对齐访问是指处理器访问的数据对象被放在两个非对齐存储器块中,这就需要执行两次存储器访问操作,增加了存储器访问的操作次数和时间。

对齐访问在存储空间上可能会有一定的损失(例如,可能需要在字段之间插入填充字节以满足对齐要求),但是在存取效率上会有很大的提高。

大端/小端存储

大端存储,是一种将高字节数据存放在低地址,低字节数据存放在高地址的存储格式;

小端存储,是一种将高字节数据存放在高地址,低字节数据存放在低地址的存储格式。

存储器地址译码

线选法

将单根的高位地址线连接到外围接口芯片的片选端,以获得确定的地址信号,由此选通该芯片。

全译码法

将地址总线中除片内地址以外的全部高位地址接到译码器的输入端参与译码。采用全译码法,每个存储单元的地址都是唯一的,不存在地址重叠,但译码电路较复杂,连线也较多。全译码法可以提供对全部存储空间的寻址能力。

部分译码

将高位地址线中的一部分,而不是全部进行译码来产生片选信号。该方法常用于不需要对全部地址空间进行寻址,但线选法又不够用的情况。采用部分译码法时,由于未参加译码的高位地址与存储器的地址无关,因此存在地址重叠的问题。

image-20231115111504432

image-20231115112257674

image-20231115112551447
存储器性能指标
  • 存储容量
  • 存储时间(读写延迟)
  • 存储周期
  • 存储器带宽(吞吐量)
  • 可靠性
  • 功耗
存储器地址映射

把芯片上的Flash,RAM,外设进行统一编址,即用地址表示对象

image-20231115113641921

第六章

基本外设

GPIO

通用输入输出端口

应用

基本用于芯片与片外器件或设备的交互。

  • 检测数字输入,如键盘或开关信号
  • 驱动LED,蜂鸣器或LCD等其他指示器
  • 控制片外器件,较高级的使用可以用它们(通过程序)模拟很多器件的时序达到控制相应器件的目的,比如模拟SPI和模拟总线等
特性
  • 可以独立控制每个GPIO口的方向(输入输出模式)

  • 可以独立设置每个GPIO口的输出状态(高/低电平)

  • 所有GPIO口在复位后都有个默认方向(或输入或输出,一般为了安全起见,默认为输入)

    image-20231122154229386

    此时,如果将PAO配置为输出,且输出为1,那么就容易造成短路,将PAO烧坏

寄存器概述
  • GPIO口是按组规划,8/16/32个为一组

  • 一般每个GPIO口都需要做两个寄存器位:一是选择口线方向(输入输出),二是需要一个数据位(用于设置输出数据和读取输入数据)

    GPIOxDIR:控制各个GPIO口的方向

    GPIOxDATA:用于各个GPIO口的输入输出数据

image-20231122154713753

数据输入寄存器和输出寄存器和用一个逻辑地址,但实际为两个物理地址

I/O端口配置
  • 引脚可设置为推拉(PUSH-PULL),开漏(OPEN-DRAIN)或上下拉
  • 引脚配置寄存器能够实现引脚的上下拉模式配置,因而可以避免引脚方向和引脚值带来的中间不确定状态
image-20231122155227896
标准输入
  • PINCFGy.PULLEN位置为0——禁用内部上(下)电阻
  • PINCFGy.INEN位置为1——使能I/O引脚的内部缓存
  • DIR的第y位置为0——将I/O引脚设置为输入
image-20231122155533219
上下拉输入
  • PINCFGy.PULLEN位置为1——使能内部上(下)电阻
  • PINCFGy.INEN位置为1——使能I/O引脚的内部缓存
  • DIR的第y位置为0——将I/O引脚设置为输入
image-20231122155728765
输入禁用的推拉输出
  • PINCFGy.PULLEN位置为0——禁用内部上(下)电阻
  • PINCFGy.INEN位置为0——禁用I/O引脚的内部缓存
  • DIR的第y位置为1——将I/O引脚设置为输出
image-20231122155720490
上下拉输出
  • PINCFGy.PULLEN位置为1——使能内部上(下)电阻
  • PINCFGy.INEN位置为0——禁用I/O引脚的内部缓存
  • DIR的第y位置为1——将I/O引脚设置为输出
复位或模拟I/O
  • PINCFGy.PULLEN位置为0——禁用内部上(下)电阻
  • PINCFGy.INEN位置为0——禁用I/O引脚的内部缓存
  • DIR的第y位置为0——将I/O引脚设置为输入
image-20231122155932796 image-20231122155941561

读取按键状态有哪些方式,各有什么优缺点

  • 查询方式:通过GPIO_getInputPinValue(GPIO_PORT,GPIO_PIN)函数来读取按键引脚上对应的状态。采用查询方式,处理逻辑更加简单,缺点是在主程序循环中需要一直查询直到条件满足,CPU利用率低。
  • 中断方式:通过中断函数来检测按键状态是否变化。采用中断方式只有在检测到中断事件发生时才会暂停主程序转而去执行中断服务子程序,不需要反复检查外设状态,CPU利用率高。缺点是处理逻辑复杂,不便于调试。

用中断方式感知按键时,如何消除按键抖动的影响

检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

通用定时器/计数器

应用
  • 嵌入式操作系统的任务调度
  • 嵌入式操作的系统的软件时钟需要基于硬件定时器产生定时信号
  • 通信电路的波特率发生器
  • 实时时钟电路
  • 一些智能芯片如DMA控制器等
  • 具有液晶控制器的嵌入式处理器用于液晶的刷新
  • 处理器监控电路如看门狗等
  • A/D和D/A转换等
  • 集成的动态存储器控制器用于动态存储器的刷新
image-20231122160705837
工作模式
  • 单次计数模式:计数器计数到0就产生中断并停止计数
  • 循环计数模式:每次计数器计数到0便产生一次中断,随后重新载入初始值计数器的值,继续计数。
特性
  • 输入捕获

    image-20231122161001621
  • 输出比较

    image-20231122161100470
  • 脉宽调制模式PWM

image-20231122161556215
定时器的一般结构及其扩展功能(输入捕获、输出比较、PWM 等)

定时器主要由控制寄存器、状态寄存器、初始值寄存器、输出寄存器和计数器组成。输入捕获功能可以用于测量周期。只要捕获两次脉冲,然后相减就能得到两次脉冲的间隔时间。输出比较功能可以用于产生特定波形。当计数器的值与比较寄存器的值相等时,可在输出引脚输出指定信号。PWM是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其原理是冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。

PWM

image-20231122162455763 image-20231122162559476

WDT

功能

使微控制器在进入错误状态后的一定时间内复位。当看门狗使能时,如果用户程序没有在周期时间内喂狗(重装),看门狗会产生一个系统复位。

可用作普通定时器:

如果系统不需要看门狗功能,可将它当作普通定时器使用,当到达WDT所定的时间后产生中断

特性
  • 如果没有周期性重装(喂狗)动作,则产生片内复位
  • 有看门狗和定时器两种模式
  • WDT定时器具有中断功能
  • 错误或不完整的喂狗时序,将立即引起复位
工作原理

看门狗设置一定的计时时间。看门狗使能后,计数器开始计数。看门狗使能后,计数器开始计数,当计时时间到后,则触发系统复位。如果在定时时间到达之前进行喂狗(计数器重装)动作,就不会引起系统复位。

其中看门狗的定时时间可以由用户设定,这样可以根据需要在指定的时间内复位系统。

软件上对看门狗的控制:包括打开看门狗(即设置初始参数并调用中断来使看门狗开始工作)、关闭看门狗(即停止使用看门狗)和看门狗定时器重装(即在看门狗计数器的数值减为零之前恢复其初始值)。

这种设计为系统提供了极高的可靠性,即使系统死锁,也可以及时自动恢复系统。在工业现场,当供电电源、空间电磁干扰或其他原因引起强烈的干扰噪声作用于数字器件时,看门狗可以防止程序“跑飞”事故,使程序能够回到正常工作状态。尤其是在具有循环结构的程序任务中,使用看门狗的效果更为明显。

image-20231122164018148

RTC

实时时钟

应用

实时时钟器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常常用作各种计算机系统的时钟信号源和设置参数的存储电路。

实时时钟广泛应用于各种电子产品、智能化仪器仪表中,例如照相机、洗衣机等。

image-20231122164645940

  • 闰年发生器:用于产生闰年逻辑
  • 时钟控制器:用于控制RTC的功能
  • 报警发生器:用于控制产生报警信号
  • 复位寄存器:用于重置SEC和MIN寄存器

第七章

通信外设

同步通信与异步通信

  • 异步通信:不使用公共的参考时钟,但必须使用相同的波特率。如UART。
  • 同步通信:由主机提供时钟与数据,从机使用该时钟接收数据或发送数据。通信双方共用时钟源。如SPI和I2C

单工、半双工、全双工

  • 单工:任何时刻只能进行单向的数据传输

  • 半双工:可双向传输,但在同一时间,信息只能单向传输

  • 全双工:任何时刻通信双方都可以同时进行信息收发,实现同时双向信息传输

波特率

波特率是衡量数据传送速率的指标。在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。

UART-异步通信收发器

应用
  • 直接和其他的控制器进行数据交换
  • 和PC机通信,由于PC机串口是RS232电平,所以连接时需要使用RS转换器

RS-232-C电平转换

在RS-232-C中任何一条信号线的电压均为负逻辑关系。即逻辑“1”为-5〜-15V;逻辑“0”为+5〜+15V。噪声容限为2V。也就是说,要求接收器能识别高到-3V的信号作为逻辑“1”,以及低至+3V的信号作为逻辑“0”。使用较高的电平电压进行传输可增加线路的抗干扰能力、延长通信距离。

image-20231128214711216
  • USB虚拟串口
image-20231128214843652
工作原理
  • 选择一个波特率作为发送(/接收)数据的时序,交互双方的波特率必须一致

  • 以帧为单位发送,帧组成:开始位、数据位(7/8),校验位(可选),停止位(1/2)。通信双方的可选部分的设置必须完全一致

    image-20231128220341902 image-20231128220611039
  • 中断和状态位:接收到一帧数据,如果相应中断开启,则进入中断处理程序读出数据;否则可以通过循环查看接收状态位来确定是否收到数据。

  • 使用UART通信

    image-20231128220708067
  • 串行发送机TxMachine

    1. 生成奇偶校验位
    2. 清除发送
    3. 中断字符发送
    4. 双缓冲区操作
  • 串行接收机RxMachine:把接收到的串行数据送到接收移位寄存器,接收完成后,数据送到串行接收缓冲寄存器SxRBUF,用户从SxRBUF中读取接收到的数据

    1. 奇偶校验错:置位奇偶错标志位
    2. 帧错误:未收到停止位,置位帧错误标志位
    3. 超越错误:接收到新字符前,以前收到的字符没有被CPU读走,旧数据被覆盖,置位超越错误标志位
image-20231128221729912 image-20231128222049613

SPI-串行外部设备接口

应用
  • 简单的TTL移位寄存器(用作并行输入或输出口)
  • LCD显示驱动器
  • A/D转换器
  • Flash
  • RAM
  • 网络控制器
  • MCU
拓扑结构及特性
  • 全双工同步串行接口。两条数据线用于收发数据,一条时钟线用于同步
  • 一个SPI总线可以连接多个主机和多个从机。在同一时刻只允许一个主机操作总线,并且只能与一个从机通信。主机控制数据的传输过程。
  • 串行时钟由主机产生,当主机发送一字节数据(MOSI)的同时,从机返回一字节数据(MISO)
image-20231128224217048
  • SCK:输入/输出,串行时钟,用于同步SPI接口间数据传输的时钟信号。该时钟信号总是由主机驱动,并且从机接收
  • SSEL:输入,低有效信号,用于指示被选择参与数据传输的从机。每个从机都有各自特定的从机选择输入信号。
  • MISO:输入/输出,主入从出
  • MOSI:主出从入
image-20231128224725145 image-20231128224856432 image-20231128224924557
SPI数据传输

时钟极性

时钟极性(CPOL)决定串口时钟在空闲时是高电平还是低电平。当 CPOL=0 时,串口时钟在空闲时保持低电平;当 CPOL=1 时,串口时钟在空闲时保持高电平。

时钟相位

时钟相位(CPHA)决定数据在第几个时钟跳变沿被采样。当 CPHA=0 时,数据在串行同步时钟的第一个跳变沿数据被采样;当 CPHA=1 时,数据在串行同步时钟的第二个跳变沿数据被采样。

image-20231128230225682
  • 作主机时,在发送一字节数据的同时接收一字节的数据
  • SPI时钟分频值必须大于或等于8
  • 数据寄存器与内部寄存器之间没有缓冲器,写SPDR会使数据直接进入移位寄存器。因此数据只能在上一次数据发送完成后写入SPDR寄存器
image-20231128231243249 image-20231128231311138

I2C-内部集成电路总线

简介及应用
  • 芯片间串行传输总线
  • 半双工同步数据传送
拓扑结构及特性

image-20240107011433981

  • 只需要两根线,一个串行数据线(SDA)和一个串行时钟线(SCL).

  • 可以通过软件方式和一个唯一的地址来寻找到每一个连接到总线的设备,简单的主从关系一直存在.主机可以作为主机发送器或者主机接收器.

  • 它是真正的多主机总线,如果有两个或多个主机初始化数据传输,可以通过冲突检测和仲裁来防止数据被破坏.

  • 串行的8位双向数据传输在标准模式下达到100kb/s,快速模式下是400kb/s,超速模式下是3.4Mb/s.

  • 串行的8位单向数据在快速模式下可以达到5Mb/s.

  • 片上的滤波器可以保护数据完整性.

  • 总线上连接的最大IC数量由总线最大的电容所限制.

起始、终止信号

I2C 总线协议定义了两种信号,以便开始和结束数据传输,即起始信号和停止信号。当 SCL 为高电平时,SDA 线由高到低的跳变被定义为起始信号;当 SCL为高电平时,SDA 线由低到高的跳变被定义为停止信号。总线在起始条件之后被视为忙状态,在停止条件之后被视为空闲状态。

I2C的总线仲裁的原理

在空闲总线上两个主机可以同时开始传输,所以必须要有一个方法来决定哪个主机来控制总线并完成其数据传输。仲裁解决了两个或两个以上设备同时发出起始信号的冲突。只有在总线空闲时,主机才可以启动传输。在起始信号的最少保持时间内,两个或两个以上的主机都有可能产生起始信号。在这些情况下,当 SCL 为高电平时仲裁机制在 SDA 线上产生。在仲裁过程中,若某一个竞争的主机在 SDA 上设置 1(高电平),而另一个主机发送 0(低电平),那么前者将关闭其数据输出并退出,直至总线再次空闲。

image-20231128235225552
术语

主机:初始化发送、产生时钟信号和终止发送的器件,它可以是发送器或接收器。主机通常是微控制器

从机:被主机寻址的器件,可以是发送器或接收器

多主器件:多个主器件可以同时企图控制总线而不破坏总线信息

BUS接口

SCL线上时钟低电平时间由各器件中时钟最长的低电平决定,时钟高电平时间则由高电平时间最短的器件决定。

数据形式
image-20231128233015572

第一个字节是由7位从地址和R/W(读写位)组成,不论总线传送地址信息还是数据信息,每个字节传送完毕接收设备都会发送一个反馈响应位。后面都是数据信息,直到接收到停止信息。

image-20231128233724754 image-20231128234001305 image-20231128234238328 image-20231128234809778 image-20231128234909642 image-20231128235143612

CAN总线——控制局域网络

image-20231207213734761
  • 各个节点通过CAN_H和CAN_L两条线实现信号的串行差分传输
  • 可以在线增减设备
  • 最多可以容纳110个节点
  • 波特率为5Kbps~1Mbps,每个节点的波特率保持一致
  • 采用载波监听多路访问、逐位仲裁的非破坏性总线仲裁技术
CAN的通信协议
物理层

image-20231207215405559

物理层完成电气连接、物理信号的定时、同步、位编码解码功能。

数据链路层
  1. MAC子层

    CAN的MAC层主要完成数据的封装/拆装、帧编码、媒体访问管理、错误检测、出错标定、应答、串行化/解除串行化等功能。

    CAN的媒体访问机制采用具有优先级的CSMA/CD方式,并对CSMA/CD方式进行了改进,主要表现在它的碰撞检测是非破坏性的多主方式工作:连接到总线上的任意节点都可以向总线上发送信息帧,网络上节点信息分成不同优先级。

  2. LLC子层

    LLC子层的功能是为数据传送和远程请求提供服务,确认由LLC子层接收的报文实际已被接收,并为恢复管理和通知超载提供信息。

USB-通用串行总线

定义

USB是通用串行总线,是连接计算机系统与外部设备的一种串口总线标准,也是一种输入/输出接口的技术规范。

优点
  • 使用方便:支持热插拔和即插即用(最大的特点)。当设备插入时,主机枚举到此设备并加载所需的驱动程序。USB 在速度上远比并行端口与串行接口等传统计算机用标准接口快。一个USB接口最多可以连接127个USB设备
  • 功能多样:USB设备提供各种各样多媒体功能。支持USB的声卡和音箱可以更好地减少噪声。
  • 速度快:USB1.1接口最高传输速率可达到12Mbps/s
  • 自供电:USB接口内置了电源,可以向低压设备提供5V电源
  • 成本低廉
  • 易于升级

USB是一种电缆总线,定义两种角色:主机和设备;USB总线完成在主机和设备之间进行数据传输的功能。

USB interconnect

定义USB设备与主机之间进行的连接和通信的操作

  • 总线的拓扑结构:USB主机和设备之间的连接方式
  • 内部层次关系:USB主机和设备的各个层次之间的关系
  • 数据流模式:数据在USB系统中从发送方到接收方的流动方式
  • USB调度:USB共享带宽,需要对多个任务进行调度以满足对同步传输方式的支持

image-20231207232315785

USB Host

任何USB系统中,只能有一个主机。主机和USB总线的接口称为主机控制器。主机控制器由硬件和软件组成,主机通过主机控制器与设备进行通信。

主机的功能:

  • 检测USB设备的插入和卸载
  • 管理在主机和设备之间的控制流
  • 管理在主机和设备之间的数据流
  • 收集状态和动作信息
  • 给与之连接的USB设备提供电源
USB Device
  • 底层:传送和接收数据包的总线接口
  • 中间层:处理总线接口与不同端点之间的数据传输
  • 上层:提供给用户的某种功能

USB总线枚举过程

1)设备连接及上电:USB设备接入USB总线并上电。

2)主机检测设备:设备连接并上电后,主机通过检测设备在总线的上拉电阻检测到有新的设备连接并确定设备速度。然后发出一个复位信号,设备接收到复位信号以后才可以对总线的处理操作做出响应,然后设备就使用默认地址(00H)作为自己的暂时地址。

3)获取设备描述符:主机发出一个标准设备请求GetDeviceDescriptor,以获取设备描述符、默认管道的最大数据长度等信息。这个步骤只是试探性的,目的是得到真正长度,后面才会读取设备描述符。

4)设置地址:主机发出下一个请求SetAddress。当USB设备连接以后,由主机负责给设备分配一个唯一的地址。

5)读取设备描述符:主机发出GetDeviceDescriptor,读取全部设备描述符,一般为18字节,分为多次传输。

6)读取配置描述符:主机读取配置描述符GetConfigDescriptor。

7)读取接口描述符和端点描述符:主机除了读取设备描述符和配置描述符外,还要读取接口描述符和端点描述符。这次还是使用读取配置描述符的方法GetConfigDescriptor来读取全部的配置描述符、接口描述符和端点描述符的集合。

8)设置配置:主机获取了设备的配置信息后,选择其中一个配置,并用SetConfig命令将所选择的配置种类通知USB设备。在该过程结束后,设备可用,总线枚举过程结束。

USB传输方式及典型应用

控制传输:一般用于短的、简单的对设备的命令和状态反馈,例如用于总线控制的 0 号管道。任何一个 USB 设备都必须支持一个与控制类型相对应的端点 0(默认端点)。

同步传输:按照有保障的速度(可能但不必然是尽快地)传输,可能有数据丢失,例如实时的音频、视频。这种类型保留了将时间概念包含于数据中的能力,但同步传输方式的发送和接收方都必须保证传输率的匹配,不然会造成数据的丢失。例如视频设备、音频设备等。

中断传输:用于必须保证尽快反应的设备(有限延迟),例如鼠标、键盘。

批量传输:使用余下的带宽大量地(但是没有对于延迟、连续性、带宽和速度的保证)传输数据,例如普通的文件传输。批量传输方式并不能保证传输的速率,但可保证传输的可靠性,当出现错误的时候会要求发送方重发。例如打印机,扫描仪,数码相机等外设。

第八章

image-20231208000959155

ADC

将输入连续变化的模拟信号变换为与其成正比的数字量信号输出。

ADC的分类及特点

模数转换器的种类很多,按工作原理的不同,可分成直接比较型和间接比较型和Σ-Δ型。

直接比较型:直接比较型ADC 将输入模拟信号直接与标准的参考电压比较,从而得到数字量。属于这种类型常见的有并行比较型ADC 和逐次逼近型ADC。逐次逼近型ADC 比较高速,且功耗相当低,在低分辩率(<12位)时价格便宜,但高精度(>12位)时价格很高。并行比较型ADC 是现今速度最快的模数转换器,但由于n位的输出需要2n 个电阻和2n−1 个比较器,所以电路规模极大,价格也高,一般只适用于要求高速、低分辨率的场合。

间接比较型:间接比较型ADC 的输入模拟量不是直接与参考电压比较,而是将二者变为中间的某种物理量再进行比较,然后将比较所得的结果进行数字编码。其中最为常见的是积分型ADC。积分型ADC 的分辨率高,功耗低,成本低,但转换速率低,主要应用于低速、精密测量等领域,如数字电压表。

Σ-Δ型:它的分辨率高而成本又很低,在既有模拟又有数字的混合信号处理场合优势明显。

ADC主要技术指标

ADC 的技术指标主要有分辨率、精度、转换时间等。

  • 分辨率用来反映ADC 对输入电压微小变化的响应能力。它定义为转换器的满刻度电压与2n 的比值,其中n 为ADC 的位数。一般而言,ADC 模块位数(分辨率)越高,数据采集的精度就越高。

  • ADC 模块的精度反映了ADC 模块在实际情况下与在理想情况下进行模/数转换的差值,常用最低位(LSB)的倍数表示。转换器的精度决定了数字输出中有多少个比特表示输入信号的有用信息。

  • 转换时间是指ADC 模块完成一次模拟数字转换所需要的时间,即由发出启动转换命令信号到转换结束信号开始有效的时间间隔。

举例说明几种类型ADC 的优缺点

逐次逼近型ADC :优点是比较高速,且功耗相当低,在低分辩率(<12位)时价格便宜。缺点是在高精度(>12位)时价格很高。

并行比较型ADC: 优点是采用多个比较器因而速度很快。缺点是电路规模极大,价格高。

积分型ADC:优点是用简单电路就能获得高分辨率,功耗低,成本低。缺点是由于转换精度依赖于积分时间,因此转换速率低。

第九章

嵌入式系统软件组成

嵌入式系统软件架构
无操作系统的嵌入式应用软件
image-20231213195725552

采用单任务程序实现系统功能,此单任务程序通常由一段用汇编语言编写的启动代码BootLoader和用高级语言(如C, C++等)编写的驱动程序和系统应用程序组成

包含操作系统的嵌入式应用软件
image-20231213195927882
初始化引导程序Bootloader

微控制器上电后,无法从硬件上定位main函数的入口地址,因为main函数的入口地址在微控制器的内部存储空间并不是绝对不变的,所以每一种微控制器(处理器)都必须有初始化引导程序。

板级支持包BSP

BSP是嵌入式系统的基础部分,也是实现系统可移植性的关键。它负责上电时的硬件初始化,启动RTOS或应用程序模块,提供底层硬件驱动,为上层软件提供访问底层硬件的支持。

image-20231213201837934
引导加载程序BIOS+Bootloader

PC中的引导加载程序由BIOS和BootLoader程序组成。

BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Bootloader读到系统的RAM中,然后将控制权交给OS的Bootloader程序。

Bootloader的主要任务是将操作系统内核映象从硬盘读入RAM中,然后跳转到内核入口点去运行,从而开始操作系统的运行。

BIOS和BSP的比较

  • 类似的工作:负责计算机开启时检测、初始化系统设备、装入操作系统等工作。
  • 区别
    1. BIOS不包含设备驱动程序;而BSP包含
    2. BIOS的代码是在芯片生产过程中固化的,一般来说开发者无法修改;但程序员却可以修改BSP,即可以在BSP中根据需要任意添加一些和应用相关但与系统无关的硬件设备驱动程序,还可以根据需要修改初始化代码。
设备驱动程序

设备驱动程序是一种可以使应用软件和硬件外设进行交互的特殊,它把具体外设的硬件功能,抽象成软件命令接口,应用程序只需调用这个接口,便可控制硬件设备的工作。

用户程序获取数据时会调用驱动程序函数,当驱动程序从设备获取数据后,它会将数据返回到用户程序中。

库函数

库函数实现了对底层寄存器操作的封装,它由一系列完成系统I/O、数据处理操作的API组成。

嵌入式系统软件设计方法

前后台系统

对基于芯片的开发来说,应用程序一般是一个无限的循环,可称为前后台系统或超循环系统。循环中调用相应的函数完成相应的操作,这部分可以看成后台行为,后台也可以叫作任务级。这种系统在任务处理的及时性上比实际可以做到的要差。中断服务程序处理异步事件,这部分可以看成前台行为,前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务程序来保证的。

image-20231213204213156
中断(事件)驱动系统

嵌入式系统的中断是一种硬件机制,用于通知CPU 发生了异步事件。中断一旦被识别,CPU 保存部分(或全部)上下文即部分或(全部)寄存器的值,然后CPU 跳转到专门的子程序去执行,该子程序被称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后,主程序将按如下情况进行执行:

在前后台系统中,程序回到后台程序;

对非占先式内核而言,程序回到被中断了的任务;

对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。

巡回服务系统

当嵌入式微处理器/微控制器的中断源不多时,可以采用软件的方法实现由主循环完成对外部事件的处理,即把软件设计成巡回服务系统。巡回服务系统要处理多个任务时,要使用状态机设计方法。就是把每个任务中可依次顺序执行的步骤划分为不同的状态,并搞清楚状态迁移条件,使用switch() case 结构来实现步骤处理和状态迁移。

基于定时器的巡回服务系统

巡回服务系统中的处理器总是处于全速运行的状态,能耗较高。若系统的外部事件发生不是很频繁,可以降低处理器服务事件的频率,这样既不会影响响应速度,又节省了能耗,即采用一种基于定时器驱动的巡回服务方法。

image-20231213205353761
带操作系统的嵌入式软件开发

嵌入式Linux对标准Linux经过小型化裁剪处理之后,能够固化在容量只有几KB 或者几MB 字节的存储器芯片(如Flash)或者单片机中,适合特定嵌入式应用场合的专用Linux 操作系统。

Linux为了更好地适应嵌入式领域的开发,做了不少改进

  1. 改善的内核结构
  2. 提高的系统实时性

一个嵌入式Linux 系统软件开发分为四个层次:

  1. 建立引导加载程序:包括固化在固件(Firmware)中可选的boot代码和BootLoader两大部分
  2. 移植Linux内核:设定嵌入式板子的定制内核以及内核的启动参数
  3. 建立文件系统:包括根文件系统和建立在Flash设备之上的文件系统
  4. 开发应用程序:特定的用户应用程序,有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面
交叉编译

在一个平台上生成可以在另一个平台上执行的代码。

交叉编译是一种编程过程,它在一个计算机环境(称为主机)中编译出可以在另一个不同的计算机环境(称为目标)中运行的代码。这个过程包括编译和链接两个步骤。
例如,你可能在Intel x86架构/Linux(Ubuntu)平台下使用交叉编译工具链生成可执行文件,然后在ARM架构/Linux下运行这个文件。这就是交叉编译的基本概念。
交叉编译的主要原因有两个:

  • 交叉编译的目标系统通常是内存较小、显示设备简陋甚至没有的,没有能力在其上进行本地编译。
  • 有能力进行源代码编译的平台CPU架构或操作系统与目标平台不同。

第十章

  • uC/OS,实时操作系统,通常用于嵌入式系统,如微控制器和小型设备,而不常用于手机终端。
  • Symbian、WinCE和Linux都曾被广泛用于手机操作系统。如Symbian主要用于诺基亚的手机,WinCE是微软的一种嵌入式操作系统,Android是基于Linux的操作系统,广泛用于各种手机和平板电脑。

RTOS

内核

是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

调度器

内核中具有任务调度功能的模块称为调度器,调度器会按照一定的调度算法来执行任务。

实时操作系统
  • 软实时系统

    仅要求事件响应最实时的,并不要求限定某一任务必须在多长时间内完成,例如:音频-视频播放系统、网页服务等。

  • 硬实时系统

    不仅要求任务响应要实时,而且要求在规定的时间内完成事件的处理,例如:核动力装置控制、安全气囊控制系统和车辆防抱死系统(ABS)等。

在软实时系统中,系统会根据应用软件的所规定的时间,在一个弹性的时间内完成某项工作,并不一定要在规定时间内完成,而硬实时系统的任务一定要在规定的时间内完成,并且不允许任何超出时限的错误。由于超时的错误可能会带来损害甚至导致系统失败,或导致系统不能实现它的预期目标,所以硬实时系统在安全领域和需要高可靠性的环境中使用较多

功能组成
任务

image-20240106192950679

任务/进程状态

image-20240106193009832

任务调度
基于优先级的调度算法

image-20240106193155785

基于时间的调度算法

image-20240106193212117

任务通信
  • 基于存储器共享,实现的进程通信机制,例如管道(Pipe)、内存映射方法等 。
  • 基于消息的进程之间的信息交换机制,例如消息队列(Message Queue)、邮箱(Mailbox)和信号通信(Signaling)等方式。
任务同步
  • 互斥量为共享资源提供了互斥访问机制,系统每次只能将资源分配给单个进程,并且该进程使用共享资源时,不允许其他进程抢占其资源。它与临界区对象的区别在于它可以被多个进程互斥访问。
  • 计数信号量其始终记录某个特定的计数器,其取值范围是从 0到某个固定值之间,从这是限制了系统支持资源并发访问的最大数目。当进程或线程获取信号量对象的时候,计数信号量的计数值将会减 1;当进程或线程释放信号量对象的时候,计数信号量的计数值将会加 1;当已经达到信号量所能支持的最大并发数目时,这时其他进程再要求访问改共享资源时将拒绝访问。
代码临界区

临界区对象只能由单个进程的线程之间使用,进程会将临界区对应的代码段放置到进程的临界区域,而且通过调用相应接口系统会为临界区分配存储器区域空间

uC/OS-II、FreeRTOS 及其特点、任务状态

μC/OS-II 能管理 64 个任务,并提供任务调度与管理、内存管理、任务间同步与通信(信号量、邮箱、消息队列)、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。目前其应用在很多领域,如手机、网络设备、音响设施、不间断电源、飞行器、医疗器械及工业控制上。

FreeRTOS 操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可移植到各种单片机上运行。

BootLoader及其作用

BootLoader 是在操作系统内核运行之前执行的一段小程序它将操作系统内核从外部存储介质拷贝到内存中,并跳转到内核的首条指令。

第十一章

物联网常用的短距离无线通信技术、远距离无线通信技术

NFC信息通过射频中无线频率部分的电磁感应耦合方式传递。内置NFC 芯片的手机相比仅作为标签使用的RFID 增加了数据双向传送的功能。实现安全、迅速的通信,传输范围较RFID 小,并兼容现有的非接触式智能卡技术。

ZigBee在低功耗待机模式下,2 节5 号电池可支持1 个节点工作6~24 个月,甚至更长。ZigBee 的响应速度较快,从睡眠转入工作状态只需15ms,节点连接进入网络只嵌入式系统原理与实践需30ms。工作在20~250kbps 的通信速率,分别提供2~250kbps(2.4GHz)、40kbps(915MHz)和20kbps(868MHz)的原始数据吞吐率,满足低速率传输数据的应用需求。ZigBee 支持星形、树状形和网状形拓扑结构,星形拓扑每个设备只能和Coordinator 协调者节点通信,如果两个设备需要通信必须通过协调者转发;树状形拓扑中设备只能和它的父节点通信,路由信息是协议栈层处理的,整个路由过程对于应用是完全透明的;网状形拓扑具有类似树状型,只不过具有更多的路由和协调者,并具有更加灵活的信息路由规则。

BLE 数据传输支持很短的数据封包(8~27 字节),传输速度可达1Mbps。使用调节性跳频,减少2.4 GHz ISM 波段其他技术的干扰。联机建立仅需3 毫秒,应用程序可快速启动、并以数毫秒的传输速度完成数据传输。使用AES-128 安全加密,采用24 位的循环冗余校验(CRC),为数据封包提供高度加密性及认证度。支持点对点、星形和网状网络结构如图11.6 所示。网状形拓扑中结构是建立多对多节点通信,节点可以直接或间接向一个或多个节点进行信息传递,拓扑中的转发节点可以选择特定路径或者通过受控泛洪转发消息送到范围内的节点。

Wi-Fi覆盖范围广,适合办公室及单位楼层内部的使用。通信带宽高,基本可满足各种应用需求。基础设施完善,组网简洁方便,兼容性、互操作性好。Wi-Fi 技术在结构上与以太网一致,可快速部署、无缝覆盖。Wi-Fi 使用ISM 全球开放频段,用户无须任何许可就可以自由使用该频段上的服务。

LoRa 接收灵敏度高,高达157db 的链路预算使其通信距离可达15 千米(与环境有关)。接收电流仅10mA,睡眠电流200nA,大大延长了电池的使用寿命。基于LoRa 技术的集中器/网关,支持多信道多数据速率的并行处理,系统容量大。LoRa 网关是LoRa 节点与IP 网络之间的桥梁(通过2G/3G/4G 或者Wi-Fi/Ethernet),每个网关每天可以处理500 万次各节点之间的通信(假设每次发送10Bytes,网络占用率10%)。如果把网关安装在现有移动通信基站的位置,发射功率20dBm(100mW),那么在建筑密集的城市环境可以覆盖2 千米,而在密度较低的郊区,覆盖范围可达10 千米。基于终端节点和集中器/网关的系统,可以支持测距和定位。LoRa 对距离的测量是基于信号的空中传输时间而非传统的信号强度RSSI ( Received Signal Strength Indication),而定位则基于多点(网关)对一点(节点)的空中传输时间差的测量。其定位精度可达5 米(假设10 千米的范围)。

NB-IoT 基于移动蜂窝网技术,在室外和室内都具有很好的网络覆盖。通过降低芯片复杂度,减少终端监听网络的频度,采用长周期的RAU/TAU,减少终端发送位置更新的次数等技术来降低终端功耗,基于AA 电池,使用寿命可达10 年。采用180KHz 的窄带系统,降低基带的复杂度,提升了频谱效率;简化协议栈带来了Flash 使用量的减少,同时还使用低采样率,降低了RF 成本。

image-20240106194554432

物联网应用系统的架构

物联网的整体架构可以大致分成三层,分别是感知层、网络层、应用层。

感知层:这一层由传感器网络组成。该层的主要功能是实现信息的采集、转换及收集。

网络层:网络层是中间层,由各种私有网络、互联网、有线和无线通信网、网络管理系统等组成。该层的主要功能就是负责传递和处理感知层获取的信息,从而实现更加广泛的互联功能,把感知到的信息无障碍并且安全可靠地进行传送。

应用层:应用层包括用于支撑该物联网的接入平台和应用服务两部分。该层的主要功能就是提供大量传感设备安全接入,通过分析网络层接收的大量数据,得出有用的数据为用户提供应用服务。

MQTT协议及其特点

客户端功能:

①发布其他客户端可能会订阅的信息。

②订阅其他客户端发布的消息。

③退订或删除应用程序的消息。

④断开与服务器连接。

服务器功能:

①接受来自客户的网络连接。

②接受客户发布的应用信息。

③处理来自客户端的订阅和退订请求。

④向订阅的客户转发应用程序消息。

MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与设备之间消息的转发。

MQTT在协议设计时就考虑到不同设备的计算性能的差异,所以所有的协议都是采用二进制格式编解码,并且编解码格式都非常易于开发和实现。最小的数据包只有2个字节,对于低功耗低速网络也有很好的适应性。

MQTT有非常完善的QOS机制,根据业务场景可以选择最多一次、至少一次、刚好一次三种消息送达模式。运行在TCP协议之上,同时支持TLS(TCP+SSL)协议,并且由于所有数据通信都经过云端,安全性得到了较好地保障。

因此MQTT适用在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。

第十二章

EMC

电磁兼容性是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力。因此EMC包括两个方面的要求:

一方面是指设备在正常运行过程中对所在环境产生的电磁干扰不能超过一定的限值;

另一方面是指设备对所在环境中存在的电磁干扰具有一定程度的抗扰度,即电磁敏感性。

低功耗系统设计方法
  • 编译低功耗优化技术;

  • 硬件软件化;

  • 采用事件驱动方式,减少处理器的工作时间;

  • 采用快速算法;

  • 通信系统中提高通信的波特率;

  • 数据采集系统中使用合适的采样速率。
    或者通过受控泛洪转发消息送到范围内的节点。

Wi-Fi覆盖范围广,适合办公室及单位楼层内部的使用。通信带宽高,基本可满足各种应用需求。基础设施完善,组网简洁方便,兼容性、互操作性好。Wi-Fi 技术在结构上与以太网一致,可快速部署、无缝覆盖。Wi-Fi 使用ISM 全球开放频段,用户无须任何许可就可以自由使用该频段上的服务。

LoRa 接收灵敏度高,高达157db 的链路预算使其通信距离可达15 千米(与环境有关)。接收电流仅10mA,睡眠电流200nA,大大延长了电池的使用寿命。基于LoRa 技术的集中器/网关,支持多信道多数据速率的并行处理,系统容量大。LoRa 网关是LoRa 节点与IP 网络之间的桥梁(通过2G/3G/4G 或者Wi-Fi/Ethernet),每个网关每天可以处理500 万次各节点之间的通信(假设每次发送10Bytes,网络占用率10%)。如果把网关安装在现有移动通信基站的位置,发射功率20dBm(100mW),那么在建筑密集的城市环境可以覆盖2 千米,而在密度较低的郊区,覆盖范围可达10 千米。基于终端节点和集中器/网关的系统,可以支持测距和定位。LoRa 对距离的测量是基于信号的空中传输时间而非传统的信号强度RSSI ( Received Signal Strength Indication),而定位则基于多点(网关)对一点(节点)的空中传输时间差的测量。其定位精度可达5 米(假设10 千米的范围)。

NB-IoT 基于移动蜂窝网技术,在室外和室内都具有很好的网络覆盖。通过降低芯片复杂度,减少终端监听网络的频度,采用长周期的RAU/TAU,减少终端发送位置更新的次数等技术来降低终端功耗,基于AA 电池,使用寿命可达10 年。采用180KHz 的窄带系统,降低基带的复杂度,提升了频谱效率;简化协议栈带来了Flash 使用量的减少,同时还使用低采样率,降低了RF 成本。

[外链图片转存中…(img-QKiqrpKF-1704789754245)]

物联网应用系统的架构

物联网的整体架构可以大致分成三层,分别是感知层、网络层、应用层。

感知层:这一层由传感器网络组成。该层的主要功能是实现信息的采集、转换及收集。

网络层:网络层是中间层,由各种私有网络、互联网、有线和无线通信网、网络管理系统等组成。该层的主要功能就是负责传递和处理感知层获取的信息,从而实现更加广泛的互联功能,把感知到的信息无障碍并且安全可靠地进行传送。

应用层:应用层包括用于支撑该物联网的接入平台和应用服务两部分。该层的主要功能就是提供大量传感设备安全接入,通过分析网络层接收的大量数据,得出有用的数据为用户提供应用服务。

MQTT协议及其特点

客户端功能:

①发布其他客户端可能会订阅的信息。

②订阅其他客户端发布的消息。

③退订或删除应用程序的消息。

④断开与服务器连接。

服务器功能:

①接受来自客户的网络连接。

②接受客户发布的应用信息。

③处理来自客户端的订阅和退订请求。

④向订阅的客户转发应用程序消息。

MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与设备之间消息的转发。

MQTT在协议设计时就考虑到不同设备的计算性能的差异,所以所有的协议都是采用二进制格式编解码,并且编解码格式都非常易于开发和实现。最小的数据包只有2个字节,对于低功耗低速网络也有很好的适应性。

MQTT有非常完善的QOS机制,根据业务场景可以选择最多一次、至少一次、刚好一次三种消息送达模式。运行在TCP协议之上,同时支持TLS(TCP+SSL)协议,并且由于所有数据通信都经过云端,安全性得到了较好地保障。

因此MQTT适用在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。

第十二章

EMC

电磁兼容性是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的能力。因此EMC包括两个方面的要求:

一方面是指设备在正常运行过程中对所在环境产生的电磁干扰不能超过一定的限值;

另一方面是指设备对所在环境中存在的电磁干扰具有一定程度的抗扰度,即电磁敏感性。

低功耗系统设计方法
  • 编译低功耗优化技术;

  • 硬件软件化;

  • 采用事件驱动方式,减少处理器的工作时间;

  • 采用快速算法;

  • 通信系统中提高通信的波特率;

  • 数据采集系统中使用合适的采样速率。

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值