历史上的今天
今天是:2025年01月21日(星期二)
2020年01月21日 | arm系列知识框架
2020-01-21 来源:eefocus
【ARM编程模型】
硬件: 电路原理图
软件: 体系结构, 指令集, 寄存器组
【ARM编程技术】
汇编/C语言 编译, 链接, 烧写和调试
windows: MDK
linux : gcc
【ARM接口编程】
电路原理图
datasheet ------> 裸机程序(不带操作系统,直接操作硬件)
中断技术
初始化程序
【 ARM基础知识】
1. 冯·诺依曼结构特点:
采用二进制表示数据和程序
事先存储程序
利用控制流来驱动程序
五大部件
2. CPU = CU + ALU
CPU: 解释并执行指令的功能部件
CU: 译码并发出各种控制信号
ALU: 运算
3. 常见存储器
RAM: (掉电丢失数据)
SRAM: 静态 96KB
DRAM: 动态(SDRAM, DDRII(256MB))
ROM: (掉电不丢失数据)
PROM
EPROM
E2PROM
BIOS
flash:
norflash : 2MB 有地址线, 片上执行(CPU可以直接访问), 读数据速度快, 存储启动程序
nandflash: 256MB 无地址线, 不片上执行, 存储大数据量数据
【ARM体系结构】
1. ARM : advanced RISC machine
含义:
公司
技术
微处理器
2.编程模型
1)数据和指令类型:
ARM处理器支持: 8bit, 16bit, 32bit数据
Thumb指令集, ARM指令集
半字对齐: 被2整除 [0]=0
字对齐 : 被4整除 [1:0]=00
例子:
运行地址 机器码 机器码符号化
0x00000000 E3A00001 MOV R0,#0x00000001
2)处理器工作模式
ARM处理器一般支持 7 种基本工作模式
不同的工作模式对应着不同的寄存器
特殊寄存器: R13(SP), R14(LR), R15(PC), CPSR, SPSR
程序指针PC (r15): 程序执行到哪里(地址), PC指针指到哪里(地址)
3. 异常处理过程
产生:(硬件过程)
1. CPSR ---> SPSR_mode
2. 设置CPSR
CPSR[5] = 0 处理器处于ARM状态
CPSR[4:0]=mode 异常工作模式
CPSR[7:6]=11 根据实际情况
3. 返回地址--->LR_mode
4. PC ---> 异常向量表入口地址
5. 保护现场(堆栈)
退出:(软件过程)
1. SPSR_mode ---> CPSR
2. LR_mode----> PC
3. 恢复现场(堆栈)
注意: 异常产生,退出时,ARM处理器必须处于ARM工作状态
【指令集】
1. RISC: 精简指令集系统
特点:
机器码是固定长度
指令规整简单
单周期执行, 容易流水线机制
大量寄存器
访问存储设备: 加载,存储, 交换
2. ARM指令格式
操作码 + 目标寄存器 + OP1 + OP2....
|---助记符
|---条件码
3. 第二操作数寻址方式
立即数寻址: mov r1, #1
寄存器寻址: mov r0, r1
移位寻址 : mov r0, r1, lsl #2
寄存器间接: ldr r0, [r1]
基址寻址 : ldr r0, [r1, #2]
多寄存器 : ldmia r0!, {r0-r7}
堆栈寻址 : stmfd sp!, {r0-r12, lr}
相对寻址 : b label
【系统设计】
1. SOC概念:
system on chip
ARM芯片 = ARM内核 + 片内存储器 + 片内各种电路
S5PC100 cortex-A8 SRAM... 各种控制器
2. 指令流水线
在编译器中, 黄色箭头指向的地址 = 执行PC = R15(PC)
ARM态:
PC值 = 当前执行指令PC + 8
(取指PC)
Thumb态:
PC值 = 当前执行指令PC + 4
(取指PC)
例如:
add pc, pc, #4 ; PC = PC + 4
; R15 = 取指PC + 4
3. ARM920T = ARM9TDMI + I/D cache + MMU + cp14 + cp15
【ARM指令集】
1. 条件执行及标志位
cmp: 功能相当于减法运算,不保存结果, 但影响标志位
条件码: 16条, AL
2. 分支指令
B : 相当于C语言goto label, 不带返回地址
BL: 相当于C语言函数调用, 处理器自动保存下一条指令的返回地址 ---> LR
跳转范围 = 偏移量(机器码低24位) * 4 + 当前PC值(取指PC)
= 0x1 * 4 + (0x8+8)
= 0x14
例子:
0x00000008 EB000001 BL 0x00000014
长跳转:
ldr pc, =label
注意: B,BL指令是位置无关指令
3. 数据处理指令
注意: 上述指令只能对寄存器操作,不能针对存储器
ADD SUB AND EOR ORR
CMN CMP TST TEQ BIC
4. 桶型移位器
逻辑移位: lsl lsr
算术移位: asr
循环移位: ror 左移 = 32 - 右移
5. 立即数
第二个操作数有12位:
低8位: 常数
高4位: 移位次数---> 循环右移 * 2
如何判断常数是否是合法立即数?
1. 利用编译器
例如:
0x00000004 E3A014FF MOV R1,#0xFF000000
低8位: 0xff
高4位: 4 * 2 = 8(循环右移8位)
2. 规则
1. 找出8位常数
第一个"1"和最后一个"1", 最短距离不能超出8位
2. 常数能否循环右移偶数位
6. 装载32 bit常数
伪指令: 不会生成一一对应的机器码
ldr r0, =const
const: 符合立即数 mov r0, #const
const: 不符合立即数 ldr r0, [pc, #offset]
7. 单寄存器数据传送
ldr: 读 源寄存器在后, 目标寄存器在前
str: 写 源寄存器在前, 目标寄存器在后
前索引: LDR r0,[r1,#8] 后索引: LDR, R0,[R1],#8
8. 块数据传送
ldm: 读 源寄存器在后, 目标寄存器在前
stm: 写 源寄存器在后, 目标寄存器在前
操作多寄存器访问:
1. 低编号的寄存器对应着低地址数据
2. 读取存储设备数据分别存放在寄存器参数列表中
3. 指针向上/下移动
9. 堆栈
1)堆栈指针移动方向:
向上: 写入数据(压栈), 指针递增
向下: 读取数据(出栈), 指针递减
2) 满堆栈: 堆栈指针指向最后入栈的有效数据的位置
空堆栈: 堆栈指针指向等待下一个入栈的数据的空位置
STMFD (压栈)
LDMFD (出栈)
注意: 运行C语言main函数之前,必须确保堆栈空间已经设置好了!!!
异常处理退出过程: 软件过程中
1. SPSR--->CPSR
2. LR --->PC
3. 恢复现场
例如:
保护现场: stmfd sp!, {r0-r12, lr}
恢复现场: ldmfd sp!, {r0-r12, pc}^
解释: 堆栈列表中, 如果有"PC"和"^"同时存在, 表示处理器自动将SPSR_mode ---> CPSR, LR_mode--->PC
10. SWP软交换
作用: 原子操作, 不可被外部因素打断.
唯一一条原子操作的访存指令
11. 软件中断 (SWI)
格式:
swi 软中断号
swi是一种用户自定义指令,当执行到swi指令时, 跳转到异常向量表0x8入口地址, 自动切换到SVC工作模式
12. PSR 传送指令
msr/mrs 设置CPSR/SPSR指令
【异常处理过程】
1、产生:(硬件过程)
1. CPSR ---> SPSR_mode
2. 设置CPSR
CPSR[5] = 0 处理器处于ARM状态
CPSR[4:0]=mode 异常工作模式
CPSR[7:6]=11 根据实际情况
3. 返回地址--->LR_mode
4. PC ---> 异常向量表入口地址
5. 保护现场(堆栈)
2、退出:(软件过程)
1. SPSR_mode ---> CPSR
2. LR_mode----> PC
3. 恢复现场(堆栈)
注意: 异常产生,退出时,ARM处理器必须处于ARM工作状态
【异常返回地址】
前提: 在异常产生的时候内核设置 LR_mode = PC - 4
【搭建linux下ARM开发环境】
1. 将arm-none-eabi-4.2.2.tgz拷贝到ubuntu /usr/local目录,然后解压
2. 将解压之后生成arm目录,改变权限
3. 将交叉开发工具链的路径: /usr/local/arm/4.2.2-eabi/usr/bin
添加到 /etc/environment
4. 更新工具链路径
source /etc/environment
arm_project工程有:
start.S uart.c serial.c
1. 将源文件编译生成 *.o文件 gcc
2. 将*.o文件链接生成*.elf文件 ld
3. 将*.elf文件转换生成*.bin文件 objcopy
4. 将*.elf文件反汇编生成*.dis文件 objdump
【系统时钟】
1. 各种不同的外围设置需要的工作频率:
CPU: 667MHZ
内存: 200MHZ
串口: 115200bps
...
...
2. 设置不同的外围设备需要的工作频率:
如何设置不同的工作频率?
12MHZ ---> 667MHZ工作频率 倍频
最高工作频率---> 各种不同的设备 分频
PLL锁相环
上一篇:ARM平台的虚拟化介绍
下一篇:【系统移植】uboot详细分析
史海拾趣
|
联通收了网通,大家感觉有没有变化,尤其是上网和固话那块 之前发生了个小事,好在比较及时的解决了 但是当时遇到时,觉得服务太差了,后来解决问题的速度和态度还算不错,大家有没有同样的感觉?… 查看全部问答> |
|
二月二十四号那天, 我心血来潮地去了一趟我签约的那家在重庆的国营企业,,想去看个究竟。 之前认识了一些比我高一届的师兄师姐们在那公司,经常在群里和他们聊天, 感觉到的气氛就是他们进入公司以后,心理落差比较大。 他们常常对我说, ...… 查看全部问答> |
|
在现代化的城市中,医疗救援系统是城市保障体系中的重要组成部分,120急救中心承担着医疗救援指挥中心的任务,完成急救、大型社会医疗保障及“110”联动等任务,对于保护人民群众的生命安全有着不可替代的作用。随着无线监控产品的日渐成熟,越 ...… 查看全部问答> |
|
输入捕获模式下:我现在TIM2_CH2,TIM2_CH3都是输入一个频率定期变化的PWM波。并且都可以用输入捕获方式(在中断服务程序中完成两次上升沿的捕捉,然后计算出频率),已经正确。现在有个问题,因为我的频率最高是10Hz的,因此周期为0.1ms=100us ...… 查看全部问答> |
|
要具备的能力: 1.linux基本原理和基础操作 2.C语言是基础。(指针,结构体是重点) 学习方法: 看代码——》编写驱动程序 养成好的编程习惯 思维方式的转变,把arm当成计算机来看(头脑中要用操作系统的概念)————》学习窍门 ...… 查看全部问答> |
|
请教高手们SPI烧录器问题怎么设置速度最快呢 Post By:2012-2-27 17:44:42 请教各位高手一个问题哈, 想做个一拖八的SPI FLASH 烧录器 ,目前市面上一拖8的烧录器,都是 先拷贝一个FLASH 4K 数据,然后接着拷贝另外一个FLASH 的4K数 ...… 查看全部问答> |




