ARM体系结构及接口技术

【1】ARM体系结构及接口技术---课程的安排(8.5天)

1. ARM体系结构---》 理论 (2.5天)
    1> ARM相关的概念  --->  1天
    2> ARM的汇编指令集  ---> 1.5天
​
2. 接口技术  ---> 各种硬件的驱动实验 (6天)
    1> LED灯实验(点灯大法)   汇编  /  C语言
            A7核点灯      M4核点灯
​
    2> uart串口实验(PC通信)
            A7核uart      M4核uart
    
    3. PWM实验 (蜂鸣器/风扇/马达)
            A7核pwm      M4核pwm
    
    4. 按键中断实验(按键/人体红外传感器/火焰传感器/光电开关传感器/定时器)
            A7核中断     M4核中断
    
    5. IIC实验(温湿度传感器/环境光和接近传感器/血氧饱和度和脉搏传感器)
    
    6. SPI实验(数码管)
        
    综合练习:
3. stm32mp157a   ---> 异构核   
    cortex-A7*2  ---> 运行linux系统
        u-boot版本---》 2021.07   /  2021.10
        linux内核版本 ---》5.10.10  / 5.10.61 ---> 设备树
    cortex-M4    ---> 运行实时的程序
    
    
    exynos4412  /  s5p6818

【2】课程的需要具备的能力

1. 具备C语言的编写能力

【3】课堂要求

1. 课上一定要认真,不要走神
2. 及时完成课上的作业
3. 有问题及时提问
4. 一定要写代码

【4】ARM课程的目标

1. 能够看懂简单的汇编代码
2. 具备分析电路图的能力(电路图的工作原理) ---->  硬件电路设计工程师
3. 具备分析芯片手册的能力 (抓住手册的重点)
4. 核心:掌握软件编程控制硬件的思想

【5】为什么要设计ARM体系结构及接口技术的课程

1. 为后续linux驱动的学习打基础
    linux驱动是基于linux内核提供的接口实现硬件驱动的开发
        linux驱动:linux内核驱动的接口函数 / 驱动的框架 / 
                各种子系统 gpio  iic  spi  playform / 
                设备树。
2. 可以从事STM32相关的单片机的开发  ---》 简单的物联网设备的开发
    C语言 --> 数据结构 --> 一定的硬件基础--> 单片机的开发

【6】ARM的相关概念

1. ARM汇编指令 --> 编译器将指令编程生成一条机器码,存在代码段的空间,
                指向指令完成某个特定的功能。
                每条汇编指令最终都对应着芯片上的某个特殊的电路图,
                当指向指令值,就是让电路图工作。
                
                eg: add 加法指令 ----> 加法器(与或非门电路组成)
                
                
2. ARM指令集 ---> 会多条汇编指令的集合
​
3. ARM架构 ---> 根据arm指令的集的不同,给ARM指令不同的版本号的命名
    ARM-v1  - ARM-v6架构   ---> 已经淘汰
    ARM-v7架构  ---> 32位架构,支持arm32位的汇编指令集
    ARM-v8架构  ---> 64位架构,支持arm64位的汇编指令集,向下兼容arm-v7架构
    ARM-v9架构  ---> 2021年年初发布的ARM架构, 64位架构
    
4. ARM内核 --> ARM公司根据不同的ARM架构的版本号设计不同的性能的ARM内核
    架构          内核
    arm-v7      cortex-A7
    arm-v7      cortex-A9
    arm-v8      cortex-a53/a55/a72/a76/a78/x1
    
5. SOC  (System On Chip:片上系统)
    ARM公司不生产芯片,将ARM的内核IP授权给生成芯片的厂家(
        高通,联发科,海思,ST:意法半导体, NXP:恩智浦, 新塘科技, 展讯, 澎湃 )
        芯片厂家拿到ARM公司的授权之后,在ARM核的基础之上,
        添加很多个芯片外设资源,生产自己公司的芯片,这样的芯片统称为SOC.

 

MCU : 微控制单元(Microcontroller Unit)
    单片机  8051内核   cortex-M内核
