教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

ARM中断基础知识 - 图文(4)

来源:网络收集 时间:2026-09-06
导读: 解决方法: 声明一个变量来代替寄存器 1 int val; 2 /* init CPSR I-bit */ 3 //0101,0011 4 __asm 5 { 6 mov val,#0x53 7 msr cpsr,val 8 } 编译警告就没有了,这里出现警告是因为R0可能被别的使用的,这里使用会

解决方法:

声明一个变量来代替寄存器

1 int val;

2 /* init CPSR I-bit */ 3 //0101,0011 4 __asm 5 {

6 mov val,#0x53 7 msr cpsr,val 8 }

编译警告就没有了,这里出现警告是因为R0可能被别的使用的,这里使用会冲突,我们定义一个变量来代替R0就行了。

但是编译运行后发现还是按下就有“+”打印出来,没有什么跳转现象啊!

cpsr修改成为cpsr_cxsf或者CPSR_cxsf,再次编译运行后,按下按键会发现,不打印了,停下来了:

说明cpu检测到了中断信号,跳出了原来运行的主函数,但是按理来说是要重启的,这里可能是VIC没有打开。下面介绍怎么打开VIC 打开VIC:

1 int val2;

2 /* VIC Enable (cp15) */ 3 __asm 4 {

5 mrc p15,0,val2,c1,c0,0 6 orr val2,val2,#(1<<24) 7 mcr p15,0,val2,c1,c0,0 8 }

这样cpu内核就能捕捉到中断了。编译运行,果然重启了。 但是怎么跳转的,跳转到哪里去呢?? 中断发生了之后怎么办? 接下来有2种处理方法:

A) 简单的办法就是使用VIC 向量中断控制器的功能

1、跳转的地址向量要提前设置好

2、通知ARM11内核,启动VIC Port 功能

紧接着的问题是,如何在执行完beep之后返回主程序?(假设我们的目的是蜂鸣beep) 原因:beep程序不能作为IRQ_handler 1)保存cpu现场STMFD

2)清除掉Pending bit,调用beep

3)恢复cpu现场LDMFD (LR-4)->PC ,SPSR -> CPSR 修改start.s,实现IRQ_handler 1)IRQ模式下的sp指针需要初始化

2)除了清除pending bit之外,还需要清除VIC0ADDRESS =0 ; B)复杂的办法就是不用VIC,自己实现全过程 1、当 IRQ 异常发生的时候,cpu 跳转到 0x18

2、背景知识:reset 0 地址被映射 map 到 iROM (内容不可修改) 0 地址 在 iROM 中 (0xD0000000)

iRAM (0xD0020000) -> 0x20000 (iROM 被映射到了 0x20000) 通过 md 命令,查看相关内存单元值,发现 0x18: 0xEA000018

经过一系列分析,最终在 iROM 中的跳转指令会加载从 0xD0037400 地址开始的值, 作为异常发生后要跳转的地址+offset ,因此只需要修改 0xD0037418 的向量即可。 3、(int)IRQ_handler -> 0xD0037400 + 0x18

如果是 SWI 软件中断,则在 0xD0037408 处填写swi_handler的地址 第一种方法

当程序有中断且cpu检测到中断的时候轮询就没有意义了,所以去掉轮训。在主函数外面声明一个handler函数:

1 void C_IRQ_handler(void) 2 {

3 EINT0PEND = 0x1; 4 uart_putchar(' '); 5 uart_putchar('+'); 6 uart_putchar(' '); 7 }

那要怎么样才能调用到这个handler呢? 这就要注册这个函数地址到向量地址里面去了

1 /* VIC0VECTADDR[31:0] --> 0x71200100 : 0x7120017C */ 2 /* Contains ISR vector addresses */

3 #define VIC0VECTADDR0 (*((volatile unsigned int *)0x71200100 )) 4 #define VIC1VECTADDR0 (*((volatile unsigned int *)0x71300100 )) 5 /* install IRQ handler to Vectors */ 6 /* EINT0 --> VIC0VECTADDR[0] */ 7 VIC0VECTADDR0 = (int)C_IRQ_handler;

这样注册后是不是就能跳转到这个函数去了呢?当然不是!VIC默认是关闭的(uboot里面可能打开VIC了,但是完全裸机的话,VIC默认是关闭的,要自己手动打开)。上面手动打开了VIC了,这里注册好函数之后编译运行,发现开发板还是重启,没有进入到handler里面来,什么 原因呢??

************************************************************************************************************

下面是在汇编里面写的handler,要做中断sp的设置,返回地址lr的计算,现场保存,然后调用c语言里面的handler,返回后要恢复现场:

01 import C_IRQ_handler 02 export asm_IRQ_handler 03 asm_IRQ_handler 04 ldr sp,=0x58000000 05 ;lr=lr-4 06 sub r14,r14,#4 07

08 stmfd r13!,{r1-r12,r14} 09 bl C_IRQ_handler 10 ldmfd r13!,{r1-r12,pc}^

下面是c语言的handler,它要完成中断悬起位的清除,中断处理函数地址寄存器的清除,然后做别的事情:

1 void C_IRQ_handler(void) 2 {

3 EINT0PEND = 0x1;//clear pending bit 4 VIC0ADDRESS = 0;//clear address 5 uart_putchar(' '); 6 uart_putchar('+'); 7 uart_putchar(' '); 8 }

这个程序直接下载到ram中运行,按下按键,中断触发就直接重启开发板了,但是放在ads上去调试却没有什么毛病能够进入中断正常运行(代码参考OK6410裸机调试笔记--> 6),不知道什么原因。

…… 此处隐藏:759字,全部文档内容请下载后查看。喜欢就下载吧 ……
ARM中断基础知识 - 图文(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/444994.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)