驱动学习1、2

(eg:ARM 920t 这个cpu)
CPU中: ALU-运算器

R0寄存器 (一般有几十个,2440中R0~R12)

PC:程序计数器 指向正在执行的下下条指令。默认值为0,默认做自加操作。

LR:链接寄存器 (/链接返回寄存器)保存函数的返回地址

----LR栈的结构??----

空栈 --先压栈再移动指针 / 满栈 --先移动指针再压栈

指针指的都是空的地址 指针指的一直都是有内容的地址

+++我们使用的是 满减 的栈结构

SP:栈指针寄存器 指向栈顶

CPSR:当前程序状态寄存器 进借位、结果为负、结果为零、中断使能、大小端配置、工作模式

PSR:程序状态寄存器

SPSR:保存程序状态寄存器

Cache:缓存 I(指令) D(数据) --- 分别16KB

冯诺依曼 和 哈佛

数据跟指令存放在一起 数据和指令是分开的

Cache命中 : cache在内存先拿数据(对于重复的数据只读一次),

CPu在cache区读取数据的时候 读的速度比 CPU读取内存数据更快

MMU: 内存管理单元 虚拟地址到物理地址的切换

每次访问会先访问页表

===================================================================
SOC(片上系统 system on chip) S3C2440

CPU:中央处理单元

MCU: 微控制器

MPU:微处理器

SOC:片上系统

DSP:数字信号处理

FPGA:现场可编程门阵列

ARM处理器最新发展:

Cortex-A 消费类电子---低功耗

Cortex-R 实时性 --- 航空航天军工 汽车电子

Cortex-M 高性能 --- 偏控制 eg:STM32

ARM ---> CPU IP

编译器的过程;

半导体器件:

TTL : 高电平 > 2.4V 低电平 < 0.4V

钽电容 带标记的是正极 其他都是带标记的是负极

寄存器组织概要:

有 37 个寄存器 user中 16 + cpsr

指令和代码一般都是4字节对齐的

异常处理:

当异常产生时,先拷贝CPSR 到对应的工作模式下的SPSR中

设置适当的CPSR位:

改变处理器的状态进入ARM态

改变处理器模式进入相应的异常模式

设置中断禁止位禁止相应中断

保存返回地址到LR对应的MODE

设置PC为相应的异常向量

返回时,异常处理需要:

从SPSR------mode 恢复CPSR

从LR_mode恢复PC

Note:这些操作只能在ARM态执行。

处理器的七种工作模式

User :用户模式 //非特权模式,大部分任务执行在这种模式

FIQ:快中断模式 //当一个高优先级(fast)中断产生时将会进入这种模式

IRQ:中断模式 //当一个低优先级(normal)中断产生的时候将进入这个模式

Supervisor:SVC/管理模式 //当复位或软中断指令执行的时候将进入这种模式

Abort:中止模式 //当存取异常时进入这种模式

Undef: 未定义模式 //当执行未定义指令时会进入这种模式

System:系统模式 //使用和User模式相同寄存器集的特权模式

CPRC程序状态存储器中有条件位,中断禁止位,Mode位等重要的位存储

ARM汇编

指令集(版本):armV4

流水线:

三级流水线----->程序执行过程: 预取 译码 执行

最佳流水线:

1 2 3 4 5 6

预取 译码 执行

预取 译码 执行

预取 译码 执行

预取 译码 执行

。。。。。。

总线:地址总线/数据总线/控制总线.

<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

//凡是带大括号的都可以省略

ARM指令集分为六大类

数据处理指令:

RSB-----反向减法

BIC --- 位清零 在后面#设置为1的地方清0

eg: BIC r1, #0xF //把r1后四位清零

MVN --- 按位取反之后放进去

ADD ---相加

SUB ---相减

AND --- 按位与

ORR ---按位或

EOR --- 异或 相同为0 不同为1

MOV --- 赋值

ADC --- 用进借位的指令相加

(当进借位有值的时候会一起加) //注意CPSR位

eg:adc r5,r1,r3 //此时r1+r3 的结果会加上+C 放在r5

//若是adc 运算完不清C位 若是adcs 运算完会清掉C位

CMP ---- 比较

cmp r0,r1

//比较结果放在CPSR的位中

立即数

一个数字(或者按位取反后)或将其循环右移偶数位后所有的1能放在低8位中

bl 带链接返回的跳转

ldr sp, =0x40001000 //专门加载地址到一个寄存器

入栈指令: STMFD (push)

出栈指令: LDMFD (pop)

eg:

STMFD sp! {r4-r7,lr}

//! 会自动变更地址

函数使用的时候需要保护现场和恢复现场

C语言和汇编的混合编写:

import myadd //声明 使用外部函数 相当于extern

bl myadd //调用另外C中的函数

preserve 8 //8字节对齐的指令 在汇编头中写这个即可

函数传参规则:

函数传参的时候用的是r0~r3前四个寄存器--->分别对应传入函数的第一二三四位参数的值

超过4个的参数使用栈来进行传递

返回值:返回值存放在R0中

要想汇编的函数被其他文件调用需要 先用export 声明函数

栈中存储的数据有什么: 局部变量 函数的参数 函数的返回地址

^带模式的恢复现场

在恢复现场的时候在最后加上^

ldmfd sp!, {r4-r12,pc}^ 这个^就会恢复到之前存储这个数据的现场

获得swi #xxx 这个xxx的数字是多少的方法?

stmfd sp!,{r4-r12,lr}

sub r0,lr,#0x4

ldr r1,[r0] ;获取swi这个数字是多少

bic r0,r1,#(0xff<<24)

ldmfd sp!,{r4-r12,pc}^

相关推荐
dengqingrui1234 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
我的心永远是冰冰哒5 小时前
ad.concat()学习
学习
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
slomay6 小时前
关于对比学习(简单整理
经验分享·深度学习·学习·机器学习
hengzhepa7 小时前
ElasticSearch备考 -- Async search
大数据·学习·elasticsearch·搜索引擎·es
小小洋洋8 小时前
BLE MESH学习1-基于沁恒CH582学习
学习
Ace'9 小时前
每日一题&&学习笔记
笔记·学习
IM_DALLA9 小时前
【Verilog学习日常】—牛客网刷题—Verilog进阶挑战—VL25
学习·fpga开发·verilog学习
丶Darling.10 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
z樾12 小时前
Github界面学习
学习