嵌入式硬件的学习----ARM

目录

ARM

ARM体系结构

精简指令集架构cpu

CISC&RISC

☆ARM寄存器

通用寄存器

R0-R12

PC寄存器(R15)

lr寄存器(R14)

SP寄存器(R13)

ALU寄存器

CPSR寄存器

SPSR寄存器

MMU(不是寄存器)

Cache高速数据缓存(哈佛架构)

icache

dcache

冯诺依曼架构&哈佛架构

单总线

双总线

AHB总线

APB总线

交叉编译

flash(ROM闪存)

[☆nor flash](#☆nor flash)

[☆nand flash](#☆nand flash)

memory(RAM内存)

三级存储结构

存储器的层次结构

计算机的组成

处理器的工作模式(很重要)

程序状态寄存器

☆异常处理流程

汇编语言

mov指令

add指令

sub指令

ldr指令

str指令

bic指令

orr指令

b跳转指令

[☆b & bl & bx](#☆b & bl & bx)

mvn指令

mrs指令

msr指令

☆立即数的判断

练习

1.两数相加

2.三个数找出最大值

3.用b指令进行两数找出最大值

4.用b指令三个数找出最大值

[5.用b指令1-100求和 和 do while](#5.用b指令1-100求和 和 do while)

[6.用b指令1-100求和 while](#6.用b指令1-100求和 while)

7.函数调用

☆栈的分类

ARM内核中使用的是满减栈

☆汇编调用c语言传参时:

模式的切换(从SVC转换到user模式)


ARM

ARM体系结构

精简指令集架构cpu

cpu内核:CISC、RISC

CISC&RISC

CISC:复杂指令集合计算机

  • 芯片面积大,加工成本高,复杂,体积大,功耗大,28效益(80%情况下用到20%功能)

RISC:精简指令集合计算机

  • 芯片面积小,加工成本低,体积小,功耗小(便携式设备)

ARM设计内核,半导体厂商生产芯片

☆ARM寄存器

通用寄存器
R0-R12

存放数据,没有地址

PC寄存器(R15)

程序计数器,本质是一个指针,指向当前代码正在执行的指令的下一条指令

lr寄存器(R14)

链接寄存器,保存函数的1个返回地址

SP寄存器(R13)

栈指针寄存器,用来管理栈区,指向栈顶

ALU寄存器

算术逻辑单元

CPSR寄存器

当前程序寄存器,保存程序运行到某一步的状态

SPSR寄存器

备份、保存程序状态,保存当异常发生时,CPSR程序中的一些状态

MMU(不是寄存器)

内存管理单元,虚拟内存,用于管理虚拟内存到物理内存的映射,从而提高物理内存的利用率

注:裸机必须关闭MMU;衡量一款芯片是否适合跑Linux(驱动)系统就是看这个芯片是否有MMU

Cache高速数据缓存(哈佛架构)

icache

指令缓存,存放指令

dcache

数据缓存,存放数据

冯诺依曼架构&哈佛架构

冯诺依曼架构:数据和指令存放到同一块内存空间

哈佛架构:数据和指令要单独存储

注意:裸机需要打开icache,关闭dcache

单总线

通过一根线/一组线与外设通信,和某个外设通信时,其他外设无法连接

双总线

AHB总线

先进高速总线(RAM,USB,网卡),接通信速率快的外设

APB总线

先进外设总线(GPIO,UART),接通信速率慢的外设

交叉编译

在一个平台上编写编译程序,能够在另一个平台运行程序

flash(ROM闪存)

☆nor flash

可以被寻址,每一个字节都可以被寻址

地址总线可以寻址

☆nand flash

无法被寻址,以固定块大小(512字节)写入或读取数据

memory(RAM内存)

三级存储结构

存储器的层次结构

计算机的组成

控制器、运算器、输入、输出、存储器

arm指令集:32bit

thumb指令集:16bit

处理器的工作模式(很重要)

程序状态寄存器

☆异常处理流程

汇编语言

mov指令

add指令

sub指令

ldr指令

1.向寄存器中加载一个非立即数

2.将RAM中的数据加载到寄存器中

str指令

将寄存器的数据写入指定的RAM中

bic指令

用于清0,将寄存器中的值某几位清0

orr指令

用于置1,将寄存器中的值某几位置1

b跳转指令

下面,这个指令相当于c语言中的while(1){}

☆b & bl & bx
  • b指令在函数调用时,不会把返回地址保存到 lr 寄存器中
  • bl指令在函数调用时,会把返回地址保存到 lr 寄存器中
  • bx指令在函数调用时,相当于mov pc,lr,bx跳转到lr寄存器对应返回地址

mvn指令

按位取反

mvn r0,#0 和mov r0,#0xFFFFFFFF 得到的结果是相同的

mrs指令

读取某个特殊寄存器的值到通用寄存器

msr指令

将某个通用寄存器的值写入某个特殊寄存器

☆立即数的判断

1、这个数在0-0xFF之间

2、把这个数字转换为二进制,这个数的最高位1到最低位1之间的二进制序列位数不能超过8位

3、这个数的二进制序列凑够8位之后的右边必须为偶数个0

练习

1.两数相加
2.三个数找出最大值
3.用b指令进行两数找出最大值
4.用b指令三个数找出最大值
5.用b指令1-100求和 和 do while
6.用b指令1-100求和 while
7.函数调用

☆栈的分类

  • 空增栈
  • 空减栈
  • 满增栈
  • 满减栈

增栈:入栈时,sp指针向上移动

减栈:入栈时,ap指针向下移动

空栈:先写数据,再挪动指针

满栈:先挪动指针,再写数据

满减栈: *--sp,先让sp--,再写数据

调用之前要进行入栈保护

ARM内核中使用的是满减栈

☆汇编调用c语言传参时:

  • 如果传的参数<=4个,可以通过通用寄存器r0-r3来进行传参
  • 如果传的参数>4个,必须通过栈来进行传参,保护现场(入栈保护)、恢复现场(出栈恢复)
  • c语言函数返回的结果保存到R0寄存器中

模式的切换(从SVC转换到user模式)

  1. 将cpsr寄存器中的值读到通用寄存器中R0

  2. 将R0寄存器中低5位的值先清0 (bic)

  3. 将R0寄存器中的低5位置设置为:10000 (orr)

  4. 将R0寄存器中的值回写到CPSR寄存器

相关推荐
阿斌_bingyu7092 小时前
从入门到精通-系统深度的学习openclaw
学习
’长谷深风‘2 小时前
嵌入式ARM开发入门解析2
汇编·arm开发·arm指令集·立即数
了一梨3 小时前
[T113] 交叉编译 libmpv
linux·笔记·学习
意法半导体STM323 小时前
【官方原创】STM32CubeProgrammer与STM32 Bootloader连接全流程实战指南 LAT1631
开发语言·前端·javascript·stm32·单片机·嵌入式硬件
HalvmånEver3 小时前
Linux:基于 UDP Socket 的实战项目——UDP 群聊聊天室
linux·运维·网络·学习·udp·通信
qqssss121dfd3 小时前
STM32H750XBH6的ETH模块的TCP segmentation offload功能分析
stm32·嵌入式硬件·tcp/ip
unityのkiven3 小时前
Hello-Claw 第一章学习笔记
笔记·学习
是翔仔呐3 小时前
第2章 按键输入与消抖!掌握I/O口输入核心,实现单片机人机交互
c语言·单片机·嵌入式硬件·gitee