原创 (转)ARM经典300问--8

2008-11-23 22:54 2702 4 3 分类: MCU/ 嵌入式

第 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  


}  


 /***********************  


 

*功能
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条