B PrefetchAbort ;取数据中止 DataAbort B DataAbort
;快速中断 FIQ_Handler
STMFD SP!, {R0-R3, LR} BL FIQ_Exception
LDMFD SP!, {R0-R3, LR} SUBS PC, LR, #4
程序编译可以通过,用 AXD 调试时报告不能自由运行,可以仿真运行.
按我的理解 DCD 前面为地址(也就是指针),DCD 后面为 4 个字节的内容(指针的值), LDR PC,ResetAddr LDR PC,=Reset,
都是采用间接寻址,也就是将 Reset 的地址放进 PC,为什么\地 址从中间转一道就对了而\就不对,既然不对为什么还可以仿真,而 77
脱机运行就不行
A:因为异常向量表累加和不为 0.详细看一看 5.1.3 节或 6.3 节.我记得以前也有一个类 似的帖子 可以参考. 第 285 问:
Q:是不是 FIQ 与 IRQ 的使用上没有什么区 FIQ 自己独有的寄存器有什么用
我是否可以把 INT1,UART1 等中断设为 FIQ FIQ 的中断服务程序应该定位到什么位置 A:没有本质的区.
FIQ 拥有独立的 R8_fiq~R12_fiq,FIQ 中断时,其它模式相应的寄存器就可不入栈,从 而加快 FIQ 的处理.多个中断源共用还不如单独用 IRQ.因为 FIQ 比较适合在人命关天 的情况下用. 第 286 问:
Q:这是 VECTORS.s 中的一段,里面的 REMAP 操作都做了些什么 好像是保护一类的操作. REMAP 和 MEMMAP 各是什么义 如果我要同时使用两个外部中断,应当怎样写这一段 REMAPS MOV R2,#0x40000000 LDR R1,=Vectors LDMIA R1!,{R3-R10} STMIA R2!,{R3-R10} LDMIA R1!,{R3-R10} STMIA R2!,{R3-R10} LDR R2,=MEMMAP MOV R1,#0x02 STR R1,[R2]
MSR CPSR_c, #0x1f MOV PC, R0
A:REMAP 是重映射的意思,MEMMAP 是存储器映射控制寄存器. MEMMAP = 0b01,不映射,程序由 FLASH 开始.
MEMMAP = 0b10,程序从 RAM 开始,如果你的程序在 RAM 中,必须使用这种方式. 如同时使用两个中断,这一段也不用改. 第 287 问:
Q:特定的异常出现时,处理器进入相应的异常模式.如出现 IRQ 就进入 IRQ 模式,那出现 什么情况进入管理模式呢 A:复位或 SWI 中断. 78
第 288 问:
Q:请问什么时候需要通过软件中断进入管理模式
A:如果你的程序是在用户模式下运行,那就可以通过软中断进入特权模式,修改 CPSR 寄存 器.如开关 IRQ 中断(CPSR 的 I 位). 第 289 问:
Q:软件中断是用软件置位的方法产生中断请求,比如定时器 0 中断请求.用软件中断的方 法可以产生 IRQ, FIQ 中断,对吗
A:VIC 中的软件中断是这样,而 swi 产生的异常,英文也为软件中断,它是不一样的. 第 290 问:
Q:我现在在看 ads 编译器文档中的 swi 部分,我理解软中断就是一种预期发生的中断而一 般中断是不可预期的,对吗 A:可以这样说.
第 291 问:
Q:为什么以下的程序进不了中断
/********************************************************** *修改说明 加中断
*修改目标 我是想每发一个字符就让 LED 变换一次,现在结果是 * 仍正常发送字符,但没有中断效果,为什么呢 * 哪位帮看看!先谢谢了!
**********************************************************/ #include \
#define HC595_CS 0x00000100
#define LEDCON 0x00000400 // LED1~LED4 设置为输出 void DelayNS(uint32 dly) {
uint32 i;
for(; dly > 0; dly--)
for(i = 0; i < 50000; i++); }
/************************************************************************** *初始化 SPI 接口
**************************************************************************/ void MSpiIni() {