ARM学习笔记

更新时间:2023-12-22 19:55:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基础知识:

RAM=SRAM OR DRAM

应用》操作系统内核》驱动》硬件

交叉编译就是在一个平台上生成在另一个平台上可以执行的代码,如在PC上开发嵌入式就是一个交叉编译的过程 交叉调试 宿主机和目标机

特权模式可以访问系统的所有资源,也可以任意地进行处理器模式切换

每一组异常都有一组专用的异常处理程序使用,可以保证进入异常程序时寄存器不被破坏 系统加电讲flash映射为0,这样就可以进行一些初始化,初始化后讲RAM映射为地址0,并把系统程序加载到SDRAM中开中运行

内核级Cache》芯片级TCM紧挨着内核》芯片级cache》板卡级DRAM》外设级存储器 当一个协处理器不能执行属于它的指令的时候讲产生一个未定义中断,然后用软件模拟硬件 CPU执行步骤有 从存储器中读取指令》译码以鉴别它属于哪一种类型的指令》从指令中取出操作数》将操作数进行组合以得到结果》如果需要访问存储器以存储数据》将结果写回寄存器堆res。 端口操作:

P0(32位)P1(16位)

引脚功能选着寄存器PINSEL0控制P0.0~P0.15等16个寄存器,其中PINSEL为32为,每两位控制一个引脚,实现引脚复用功能。PINSEL1控制P0.16~P031。PINSEL2用于控制P1.16~P1.31。

IOPIN为引脚寄存器,对应于P0的32位

IODIR为引脚方向寄存器,用于控制方向是输入还是输出

IONSET输入置位寄存器,用于输出高电平,写1有效,写0无效 IOCLR输出清零寄存器

外设》中断控制器》IRQ&FIQ 可处理32个中断

中断使能寄存器VICIntEable:使能中断请求或者软件中断 VICIntSelectzz中断选择寄存器,用于分配是FIQ还是IRQ 向量控制寄存器16个

向量地址寄存器16个:用于保存IRQ slot中断服务程序ISR地址 默认向量地址寄存器:用于非向量IRQ中断服务程序ISR地址

ARM 汇编若干问题(一般中断问题与软中断SWI分析)

一般中断问题分析

ARM CPU 在上电启动之后会自动进入SVC模式,也是ARM上电后的默认工作模式,如果发生了中断,ARM会自动切换到外部中断模式(IRQ为例),如果是FIQ那么就切换到FIQ模式下面进行处理。

在每一个模式下面都有一组可以访问的寄存器,SVC和IRQ模式下的R0~R12是共用的,这就涉及到寄存器Rx内容的保存:压栈,恢复:出栈操作。在IRQ处理中用到了哪些Rx就要进行相应的保护与恢复,否则当处理退出IRQ时就会出错误。

发生中断时候,ARM是要首先完成当前正在执行的指令,然后再进行为IRQ的必要处理。具体的内容如下:

将当前CPSR,保存到IRQ模式下的的SPSR_irq,进行备份。

把PC-4所指向的地址放到LR。LR = PC-4。为中断返回是有个退出点。

强制PC= 0X0000'0018,指向IRQ的中断向量的地址,通常地址0X0000'0018放置一条跳命令,跳转到IRQ的中断服务函数的入口地址。B HANDLERIRQ. 补充一点:ARM的正在执行的指令地址x,和取指令的地址PC,地址y,之间是差x=y-8.

难点:中断服务函数退出地址的计算

PC-8 --------------->|正在执行的指令的地址|0x120 如果此时发生中断了 PC-4 --------------->|真正的中断返回点地址|0x124 PC ---------------->|取指令的地址 |0x128 通过上述分析可以得出:真正的中断返回点地址是0X124,真正应该存入LR的地址是0X124.但是实际情况是:0X128 ?????

分析:ARM 总是执行完当前的指令才会处理其他事情,问题就出在这里,当ARM执行完当前的指令的时候PC已经更新了,如下

PC = PC+4;PC = 0X128+4 = 0X12C,存放到LR=PC-4; LR = 0X12C-4=0X128;这个0X128不是真正的中断函数的返回点。真正的函数返回点是0X124.怎么办????

在给PC恢复数值是进行这样的处理下:LR = LR-4,PC=LR. ==>SUBS PC,LR,#4. 并且自动恢复CPSR=SPSR_irq

也就是说在一个中断返回过程中PC要两次减4 SWI软中断问题分析

swi软中断还是很特别的玩意,软中断发生的时候,CPU切换到SVC工作模式,PC的数值不进行更新,即:不是等到把当前的指令执行完毕之后在执行其他的处理。而是立刻处理。CPU立即把软中断的返回地址写入LR中。LR=PC-4,这是真正的返回地址,PC的数据不更新。!!!!。SWI中断返回地址不需要调整就是正确的地址。只要减去一次4

然后就是软中断编号的计算,方法:发生软中断时那条指令地址里面数据的低24位放的就是软中断标号,从中取出来放到R0里面,R0是函数的第一个参数,也是存放函数返回结果的地方。 HandlerSWI

STMFD SP!,{R0-R3,R12,LR},LR存放的是swi真正的软中断要返回的中断地址点。

