【笔记】嵌入式系统概述

第一部分 嵌入式系统概述

一、计算机组成

1.嵌入式系统

以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。(通用计算机系统: PC, 服务器)

  • 嵌入式系统组成
    • 硬件:芯片(CPU+总线+外设控制器)、外围电路……
      STM32F407ZETx
    • 软件:
      • bootloader 引导程序

        • 作用:
          1. 引导其他系统软件运行
          2. 初始化必要的硬件
          3. 把系统软件(如:OS)引导到内存中运行
        • 在上电的时候,大多数硬件是不能正常工作的,并且CPU等少数硬件,只能在比较低的频率下工作。
      • OS: Operator System 操作系统

        OS是用来管理和分配(硬件)资源的系统软件.现代操作系统一个特征是:并发。 “多任务”所有任务的执行,都需要CPU,但是CPU的数量非常有限。

        • 调度:决定哪一个任务获取CPU的执行权。

          • 调度策略
            • 分时策略 -> 分时系统

              如:windows、塞班、ios、linux、unix、android、ubuntu、RedHat

            • 实时策略 -> 实时系统 RTOS: Real Time OS 实时系统

              每次取优先级最高的那个任务执行,直到这个任务技术、或者是它主动放弃CPU、或者有更高优先级的任务抢占它。

              如:uCos、freeRTOS、vxworks…(uCos,当优先级相同时,采取分时的方式执行任务)

        • 应用程序(包括文件系统)…

2.计算机系统

  • 冯·诺依曼结构(普林斯顿结构):采用二进制、计算机按照程序顺序执行程序(指令)->存储PC。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置。

  • 冯·诺依曼把计算机系统分为如下几个部分:

    • CPU(中央处理单元) = 算术逻辑单元(运算器) + 控制电路
    • 存储器 Memory:
      • ROM: Read Only Memory 只读存储器
      • RAM: Random Access Memory 随机访问存储器 “R/W”
    • 输入输出设备

=> 哈佛架构(Harvard Architecture)

  • 是一种将程序存储和数据存储分开的存储器结构。数据存储器与程序存储器采用不同的总线

  • C51,ARM9之后嵌入式系统芯片

3.各组件是如何通信的?

通信方式:通信双方(发送方,接收方)

  • 全双工:同一时刻一方既可以发送数据给对方,又可以从对方接收数据。
  • 半双工CPU-----M 数据:同一时刻一方只能发送数据给对方,或者是从对方接收数据。
  • 单工CPU---->M 地址:任意时刻,一方只能发送数据给对方,或者是从对方接收数据。

总线bus:计算机系统内部各组件之间是通过“总线”的来通信的。

总线的两个特点:

(1)多个部件可以同时从总线上接收相同的信息 -> 广播式

(2)任意时刻只能有一个设备向总线发送信息 -> 系统瓶颈

(总线协议规定发送规则)

总线按功能分:

(1)数据总线(DB): 双向,宽度差别8bits/16bits/32bits

(2)地址总线(AB): 单向,CPU发地址,宽度与寻址空间有关

(3)控制总线(CB): 命令和状态

按位置分:片内总线、系统总线、通信总线(I/O总线)

4.存储器的逻辑结构和操作 图双地址译码

如:存储器(内存),64*64字节存储矩阵:字节编码,需要12bits

5.CPU工作原理

  • CPU = ALU + Control Unit

  • Register(寄存器):CPU内部的存储区域,暂时存放参与运算的数据和运算结果

  • 寄存器:锁存器/触发器实现,只包含存储电路的时序逻辑电路。

6.指令流水线技术(略)

7.相关基本概念

  • 机器字长: 32 CPU一次能处理数据的位数,通常与CPU寄存器位数(总线位数)有关。字长越大,数的表示范围就大,精度也越高,处理速度也就越快。

unsigned int、long、float…… 与机器字长 有没有关系?

前者是软件上编译器相关的一个概念,机器字长是一个 CPU内部结构相关概念

  • bit:一个存储元件,寄存一位二进制代码

两个状态: 高电平 -> 逻辑 1 低电平 -> 逻辑 0

“D触发器,锁存器”

  • byte:存储元件,包含8bits

一般存储器都是以字节为单位寻址的,每个存储器的每个byte一个地址,字地址。

  • 基本数电知识

  • 芯片 = CPU + 总线 + 各硬件控制器
    STM32F407ZETx (芯片型号):采用内核是 ARM Cortex M4
    说明:

    • ARM :公司名,只设计CPU,不生产芯片 IP
    • ARM也是一个CPU型号的名字.

经典:

  • ARM7

  • ARM9 -> 三星的S3C2410, S3C2440 ARM920T

  • ARM10

  • ARM11 -> 三星的S3C6410,S3C6440

二、ARM Cortex M4体系结构

1.Cortex M4总线接口:哈佛架构,三套总线

  • Icode总线,用于访问代码空间的指令instruction, 32bits

