第 283 问:
Q:执行 FIQ 代码时,操作系统在做什么呢 当执行 FIQ 中断代码时,需要注意什么呢要对相关寄存器进行入栈吗那执行完了以后,又怎么返回到 OS 里执行任务呢 FIQ 可不可以调用 OS 函数IRQ 呢 A:1.FIQ 服务程序中断了 OS 啊.
2.FIQ 中断服务不在 OS 管理范围内,所以不能访问任何与 OS 相关的函数及变量. 3.FIQ 其实就是普通的 FIQ 中断服务函数而已,与普通的一样处理.4.受 OS 管理的 IRQ 可以调用OS的系统功能函数.
第 284 问:
Q:请问,在 vectors.s 程序中中断向量操作如下:
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;未定义指令
Undefined
B Undefined
;软中断
SoftwareInterrupt
B SoftwareInterrupt
PrefetchAbort
B PrefetchAbort
;取数据中止
DataAbort
B DataAbort
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
现我将它改为
Vectors
LDR PC, =Reset
LDR PC, =Undefined
LDR PC, =SoftwareInterrupt
LDR PC, =PrefetchAbort
LDR PC, =DataAbort
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, =FIQ_Handler
;未定义指令
Undefined
B Undefined
;软中断
SoftwareInterrupt
B SoftwareInterrupt
PrefetchAbort
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,为什么"LDR PC, ResetAddr"地址从中间转一道就对了而"LDR PC, =Reset"就不对,既然不对为什么还可以仿真,而脱机运行就不行
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 中断.
第 288 问:
Q:请问什么时候需要通过软件中断进入管理模式
A:如果你的程序是在用户模式下运行,那就可以通过软中断进入特权模式,修改 CPSR 寄存器.如开关 IRQ 中断(CPSR 的 I 位).
第 289 问:
Q:软件中断是用软件置位的方法产生中断请求,比如定时器 0 中断请求.用软件中断的方法可以产生 IRQ, FIQ 中断,对吗
A:VIC 中的软件中断是这样,而 swi 产生的异常,英文也为软件中断,它是不一样的.
第 290 问:
Q:我现在在看 ads 编译器文档中的 swi 部分,我理解软中断就是一种预期发生的中断而一般中断是不可预期的,对吗 A:可以这样说.
第 291 问:
Q:为什么以下的程序进不了中断
#include "config.h"
#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++);
}
void MSpiIni()
{
SPI_SPCCR = 0x52; // 设置 SPI 时钟分频
SPI_SPCR = 0xB0; // 配置 MSTR = 1 CPOL = 1 CPHA = 0 LSBF = 0
}
/***********************
*功能
文章评论(0条评论)
登录后参与讨论