ARM架构简明教程

前言。

根据韦东山老师视频教程编写。


1、ARM架构

1.1、RISC

ARM芯片属于精简指令集计算机,它所使用的指令比较简单,有如下特点:
①、对内存只有读写操作
②、对于数据的运算是在CPU内部实现
③、使用RISC指令的CPU复杂度小一点,易于设计。
在这里插入图片描述
对上面的图示的乘法运算a = a * b,在RISC中要使用四条汇编指令:
①、读内存a
②、读内存b
③、计算a*b
④、将结果写入内存

1.2、提出问题

在CPU内部,用什么来保存a、b、a*b?

1.3、CPU内部寄存器

在这里插入图片描述

无论是cortex-M3/M4,还是cortex-A7,CPU内部都有R0、R1、…、R15寄存器;它们都可以用来“暂存”数据。
在这里插入图片描述
通用寄存器(R0-R12):用于调用指令进行数据操作。
对于R13、R14、R15,还另有用途:
R13:别名SP (Stack Pointer),栈寄存器,用于实现堆栈指针操作,实现数据的先进后出。
R14:别名LR(Link Register),连接寄存器,用来在调用子程序时保存返回地址。
R15:别名PC(Program Counter),程序计数寄存器,用于存下一条执行的指令的地址。

1.4、汇编指令

①、读内存:Load

LDR R0,[R1,#4];读地址“R1+4”,得到的4字节数据存入R0

②、写内存:Store

STR R0,[R1,#4];把R0的4字节数据写入地址“R1+4”

③、加减

ADD R0,R1,R2 ; R0=R1+R2;
ADD R0,#1 ;R0=R0+1;
SUB R0,R1,R2 ;R0=R1-R2;
SUB R0,R0,#1;R0=R0-1

④、比较

CMP R0,R1;结果保存到PSR(程序状态寄存器)

⑤、跳转

B main ;Branch,直接跳转。
BL main;Branch and Link,先把返回地址保存在LR寄存器里再跳转。

1.5stm32存储器映像

类型起始地址存储器用途
ROM0x0800 0000程序存储器Flash存储C语言编译后的程序代码
0x1FFF F000系统存储器存储BootLoader,用于串口下载
0x1FFF F800选项字节存储一些独立于程序代码的配置参数
RAM0x2000 0000运行内存SRAM存储运行过程中的临时变量
0x4000 0000外设寄存器存储各个外设的配置参数
0xE000 0000内核外设寄存器存储内核各个外设的配置参数

2、变量

2.1、什么是变量

变量能读能写,故保存在内存中。因为内存具有较大的存储容量和较高的读写速度,可以方便的存储和读写程序中的数据,相比之下,寄存器容量较小,且个数有限,仅能存储少量数据。所以,程序中的变量通常会先储存在内存中,然后被操作时暂存到寄存器中进行,以提高程序的运行效率.
而Flash中存储的是程序代码和常量数据,不适合存储变量数据,Flash虽然可读可写,但对其进行写操作十分复杂。

2.2、全局变量与局部变量

全局变量:在函数外部定义的变量称为全局变量,它的作用域是从定义它的位置开始,到文件结束为止。全局变量可以被整个程序访问,因此它的生命周期也很长,直到程序结束才会被销毁。全局变量的值可以在程序的任何地方修改,因此需要谨慎使用,避免造成不必要的错误。

局部变量:在函数内部定义的变量称为局部变量,它的作用域仅限于定义它的函数内部。每次函数被调用时,局部变量都会被重新初始化,函数执行完毕后,局部变量的值就会被销毁。局部变量的作用域只在函数内部,因此可以避免变量名冲突和不必要的全局变量。

2.3、static和volatile

①、static关键字

对局部变量使用static:在函数内部使用static修饰的变量称为静态局部变量,该变量只会被初始化一次,不会随着函数的退出而销毁,仍然会保持其值,下次函数被调用时,该变量的值不会被重置。静态局部变量的作用域只在函数内部,不会影响其他函数。

对全局变量使用static:在函数外部使用static修饰的变量称为静态全局变量,该变量只能被本文件中的函数访问,其他文件无法访问该变量。静态全局变量的作用域只在本文件内部,不会影响其他文件。

对函数使用static:在函数外部使用static修饰的函数称为静态函数,该函数只能被本文件中的其他函数调用,其他文件无法调用该函数。静态函数的作用域只在本文件内部,不会影响其他文件。

②、volatile关键字

volatile关键字用于告诉编译器在编译过程中不要对该变量进行优化,确保每次访问该变量时都从内存中读取数据或者将数据写入内存中,避免编译器对变量进行优化,导致变量的值不符合预期。

在多线程或者中断处理程序中,当一个变量被多个线程或者中断处理程序共享时,为了保证数据的一致性,需要使用volatile关键字。因为多个线程或者中断可能会同时访问该变量,如果不使用volatile关键字,编译器可能会对变量进行优化,导致数据的不一致性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值