驱动学习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}^

相关推荐
hopetomorrow27 分钟前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow28 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
/**书香门第*/1 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
美式小田1 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
猫爪笔记2 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
-一杯为品-2 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
风尚云网3 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
EterNity_TiMe_5 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
sanguine__5 小时前
java学习-集合
学习
lxlyhwl5 小时前
【STK学习】part2-星座-目标可见性与覆盖性分析
学习