【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
?
|