MPU :  微处理器 (Microprocessor Unit)
    高端的处理器,可以运行操作系统,
        Cortex-A系列的内核   mips   powerPC
CPU : 中央处理器(central processing unit)
​
GPU : 图形处理器(graphics processing unit)
​
FPU :浮点运算单元 (Float Point Unit)
​
DSP :数字信号处理(Digital Signal Processing)
​
FPGA : 现场可编程逻辑门阵列(Field Programmable Gate Array)
ARM架构    携带ARM内核的处理器年销量在100亿以上
​
MIPS架构  --->  龙芯科技(mips架构买断)
​
RISC-V架构  ----> 开源的架构
​

【7】ARM公司的发展历史

1. 1978年,CPU公司 
    Cambridge processing Unit
2. 1979年    Acorn
3. 1985年, 32位,8MHz, 
   使用的精简指令集RISC
   芯片的名字ARM 
4. 1990年,转折点
   iphone 150万英镑 VLSI: 25万英镑
   ARM公司12工程师+技术专利:150万英镑
   ARM公司-》 Advanced RISC Machine
​
ARM公司不生产芯片,做技术的授权,
提供解决方案。芯片厂家拿到技术授权之后,
根据需求设计生产自己的SOC。
​
5. 2016年,日本软银收购
6. 2020年,英伟达(未收购成功) 

【8】RISC和CISC的区别

1. RISC: 精简指令集  Reduced Instruction Set Computing 
    一般接触到的处理器都是使用的精简指令集,8051,arm mips power risc-v
    
    精简指令集从复杂指令集中选取一些相对比较简单,
    并且使用频率较高的指令作为精简指令;
    精简指令的周期和指令的宽度固定。
    
    指令周期:执行一条指令需要几个时钟周期,大多数都是单周期指令。
            周期跟CPU的主频有关。 频率和周期成倒数关系。
        
    指令宽度:指令编译生成机器码,在代码段占用的代码段的空间固定。
                
                    使用交叉编译器编程程序,生成arm的可执行程序
    linux@ubuntu:~$ arm-linux-gnueabihf-gcc 1.c 
                    查看可执行文件的属性
    linux@ubuntu:~$ file a.out
                    使用反汇编的命令将elf文件转换为返汇编文件.dis
    linux@ubuntu:~$ arm-linux-gnueabihf-objdump -D a.out > a.dis