访问的空间为: 0x0000 0000 ~ 0x1FFF FFFF (512M),每次取4字节,指令,只读

  • Dcode总线,用于访问代码空间的数据data, 32bits

访问的空间为: 0x0000 0000 ~ 0x1FFF FFFF(512M),非对齐的访问会被总线分割成几个对齐的访问。“4字节对齐”:地址必须为4倍数。

对齐是用空间换时间(4字节对齐,地址为4的倍数,故最后两位为0,后两位用于标注处理器的状态)

如果底层硬件(体系结构)规定是4字节对齐,相应的编译器也会考虑到对齐的问题,否则效率会变低。

  • System 总线,用于访问其他系统空间。如: 各硬件控制器,GPIO……

访问空间为 0x2000 0000 ~ 0xDFFF FFFF 和 0XE010 0000 ~ 0xFFFF FFFF,非对齐的访问会被总线分割成几个对齐的访问,I/O总线,用于访问芯片上的各外设寄存器的地址空间的,各种查手册吧……

2. Cortex M4工作状态(处理器状态)

ARM公司设计的CPU,可以支持两种指令集:

  • ARM指令集:32bits,功能比较强大,通用 学
  • Thumb指令集:
    • thumb 16bits, 功能也强大(Cortex M4只支持Thumb指令) 用
    • thumb-2 32bits,功能强大,增加了不少专用的DSP指令

如何实现混合写?取32bits,还是16bits译码呢?
处理器状态:CPU正在执行何种指令集。
ARM状态:CPU正在执行ARM指令集
Thumb状态:CPU正在执行thumb指令 <---- Cortem M4只支持Thumb指令
在一个状态寄存器中,专门有一个bit为用来表示处理器的状态(根据T标志位判断使用的是哪个指令)
T: 1 -> Thumb
0 -> ARM

3.Cortex M4寄存器

  • 通用寄存器: 没有特殊用途

    • R0~R7: 所有thumb thumb-2都可以访问 想用就用

    • R8~R12: 只有少量的thumb指令可以访问,thumb-2都可以访问

      why? 受bits位数的限制。

      thumb 16bits thumb-2 32bits

      例子:

      MOV R0,#1      ;R0=0x1
      MOV R1,#0x77  ;R1=0x77
      MOV R2,#1<<3  ;R2=0x8
      MOV R3,#-1   ;R3=0xffffffff
      ADD R8,R0,R1  ;R8=0x78
      SUB R8,R0,R1  ;R8=0xffffff8a
      SUB R8,R1,R0  ;R8=0x76
      
  • 专门寄存器:有专门的用途(R13 R14 R15 xPSR)

    • R13(SP):Stack Pointer 保存堆栈的栈顶地址。

      “堆栈(Stack)是什么?” 是用“栈的思想”来管理的一段内存。

      ​ “栈的思想”:先进后出

      为什么需要“堆栈”?为了支持过程调用(函数)。

      ​ “现场保护”

      ​ 函数的具体功能的代码 局部变量

      ​ “现场恢复”

    • 思考:

      • 有时候,在C语言完成一个功能,我们可以定义一个宏,也可以定义成一个函数,都可以。请问宏与函数有什么区别?

        函数有额外的开销(现场保护、现场恢复),宏没有

      • 有一些功能或指令比较少的函数了,声明inline

        inline: 建议编译器,如果可以,把它修饰的函数展开

