打印
[ZLG-ARM]

为什么这里不能回写SP

[复制链接]
1175|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzixian|  楼主 | 2010-8-18 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ST, se, DSP, STM, rc
陈明计的IRQ.S中有这样一句汇编
STMFD   SP, {R3,LR}^  
我觉得应该要回写,SP,以便后来把它们弹出来,当我把这一句改为
STMFD   SP!, {R3,LR}^  后
ADS提出警告说
Warning : A1329W: Unsafe instruction (forced user mode xfer with write-back to base)


我就搞不懂啊,为什么不能回写?我觉得应该要回写啊,要不然后来怎么知道R3和LR保存的地址呢?
另外,这个SP是用户模式的SP还是IRQ模式的SP?

相关帖子

沙发
huzixian|  楼主 | 2010-8-21 23:04 | 只看该作者
算了,这个错误我还没搞懂,不过,我自己写了个通俗点的IRQ.S的实现

经测试,跟陈工的功能一样,可以实现IRQ之间的嵌套以及在IRQ中嵌套FIQ

我把我写的帖出来分享一下:

前面是一样的,从$IRQ_Label后面的实现不一样



NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

    CODE32

    AREA    MYIRQ,CODE,READONLY

    MACRO
$IRQ_Label MYHANDLER $IRQ_Exception_Function

        EXPORT  $IRQ_Label                      ; The label for exports 输出的标号
        IMPORT  $IRQ_Exception_Function         ; The imported labels 引用的外部标号

$IRQ_Label
  STMFD SP!, {R0-R3,R12,LR}
  MRS R0, SPSR
  STMFD SP!, {R0}
  MSR CPSR_c,#(NoInt|SYS32Mode)   ;这里一定要加NoInt,在还没有真正进人c函数的中断服务程序之前,IRQ中断标志没有清除
            ;这时强制开通IRQ相应将导致不可预料的结果,往往是预取中止。
  STMFD SP!,{R0-R3,R12,LR}    ;保存系统模式下的寄存器
  BL  $IRQ_Exception_Function    ;在系统模式下跳到C函数中断服务程序
  
  LDMFD SP!, {R0-R3,R12,LR}    ;在系统模式下恢复系统模式下的寄存器
  MSR CPSR_c,#(NoInt|IRQ32Mode)   ;转入IRQ模式
  LDMFD SP!,{R0}       ;弹出SPSR_irq到R0
  MSR SPSR_cxsf,R0      ;恢复SPSR_irq
  LDMFD SP!,{R0-R3,R12,LR}    ;弹出进人IRQ时保存的寄存器,特别是保存了从IRQ返回的地址的寄存器LR
  SUBS PC,LR,#4       ;LR-4得出中断前下一条要执行的指令。这是由ARM核对中断相应的规则决定的。
MEND

/***********定义自己的宏实例****************/

;MYEINT_Handler MYHANDLER irq_EINT0


END

使用特权

评论回复
板凳
无语凝咽| | 2010-8-21 23:11 | 只看该作者
这个确实比例程上的简单,看起来也容易懂,不过暂时没调试,不知道有没有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1534

帖子

2

粉丝