打印
[ZLG-ARM]

关于在喂狗用软中断关中断,这样写是否可行,请ZLGARM帮我看看

[复制链接]
1440|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunny_jgp|  楼主 | 2008-1-9 11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
;;这是启动文件的部分
IMPORT  SWI_Exception
;定义堆栈的大小
SVC_STACK_LEGTH         EQU         128
FIQ_STACK_LEGTH         EQU         128
IRQ_STACK_LEGTH         EQU         128
ABT_STACK_LEGTH         EQU         0
UND_STACK_LEGTH         EQU         0

NoInt       EQU         0x80
T_bit       EQU         0x20

__user_initial_stackheap    
    LDR   r0,=bottom_of_heap
;    LDR   r1,=StackUsr
    LDR   r2,=top_of_heap
    LDR   r3,=bottom_of_Stacks
    MOV   pc,lr


StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

AREA    MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;
IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4  
FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4  
AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4  
UndtStackSpace     SPACE   UND_STACK_LEGTH * 4 

;软中断   直接在启动文件中加入
SoftwareInterrupt
        LDR     SP, StackSvc            ; 重新设置堆栈指针
        STMFD   SP!, {R0-R3, R12, LR}
        MOV     R1, SP                  ; R1指向参数存储位置

        MRS     R3, SPSR
        TST     R3, #T_bit              ; 中断前是否是Thumb状态
        LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb状态SWI号
        BICNE   R0, R0, #0xff00
        LDREQ   R0, [LR,#-4]            ; 否: 取得arm状态SWI号
        BICEQ   R0, R0, #0xFF000000
                              ; r0 = SWI号,R1指向参数存储位置
        ;CMP     R0, #1             ;;;这三句我删除了,看得不大明白
        ;LDRLO   PC, =OSIntCtxSw
        ;LDREQ   PC, =__OSStartHighRdy   ; SWI 0x01为第一次任务切换
        BL      SWI_Exception        
        LDMFD   SP!, {R0-R3, R12, PC}^

/***********这段在C文件中写***********************/
#define   c_NoallInt          0xc0
#define   c_NoInt              0x80
#define   c_dis_fiqirq          0
#define   c_en_fiqirq          1
#define   c_dis_irq          2
#define   c_en_irq              3
__swi(c_dis_fiqirq) void swi_dis_fiqirq(void);    
__swi(c_en_fiqirq) void swi_en_fiqirq(void);   
__swi(c_dis_irq) void swi_dis_irq(void);      
__swi(c_en_irq) void swi_en_irq(void);   

void SWI_Exception(int SWI_Num)
{
    
    switch(SWI_Num)
    {
        case 0x00:
                        __asm
                    {
                        MRS     R0, SPSR
                        ORR     R0, R0, #c_NoallInt
                        MSR     SPSR_c, R0
                    }
                    break;                    
        case 0x01:
                          __asm
                    {
                        MRS     R0, SPSR
                        BIC     R0, R0, #c_NoallInt
                        MSR     SPSR_c, R0
                    }
                    break;                      
        case 0x02:                     
                    __asm
                    {
                        MRS     R0, SPSR
                        ORR     R0, R0, #c_NoInt
                        MSR     SPSR_c, R0
                    }
                    break;
        case 0x03:                    
                __asm
                {
                    MRS     R0, SPSR
                    BIC     R0, R0, #c_NoInt
                    MSR     SPSR_c, R0
                }
                    break;
        default:
            break;
    }
}

#define wdt()   
{swi_dis_fiqirq();WDFEED=0xaa;WDFEED=0x55;swi_en_fiqirq();}   //喂狗

相关帖子

沙发
sunny_jgp|  楼主 | 2008-1-9 11:21 | 只看该作者

RE

SoftwareInterrupt
        LDR     SP, StackSvc            ; 重新设置堆栈指针
        STMFD   SP!, {R0-R3, R12, LR}
        MOV     R1, SP                  ; R1指向参数存储位置

        MRS     R3, SPSR
        TST     R3, #T_bit              ; 中断前是否是Thumb状态
        LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb状态SWI号
        BICNE   R0, R0, #0xff00
        LDREQ   R0, [LR,#-4]            ; 否: 取得arm状态SWI号
        BICEQ   R0, R0, #0xFF000000
                              ; r0 = SWI号,R1指向参数存储位置
        ;CMP     R0, #1             ;;;这三句我删除了,看得不大明白
        ;LDRLO   PC, =OSIntCtxSw
        ;LDREQ   PC, =__OSStartHighRdy   ; SWI 0x01为第一次任务切换
        BL      SWI_Exception        
        LDMFD   SP!, {R0-R3, R12, PC}^

关键这段这样写是否可行,我搞不清返回中断怎么没有SUBS    PC,  LR,  #4
请ZLGARM帮忙啊,能否解译一下

使用特权

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

本版积分规则

10

主题

33

帖子

1

粉丝