所有支持过程调用的语言,都需要用到栈。
Cortex M4有两个堆栈,双堆栈

  • MSP 主堆栈指针

  • PSP 进程堆栈指针
    为什么需要双堆栈呢?

    为了支持操作系统。把操作系统用的堆栈和用户进程用的堆栈分开。

  • R14(LR): Linked Register 链接寄存器

    在执行过程调用的指令的时候,我们需要保存该指令的下一条指针的地址,因为这个地址,就是需要返回的地址。

    例子:

    MOV R0, #3
    MOV R1, #4
    BL sum    ;BL:把下一条指令的地址(如下的: (A))存放在LR中
       ;跳转是通过把:要跳到的那个地址,直接赋值给PC
       ;sum -> PC
    (A) ADD R0, R1, 
    
    sum:
    ADD R0,R0,R1
    MOV PC, LR   ;-> return 函数返回,过程返回。
    
    • R15(PC): Program Counter 程序计数器。 保存下一条要执行的指令的地址。

      PC会在取指后,会自动增加指令所占的bits位数。

      在ARM Cortex M4, PC + 4

    在有“指令流水线”情况下,PC的值会有所不同

    • xPSR: Program Status Register程序状态寄存器。

    程序状态寄存器:保存程序运行过程中的一些状态,这些要保存的状态

    分为三类:

    • 应用状态寄存器 APSR: 计算结果的标志(N Z C V Q)

      • N: 负数标志(Negtive)

      • Z: 零标志(Zero)

      • C: 借位或进位标志(Carry)

      进位: 在做加法运算时,产生了进位。则C == 1,否则 C == 0

      借位: 在做减法运算时,没产生借位。则C == 1,否则 C == 0

      MOV R0,#1   ;0 0 0 0
      MOV R1,#-1   ;0 0 0 0
      ADDS R2,R0,R1  ;0 1 1 0
      SUBS R3,R0,R1  ;0 0 0 0
      SUBS R4,R1,R0  ;1 0 1 0
      

      作业:以下指令执行后对应的标志位数值

      • V: 溢出标志(Overflow)

        结论:V = Cn 异或 Cn-1

        ​ Cn表示最高位的进位(或借位)标志

        ​ Cn-1表示次高位的进位(或借位)标志

      • Q: 饱和标志

        饱和计算: 通过将数据强制置为最大(或最小)允许值,减小了数据畸变,当然畸变仍然存在,不过若数据没有超过最大允许范围太多,就不会有太大的问题。

        例子: 0111111111…11 => 0X7FFF FFFF

        ​ 1000000000…00 => - (2^31)

        QADD 将两上有符号的32bits相加后,进行饱和操作

        MOV R0, #0x7FFFFFFF
        MOV R1, #1
        ADD R2, R0, R1
        QADD R3, R0,R1
        
    • 中断状态寄存器 IPSR: 中断的编号 Exception Number 8bits

      • ICI : Interruptible-Continuable Instrument 可中断-可继续指令位

        如果执行LDM/STM操作(对内存进行批量拷贝)时,数据没有操作完时,产生一个中断,中断的优先级很高,必须要打断这条指令的执行,这种情况,就需要记录被打断的寄存器的编号,在中断响应之后,处理器返回由该位指向的寄存器,并恢复操作,继续执行拷贝。

    • 执行状态寄存器 EPSR: 执行状态,如: Thumb/ARM

      • T : xPSR[24]

        表示处理器当前执行的状态。(工作状态/处理器状态)
        ARM状态 xPSR.T == 0
        Thumb状态 xPST.T == 1

      • IT IF-THEN

        IF-THEN 位,它们是if-then指令的执行状态位(最多4条)

      • 中断屏蔽寄存器 P41(中断、异常)

        • PRIMASK[0] 片上外设的总中断开关

          1 屏蔽所有的片上外设中断

          0 响应所有外设的中断

        • FAULTMASK[0] 系统错误异常的中断总开关

          1 屏蔽所有异常

          0 响应所有异常

        • BASEPRI 为使中断屏蔽更加灵活,该寄存器根据中断优先级来屏蔽中断或异常。

          当被设置为一个非0的数值时,它就会屏蔽所有相同或更低优先级的异常(包括中断),则更高优先级的中断或异常还会被响应

          每一个异常或中断,都会有一个优先级。

    • CONTROL寄存器

      用来控制选择哪个堆栈(主堆栈/进程堆栈),选择线程模式的访问等级(特权等级/非特权等级)

      特权等级可以访问所有;非特权等级只能有限访问

      • CONTROL[0] : 线程模式的访问等级

        1 非特权等级

        0 特权等级

      • CONTROL[1] : 堆栈的选择

        1 进程堆栈 PSP

        0 主堆栈 MSP

4.Cortex M4工作模式

“模式”: 不同环境,不同的角色

ARM cortex M4有两种工作模式:

  • Thread Mode:线程模式
  • Handler Mode:处理模式(异常中断模式)

异常/中断 是什么? 打断CPU指令执行顺序的事件,称为中断。

为什么要支持两种模式呢? 为什么不只用一种模式呢? Thread Mode
如果只用一种模式,thread mode,为了响应一些外部事件(比如说,用户是否按下某个按键?):
轮询:轮流询问。 通过轮询,CPU也可能 响应外部事件,但是轮询天生就有缺陷
(1) 浪费CPU
(2)占用总线, Bus is always busy.
(3)轮询有一个时间差,轮询的时间间隔。不及时!!!

在CPU内部设计一个 “中断模式”:为了提高效率和响应速度。
两种模式之间是怎么切换的呢? 重要。如图thread_Mode与Handler_Mode之间的切换

Handler Mode :
中断模式,当一些比较重要的事件,产生时,CPU中止正在做的事情,切换到Handler Mode下去执行,此时 “特权等级”,中断处理完成后,再返回到断点处,继续Thread Mode运行。

Thread Mode:
线程模式,
特权等级 : 可以跑一些如OS的代码
非特权等级: 可以跑一些如 "用户态"的代码
特权等级 -> 非特权等级
但是:非特权等级不可以切换到特权事件,除非产生“中断”

第一部分 嵌入式系统概述
第二部分 ARM指令系统
第三部分 通用 I/O (GPIO)
第四部分 中断机制
第五部分 时钟定时器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值