​
    
    000102bc <__libc_start_main@plt>:
    内存地址       机器码      反汇编代码
       102bc:   e28fc600    add ip, pc, #0, 12
       102c0:   e28cca10    add ip, ip, #16, 20 ; 0x10000
       102c4:   e5bcfd48    ldr pc, [ip, #3400]!    ; 0xd48
    
2. CISC: 复杂指令集  Complex Instruction Set Computer
    电脑的CPU使用的是复杂指令集  AMD intel
    复杂指令集更加注重指令的功能性,指令的运算能力,
    复杂指令集的指令的宽度不固定,指令的周期不固定。
    
    linux@ubuntu:~$ gcc 1.c
    linux@ubuntu:~$ file a.out 
    linux@ubuntu:~$ objdump -D a.out > a.dis
    
    0000000000001129 <main>:
    内存地址       机器码                 反汇编代码
        1129:   f3 0f 1e fa             endbr64 
        112d:   55                      push   %rbp
        112e:   48 89 e5                mov    %rsp,%rbp
        1131:   89 7d fc                mov    %edi,-0x4(%rbp)   
        1134:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
        1138:   b8 00 00 00 00          mov    $0x0,%eax
        113d:   5d                      pop    %rbp
        113e:   c3                      retq
        113f:   90                      nop

【9】ARM产品的分布

1. Cortex-A系列
    A系列更加注重处理器的功能性,主要运行linux系统
    --》 linux系统, Android系统, 鸿蒙OS

 

2. Cortex-M系列
    M系列主要针对的物联网市场,工业控制,低成本的电子产品。
    主要运行的是ARM的裸机程序。
        也可以运行实时的操作系统:ucos-II 阿里thingsOs FreeRTOS
                            lite-OS  RThread-OS

 

3. Cortex-R系列
    主要针对的是实时性的处理。

 

4. SecurCore系列
    针对于安全市场

 

5. Cortex-X1系列
    高性能的处理器上可以使用,支持芯片厂家对x1的核深度定制(魔改)。

【10】arm数据类型的约定

1> arm-V7架构的数据约定: 
    char          8bits 
    half word     16bits
    word          32bits 
    double word   64bits (arm-V7架构支持)
​
2> arm-V8架构的数据约定:
    char            8bits 
    half word       16bits
    word            32bits 
    double word     64bits 
    qual word       128bits (arm-V8架构支持)    

【11】arm-v7架构 和 arm-v8架构的区别

1.
    arm-v7架构是32位的架构,
    arm-v8架构是64位的架构,
2. 
    arm-v7架构汇编指令,一条指令占32bit(4字节)空间
    arm-v8架构汇编指令,一条指令占32bit(4字节)空间
3. 
    32位汇编指令,一次可以完成32位数据的运算,原因寄存器是32位的
    64位汇编指令,一次可以完成64位数据的运算,原因寄存器是64位的
        具体要看寄存器---》 后边讲解。
        
        eg: 
        add  r0, r1, r2  @ r0 = r1 + r2
        add  x0, x1, x2  @ x0 = x1 + x2

【12】ARM处理器的工作模式

1. cortex-A系列处理器的工作模式:

 

疑问:异常的处理过程? ---》 按键中断实验详细讲解。
​
总结:
    在特定的工作模式下执行特定的代码,完成特定的功能。
​
2. cortex-M系列处理器的工作模式:
   只有两种工作模式:
   线程模式: ----》 主程序(main函数)
   异常模式: ----》 打断主程序的执行,执行异常处理程序,
                此时工作在异常模式下
    比如:按键中断  定时器中断 串口中断 .....

【13】ARM寄存器组织,重要!重要!重要

1. ARM-v7架构的寄存器组织

关于寄存器组织的总结:
1> 每个小方块代表一个寄存器,一个寄存器可以存放32bits(4字节)的数据
2> 每种工作模式下,都有自己访问的寄存器
3> 寄存器背景色为白色的表示公有的寄存器,
    寄存器的背景色为深色表示私有的寄存器;
    如果某个工作模式下没有私有的则访问公有的寄存器,
    如果某个工作模式下有私有的寄存器,则不可以访问公有的寄存器。
4> 寄存器的空间有限,个数有限,寄存器是没有地址的。
    对于寄存器的访问是通过编号进行访问的,R0-R15,cpsr,spsr.

2. ARM-v8架构的寄存器组织

【14】特殊的寄存器详解

1. R13 --别名--> sp : the Stack Pointer 
        栈指针寄存器,栈指针寄存器指向的是栈空间,
        及栈指针寄存器中存放的栈空间的某个地址。

2. R14 --别名--> lr :  the Linking Register 
    链接寄存器,保存的是返回地址

 

 

3. R15  --别名--> PC : the Program Counter 
        程序计数寄存器,保存的是当前取址指令的地址。

 

4. cpsr :  currented program statued register
        当前程序状态寄存器, 存储当前程序的状态,比如,工作模式
​
5. spsr :  saveed program statued register
        保存程序状态寄存器, 用于对cpsr进行备份

【14】cpsr寄存器详解

 

​N[31] : 指令的执行结果为负数,N位被自动置1,否则为0. 
Z[30] : 指令的执行结果为零,Z位被自动置1,否则为0.
​
C[29] : 
    加法:产生进位,C位被自动置1,否则为0.
        进位:低32位向高32位进位。
    减法:产生借位,C位被自动清0,否则为1.
        借位:低32位向高32位借位。
V[28] : 符号位发送变化,V位被自动置1,否则为0.
​
I[7] : IRQ中断屏蔽位
    I = 1 : 屏蔽IRQ中断
    I = 0 : 不屏蔽IRQ中断
F[6] : FIQ中断屏蔽位
    F = 1 : 屏蔽FIQ中断
    F = 0 : 不屏蔽FIQ中断
T[5] : 状态位 
    T = 0 : ARM状态, 执行ARM汇编指令集
    T = 1 : Thumb状态, 执行Thumb指令集
    
    ARM指令集,一条指令占32位空间,
    Thumb指令集,一条指令占16位空间。
    
    Cortex-M内核使用的都是Thumb指令集。
M[4:0] : 模式位
    10000 User mode;    
    10001 FIQ mode;         
    10011 SVC mode;
    10111 Abort mode;  
    11011 Undef mode;  
    11111 System mode;     
    10110 Monitor mode;   
    10010 IRQ mode;
    其他保留

【15】指令流水线

指令流水线重点掌握三级流水线即可。
​
取指器 : 根据PC寄存器中的值,从代码段进行读取指令的机器码
译码器 : 翻译指令的功能,给到对应的执行器
执行器 : 执行指令,并将指令的执行结果写回到寄存器中。
    以上三个器件都是单周期的器件,工作互不干扰。
​
    指令1 指令2 指令3 指令4 指令5 指令6
1T  取指
2T  译码  取指
3T  执行  译码  取指
4T       执行  译码  取指
5T             执行  译码  取指
6T                  执行  译码  取指
7T                        执行  译码  取指
8T                             执行  译码  取指
​
    指令的周期 = 8 / 6 = 1
    
    以上指令的执行是理想的执行顺序,实际上会被异常或者
    函数的调用打断理想的指令的流水线。
​
    学习汇编指令从宏观上理解汇编指令执行完之后的功能即可,
    不需要从微观上理解每条汇编指令内部又是如果完成的。

【16】windows开发环境的搭建

1. 安装Keil 5软件
    安装--->破解-->创建工程
    
    破解需要使用破解软件:关闭杀毒软件,windows自动的杀毒

2. 安装secureCRT串口工具

 

3. 安装pdf工具
    不建议使用:网页打开pdf文件 , wps
    
    推荐使用:福昕阅读器, SumatraPDF-3.1.2-64-install.exe

【17】ubuntu开发环境的搭建

安装交叉编译工具链

交叉开发:PC端编写代码,PC端交叉编译代码,目标板运行代码
​
本地开发:PC端编写代码,PC端编译代码,PC端运行代码
安装交叉编译器的步骤:
1. 在ubuntu的家目录下创建toolchain目录 
    cd ~ 
    mkdir toolchain
    cd toolchain
    
2. 拷贝交叉编译工具链的压缩包到toolchain目录下
    cp  ***/gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz 
        ~/toolchain
​
3. 对交叉编译工具链的压缩包进行解压缩
    tar -vxf gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf.tar.xz
    会得到一个gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf名字的文件夹
    修改文件夹的名字:
    mv gcc-linaro-7.5.0-2019.12-i686_arm-linux-gnueabihf gcc-7.5.0
​
4. 在gcc-7.5.0/bin目录下的可执行程序就是各种交叉编译器
    ls  gcc-7.5.0/bin
​
5. 配置ubuntu系统的环境变量
    /etc/bash.bashrc    ---> 对所有的用户有效
    /etc/profile        ---> 对所有的用户有效
    /etc/environment    ---> 对所有的用户有效 
    ~/.bashrc           ---> 对当前的用户有效
    
    我比较喜欢修改/etc/bash.bashrc
    
    打开sudo vi /etc/bash.bashrc,在这个文件的最后一行添加以下内容:
    export PATH=$PATH:/home/linux/toolchain/gcc-7.5.0/bin
                      修改位自己的路径,注:家目录不要使用~
​
6. 使环境变量立即生效
    重启系统 
    source   /etc/bash.bashrc
​
7. 测试交叉编译工具链是否安装成功
    arm-linux-gnueabihf-gcc  -v  
    
    arm-l  --> tab
    如果出现以下信息表示安装成功:
    gcc version 7.5.0 (Linaro GCC 7.5-2019.12) 
    
8. 如果不成功,安装以下32位兼容库 
    sudo apt-get install lib32z1
​
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值