LDR R0,[LR,#-4];找到到底在哪一条指令时发生了软中断,很明显:就是LR真正断点返回地址的上面一条地址。LR-4或者PC-8。找个这个指令的地址,取出其中的内容。软中断的编号就是存放在发生软中断那条指令地址的低24位数据里面。

BIC R0,R0,#0xFF00'0000,低24位是软中断号 BL my_swi_handler;

LDMFD SP! ,{R0-R3,R12,PC}^,其中^表示CPSR=SPSR_svc.只能手动恢复。 使用方法

extern void my_swi_handler(unsigned int num);

__swi(0x1)led_one(void); __swi(0x2)led_two(void);

main() {

led_one();

delay(100ms); led_two(); }

void my_swi_handler(unsigned int num) {

case 0x1:{ do_some_thing}break; case 0x2:{do_another_thing}break; default: break; }

推荐向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了再判断中断标志来识别具体是哪个中断。向量中断实时性好,非向量中断简单

向量中断控制器VIC具有32个中断请求输入,可将其编程分为3类,FIQ,向量IRQ和非向量IRQ。

FIQ(fast interrpt request)快速中断请求要求具有最高优先级。如果分配给FIQ的请求多于一个,VIC将中断请求相或后向ARM处理器产生FIQ信号。当只有一个中断被分配为FIQ时可实现最短的FIQ等待,但如果分配给IFIQ级的中断多于1个,FIQ服务程序需要读取FIQ状态寄存器来识别产生中断请求的FIQ中断源!向量IRQ具有中等优先级。该级别可分别32个请求中断的16个。32个请求种的任意一个都可分配到16个向量IRQ slot中的任意一个,其中slot0具有最高优先级非向量IRQ的优先级最低 向量中断 非向量中断

向量者,矢量也,即指方向,门路。

向量中断------由硬件提供中断服务程序入口地址; 非向量中断------由软件件提供中断服务程序入口地址;

向量中断模式用于RESET、NMI、异常处理。当向量中断产生时,控制器直接将PC赋值,如跳到0x0000000d处,而在0x0000000d地址处通常放置ISR服务程序地址LDR PC, =ISR_HANDLER。

非向量中断模式,有一个寄存器标识位,跳转到统一的函数地址,此函数通过判别寄存器标识位和优先级关系进行中断处理。向量中断模式是当CPU读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址函数中,节省了中断处理时间提高了中断处理速度。例如 ADC 中断的

向量地址为0xC0,则在0xC0处放如下代码:ldr PC,=HandlerADC 当ADC中断产生的时候系统会自动跳转到HandlerADC函数中处理中断。

非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将INTPND寄存器中对应标志位置位,然后跳转到位于0x18处的统一中断函数中;该函数通过读取INTPND寄存器中对应标志位来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中处理中断。

向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了在判断中断标志来识别具体是哪个中断。向量中断实时性好,非向量中断简单

向量中断控制器VIC具有32个中断请求输入,可将其编程分为3类,FIQ,向量IRQ和非向量IRQ。

FIQ(fast interrpt request)快速中断请求要求具有最高优先级。如果分配给FIQ的请求多于一个,VIC将中断请求相或后向ARM处理器产生FIQ信号。当只有一个中断被分配为FIQ时可实现最短的FIQ等待,但如果分配给IFIQ级的中断多于1个,FIQ服务程序需要读取FIQ状态寄存器来识别产生中断请求的FIQ中断源!

向量IRQ具有中等优先级。该级别可分别32个请求中断的16个。32个请求种的任意一个都可分配到16个向量IRQ slot中的任意一个,其中slot0具有最高优先级 非向量IRQ的优先级最低

1. 中断优先级不同: 非向量中断比向量中断要低(向量中断则比FIQ优先级低);

2. 两者的设置方式不同:非向量中断只需要通过VICDefVectAddr来设置ISR地址,然后在VIC控制器中使能外设中断即可;而向量中断配置时,先选择为IRQ中断,然后分配中断通道(即优先级。此为IRQ内部的优先级,不同于FIQ、IRQ与非向量中断三者的优先级意义),再在VICVectAddrx 中设置ISR地址,最后使能向量中断。

3. 中断响应异同:响应过程两者皆是由VIC硬件来控制,用户软件不用干预。共同点是,当中断产生,处理器进入IRQ模式,并将对应的ISR地址保存寄存器的值,复制到VICVectAddr寄存器中,PC根据此地址进行跳转,执行相应ISR程序。而区别如下:

a. 非向量中断:ISR地址由VICDefVectAddr复制到VICVectAddr,如果有多路非向量中断,在确定是哪路中断产生时,要通过VICIRQStatus寄存器来查询;

b. 向量中断:ISR地址由VICVectAddrx复制到VICVectAddr,如果有多路向量中断,在同时产生中断时,处理器响应的是具有最高优先级的IRQ中断。

4. 中断服务程序编写:两者没有差异。中断处理完毕后,皆要先清除中断标志,再对VICVectAddr执行写操作,以更新中断优先级,正常响应下一次中断。

对于三星S3C440b处理器,是必须要定义中断向量表的,并将中断向量表放置在最初的位置。

Samsung的ARM7处理器一般不使用非向量中断的,使用向量中断。在中断源产生中断之后,处理器会自动根据中断源来将正确的中断向量地址赋给PC。所以,我们必须在启动代码中事先设置好中断向量表,为使用的中断设置相应的中断服务函数。当PC指针指向中断源唯一对应的中断向量处之后,就会跳转到相应的中断处理函数。

定义:板级支持包(或称为板级代码)

板级支持包(BSP)是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器的函数包,使之能够更好的运行于硬件主板。在嵌入式系统软件的组成中,就有BSP。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好的支持上层OS。

BSP主要功能为屏蔽硬件,提供操作系统及硬件驱动,具体功能包括:

1. 单板硬件初始化,主要是CPU的初始化,为整个软件系统提供底层硬件支持 2. 为操作系统提供设备驱动程序和系统中断服务程序

3. 定制操作系统的功能,为软件系统提供一个实时多任务的运行环境 4. 初始化操作系统,为操作系统的正常运行做好准备。

本文来源:https://www.bwwdw.com/article/j3p5.html

Top