由一次对arm7的中断选择寄存器(VICIntSelect)赋值而引发的思考
2015-06-20 21:04
387 查看
芯片型号为lpc2138,编译环境为keil4,采用j-link下载
由于程序中运用到了多个向量IRQ中断,于是为了方便便采用了如下写法
![](http://img.blog.csdn.net/20150620203331374)
观察赋值结果,发现原本想要赋值为0的位全部变成了1,
由于一开始并没有发现什么异常,于是继续往下写,往下需要加入一个RTC秒增量中断,由于RTC对应的通道号为13,于是进行如下赋值:
编译运行后,发现,程序莫名其妙的进入了FIQ服务子程序,但是我却没有对相关的寄存器进行操作,这个FIQ的服务子程序是老师给的ucos 2源代码中有的,只在startup.s中有相关的汇编代码,由于本人不懂汇编,所以只能猜测是由于对VICIntSelect 的赋值导致莫一位赋值为1,选择了FIQ中断,
于是我把上面两句全删了,直接来了个简单粗暴的方法,
没想到,程序却能正常的进入RTC秒增量中断,
于是上网试着百度了下VICIntSelect的写法,没找到相关关于这个赋值写法问题的讨论,
(可能是我的搜索的关键字不对)于是斗胆在此猜测是由于以上赋值引起的,
关于这种多个中断该如何赋值的问题,若有大神有好的见解,忘不吝赐教!
先写在这里,待以后弄明白再来修改!
由于程序中运用到了多个向量IRQ中断,于是为了方便便采用了如下写法
VICIntSelect = VICIntSelect&((~(1<<14))|(~(1<<17))); //EINT0,3中断分配为向量IRQ中断
观察赋值结果,发现原本想要赋值为0的位全部变成了1,
由于一开始并没有发现什么异常,于是继续往下写,往下需要加入一个RTC秒增量中断,由于RTC对应的通道号为13,于是进行如下赋值:
VICIntSelect |= (~(1<<13));
编译运行后,发现,程序莫名其妙的进入了FIQ服务子程序,但是我却没有对相关的寄存器进行操作,这个FIQ的服务子程序是老师给的ucos 2源代码中有的,只在startup.s中有相关的汇编代码,由于本人不懂汇编,所以只能猜测是由于对VICIntSelect 的赋值导致莫一位赋值为1,选择了FIQ中断,
于是我把上面两句全删了,直接来了个简单粗暴的方法,
VICIntSelect==0x0;
没想到,程序却能正常的进入RTC秒增量中断,
于是上网试着百度了下VICIntSelect的写法,没找到相关关于这个赋值写法问题的讨论,
(可能是我的搜索的关键字不对)于是斗胆在此猜测是由于以上赋值引起的,
关于这种多个中断该如何赋值的问题,若有大神有好的见解,忘不吝赐教!
先写在这里,待以后弄明白再来修改!
相关文章推荐
- css定位
- 读《人 绩效和职业道德》有感
- 使用GNU/Linux播放电视节目
- CDOJ的使用
- web前端优化总结
- 句是人心
- 身份证使用
- 三层架构(我了解并详细分析)
- c语言第二周总结-结构体
- java final keyword
- mvc review
- mysql新建用户和授权登录
- 以游戏实例介绍Unity3d
- 如何直接串行电缆以及空调制解调器串行电缆之间的区别?
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果
- sprintf、atoi、strlen、strcat、memset、sizeof的一些用法总结
- Java NIO框架Netty课程(一) – Hello Netty
- Java-马士兵设计模式学习笔记-责任链模式-模拟处理Reques Response
- SDP举例
- 个人读后感