ARM官网: www.arm.com
一:
什么是嵌入式:
嵌入式是为了完成某个特定功能,在软件和硬件上进行了裁剪,低成本,低功耗(电源管理模块,软件判断硬件是否使用),便携式(封装),实时性(中断)比较强,代码可固化(一般固化到Flash(rom)中),计算机系统。
二:什么是ARM:
1:是一个公司的名称
2:一种微处理器的架构
3:一种技术
三:ARM芯片的特性:
1:RISC精简指令集
2:低功耗,高性能,低成本
四:arm的版本
V1-V8
arm7---v4(lpc2114,2136,nxp2114,nxp2136)
arm9---v4
arm10---v5
arm11---v6
====================================
A---高端应用 =======V7A
cortex R---安全,实时 =======V7R
M3,M4---中端 =======V7M
M0---低端
cortex-A 以上的多核 =======V8
五:单片机,arm,x86(inter),mips,soc
单片机,arm,x86,mips指一种微处理器的架构,每一种架构指令集不一样
SOC;system on chip 是指集成了微处理器,及很多外设控制器的芯片
六:
存储系统
RAM(即平时说的2G内存)ROM(硬盘) SDRAM(程序运行会将数据拷贝到SDRAM中) FLASH(存放代码 属于ROM)
reg---cache---(IRAM-IROM)---sdram---Flash(nor,nand)
reg:寄存器,集成在cpu的控制单元里面,寄存器个数有限,arm--37,cortex-a,40
cache:高速缓存器,用来提供cpu访问主存的速度,通过把cpu经常用的数据或者指令放到cache里面来提供cpu到主存的访问速度
主存:主存储器,用来存放代码和数据,:内存
辅存:一般指硬盘或者光盘,sdcard
内存:
通电后,如果我要把"1010"这个信息保存在内存(现在画的"田"字)中,那么电子就会进入内存的储存空间里。"田"字的第一个空格你画一点东西表示电子,第二个空格不用画东西,第三个空格又画东西表示电子,第四个格不画东西。这样,"田"的第一格有电子,表示1,第二格没有,表示0,第三格有电子,表示1,第四格没有,表示0,内存就是这样把"1010"这个数据保存好了,
一旦内存失电,电子失去了电源的后续供给,就会露出它乱杂无章的本分,逃离出内存的空间去,所以,内存失电就不能保存数据了。
Flash芯片:
也是保存"1010"这个数据。电子进入了"田"的第一个空格,也就是芯片的储存空间。电子把里面的物质改变了性质,为了表示这个物质改变了性质,你可以把"田"内的第一个圆圈涂上颜色。由于数据"1010"的第二位数是0,所以Flash芯片的第二个空间没有电子,自然里面那个物质就不会改变了。第三位数是1,所以"田"的第三个空格通电,第四个不通电。
当Flash芯片断电后,物质的性质不会改变了,除非你通电擦除。
所谓Flash芯片就是最新型的,可进行可快速存储、擦除数据的ROM,一般用来存储固件(uboot+kernel+rootfs)
硬盘:
就是采用磁性物质记录信息的
磁盘
,
磁盘
上的磁性物质被磁化了就表示1,未被磁化就表示0,因为磁性在断电后不会丧失,所以磁盘断电后依然能保存数据
七:
nor flash与nand flash区别
nor flash:读快写慢,价格贵,容量小(1~16M),存放内核引导程序,具有三大总线(地址总线,数据总线,控制总线)
nand flash:写快读慢,价格便宜,容量大(32M~4G),存放内核和文件系统,只有控制总线,地址总线和数据总线是共用
八:
总线:
单总线:就是一条低速总线,这条低速总线上面挂了主存储器,各种IO外设---(APB)
多总线:三条总线
第一条:AHB,用来挂载速度要求比较高的存储设备
第二条:APB,用来挂载速度要求不高的,IO设备(外设)
第三条:DMA,DMA总线不需要CPU的干预,就
直接可以让外设与存储器通信
九:哈弗结构&冯诺依曼结构
哈弗结构:cpu是并行访问D-CACHE(数据缓存)和I-cache(指令缓存)
1、使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存
2、使用独立的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。
哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和储存的,执行时可以预先读取下一条指令,指令和数据的读取可以在同一周期进行(先访问I-cache再访问D-cache);
冯诺依曼:cpu是串行方法D-cache和I-cache
一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构
指令和数据的读取不能在同一周期进行;
十:与或非
& && | || ^
十一
工作模式:
上电进入管理(suv)模式,内核启动时刻所处的模式是系统模式(system),内核起来后进入用户模式(user)
在用户模式中遇到中断进入(irq 中断模式或fiq快中断)终止模式(Abort);未定义模式(Undefined)
Monitor:安全模式,(cortex-A 特有模式)
八种处理器模式
1:user模式(内核起来后,应用程序运行所处的模式)
2:svc模式(管理模式,这种模式是在cpu复位,或者swi中断的时候进入)
3:system模式:这种模式是在cpu管理模式下进入,就是内核启动时刻所处的模式
4:irq模式:普通中断模式(一般在user模式下进入)(外部中断和内部中断(定时器中断))
5:fiq模式,快速中断模式(一般在user模式下进入)
6:monitor模式:安全模式----cortex-a8以上cpu特有的模式,主要用于安全方面
7:abort模式,终止模式,程序执行过程中,去访问不存在的内存进入这种异常模式状态======取数据出错
8:undef模式,未定义模式,程序执行过程中,执行的指令cpu不能识别,进入这种异常模式=====取指令出错
用户模式:
应用程序不能够访问受操作系统保护的系统资源。
应用程序不能进行处理器模式的切换。
系统模式:
不属于异常模式,不是通过异常进入的。
系统模式属于特权模式,可以访问所有的系统资源,也可以直接进行模式的切换。
主要供操作系统使用。
管理模式:
系统复位后进入管理模式,运行系统初始化程序,如中断允许/禁止,完成各模式的堆栈设置主时钟设置,SDRAM配置等。
当执行
软件中断指令SWI时(比如开启一个新的进程),进入管理模式 。
异常模式:除用户模式和系统模式外的其他5种处理器模式
以各自的中断或异常方式进入,并且处理各自的中断或异常。
特权模式:除用户模式外的其他6种处理器模式
特权程序可以访问所有的系统资源,也可以任意的进行处理器模式的切换。
十二:各种模式的寄存器
r0~r7:1组,8种模式共用 8
r8~r12:2组,fiq模式私有一组(快中断寄存器速度快),其余7种模式共用一组 5*2
r13(sp): 7组 ,每种模式一个 7
r14(lr) : 7组, 7
r15(pc) : 1组, 1
cpsr : 1组, 1
spsr: 6组, 6
============================共有40个寄存器
但是,经典arm(arm7-arm11)只有37个寄存器
r13 别名: sp 堆栈指针
r14 别名: lr 连接寄存器,保存pc
spsr: 保存cpsr的值的寄存器,异常时保存
十三:同名寄存器的访问
就是要切换模式:
当前处在user模式 CPSR[4:0]==10000
此时发生irq中断,当要访问r13,要切换user模式到irq
msr cpsr,#0x12
十四:
异常向量处理
14.1 异常向量表:
向量名称 向量地址(偏移) 所处的模式 描述
复位reset, 0x00 svc(管理) 设备上电或者按复位键发生
未定义指令undef 0x04 undef未定义模式, cpu不能解析pc里面的指令
软件中断swi 0x08 svc模式 ,
发生系统调用的时候进入
预取指终止prefetch-abort 0x0c abort终止模式, cpu所取指令区域没有权限访问
数据终止data-abort 0x10 abort终止模式, cpu所取数据区域没有权限访问
保留 0x14
普通中断irq 0x18 irq模式, 一般慢速中断发生的时候进入
快速中断fiq 0x1c fiq模式, 一般非常重要的中断才使用
基地址:
0x0000 0000--
0xffff 0000--
cortex-a之后用户可以自己设置
14.2进入
中断时的异常处理
第一步:cpsr--->spsr_mode,因为8种模式只有一个cpsr,当异常发生时,要保存当前模式下的cpsr到要进入模式spsr里面
第二步:改变cpsr里面适当的位
1:切换到arm模式,由cpsr[T]==0决定
2:切换模式位,有cpsr[4:0]
3: 根据程序需要,是否改变cpsr[I],当cpsr[I]=1禁止irq中断,
cpsr[F],当cpsr[F]=1禁止fiq中断
禁止I,F位就不允许发生中断嵌套
第三步:保存要返回的地址到LR(r13链接寄存器),当异常程序执行完毕可以从lr里面读出要返回的地址
第四步:当异常发生时,要把异常向量地址给到pc,让cpu执行异常程序,pc = 异常向量地址
14.3 退出异常如何处理
第一步:spsr_mode--->cpsr,
第二步:lr_mode---->pc
十五:arm后缀名
T:表示支持thumb指令
D:表示支持debug片上调试
M:支持64位乘法指令
I:是支持嵌入式ice单元,可以获取cpu的状态(D和I一起调试CPU)
S:TDMI缩写
E:支持dsp指令
J:支持java指令
流水线:
流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率,从而成为微处理器设计中最为重要的技术之一。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。
LDR互锁
当LDR指令的下一条指令,使用了与LDR指令中的同名指令时发生
LDM互锁
因为要访问四个寄存器,会多占用四个E单元
寄存器: 临时存放数据的存储单元,32位的存储单元,临时存放alu运算的结构
只有在特权模式下才能操作协处理器
用户模式下没有权限写cpsr
对于non-leaf函数(即该函数还会调用子函数),LR必须压栈保存
movs pc,lr //把lr的值赋给pc,同时把spsr中的值赋给cpsr
高级微控制器总线结构Advanced Microcontroller Bus Architecture(AMBA)
AMBA:AHB(高速):ARM core
DMA 直接存储器访问 Direct Memory Access
flash
SDRAM
片上RAM(是SRAM)
APB(低速):GPIO I2C SPI USB
衡量CPU的标准:架构 主频
衡量总线的标准:宽度 主频
衡量脉冲的标准:周期 占空比
衡量ADC的标准:精度 速度
MMU:内存保护 内存映射
同名寄存器访问:
当前处在system模式下:
mov sp ,#1
切换模式到irq
mov sp ,#2
切换模式到fiq
mov sp ,#3
切换模式到svc
mov sp ,#4
ATPCS/AAPCS 规范:
关于函数传递参数的要求:
int func(int a,int b ,int c,int d ,int e)
第一参数用 r0 来接受 r0 = a;
第二参数用 r1 来接受 r1 = b;
第三参数用 r2 来接受 r2 = c;
第四参数用 r3 来接受 r3 = d;
如果参数大于4个使用堆栈传递
参数的返回: 用r0 来表示
反汇编实例:
all:
arm-none-eabi-gcc test.s -o test.o -c -Wall // -Wall 显示所有警告
arm-none-eabi-ld test.o -o test.elf -Ttext 0x20000 //指定链接地址
arm-none-eabi-objcopy -O binary test.elf test.bin //objcopy 格式转换 将.elf格式文件转换成.bin文件
arm-none-eabi-objcopy -O ihex test.elf test.hex //objcopy 格式转换 将.elf格式文件转换成.hex文件
arm-none-eabi-objdump -D -b binary -m arm test.bin > test.dis
//将.bin文件反汇编 -D反汇编所有段 -b指定目标码格式 -m 指定反汇编目标码使用的架构
arm-none-eabi-objdump -D test.elf > test.diss //将.elf文件反汇编
arm公司与生产cpu公司之间的关系
ARM公司只做知识产权,只卖专利,专注架构开发。其他做cpu的公司购买arm公司架构授权,进行生产。