ARM中断基础知识 - 图文(4)
解决方法:
声明一个变量来代替寄存器
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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




