打印
[ARM7]

LPC23XX---VIC_Control.s疑问?不清楚怎么设置的VICVectAddr{n}的值

[复制链接]
1996|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xueyoujin|  楼主 | 2014-8-4 21:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
软件系统ucosii   开发环境ads1.2   系统在OSStart();进入优先级最高的任务  ,该任务首先做的是TargetInit();   
TargetInit();             //ARM初始化 该函数里面有个子函数VICInit(); 子函数VICInit就是设置IRQ中断,外设中断优先级,使能外设中断等作用
void VICInit(void)
{        
        SetVICIRQ(4,0,(uint32)Timer0_Exception);
}
        
__inline uint32 SetVICIRQ(uint32 channel,uint32 PRI,uint32 ISRFuction)
{
        return(OsSwiHandle1(0x100,channel,PRI,ISRFuction));        
}
经过VICInit()---> __inline uint32 SetVICIRQ(uint32 channel,uint32 PRI,uint32 ISRFuction)--->(OsSwiHandle1(0x100,channel,PRI,ISRFuction))
R0=0x100,R1=4,R2=0;R3=Timer0_Exception;
最后将R0=R0-0x100进入了VIC_Control.s文件中

NoInt       EQU 0x80
NoFIQ                EQU        0x40

SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f

VICVectAddr0  EQU 0xfffff100
VICVectAddr   EQU 0xffffff00
VICIntEnClr   EQU 0xfffff014
VICIntSelect  EQU 0xfffff00c
VICProtection EQU 0xFFFFF020
VICVectPri0   EQU 0xfffff200
VICIntEnable  EQU 0xfffff010
                        
                        IMPORT  StackUsr
               
                         EXPORT  RunFirst
                         EXPORT  VICControl
                                          
        CODE32
    AREA    |RUNFIRST|, CODE, READONLY     
               
RunFirst
;---------------------------------------
;初始化VIC
;Initial VIC And Enable VIC Be Protected;
                        
                LDR     R2, =VICIntEnClr
                MVN     R3, #0x00
                STR            R3, [R2]
                LDR     R2, =VICIntSelect
                MOV     R3, #0x00
                STR            R3, [R2]

        LDR     R0, =VICVectAddr0
        MOV     R1, #0
        MOV     R2, #0
        MOV     R3, #0
        MOV     R4, #0
        MOV     R5, #0
        MOV     R6, #0
        MOV     R7, #0
        MOV     R8, #0
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}
        LDR     R0, =VICVectPri0
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}
        STMIA   R0!, {R1-R8}                    
               
                LDR     R2, =VICVectAddr
                STR            R3, [R2]
                LDR     R2, =VICProtection
        MOV     R3, #0x01
        STR            R3, [R2]              
;                MOV     PC, LR
                BX LR
;-----------------------------------------------                  
        
VICControl
        SUB     R0, R0, #0x100
        CMP     R0, #7
        LDRLO   PC, [PC, R0, LSL #2]
        MOVS    PC, LR
SwiFunctionAdd
        DCD     SetVICIRQFunction      ;0
        DCD     FreeVICIRQFunction     ;1
        DCD     ReEnableIRQ            ;2
        DCD     DisableIRQ             ;3
        DCD     GetIRQStatus           ;4
        DCD     EnableVICFIQ           ;5
        DCD     DisableVICFIQ          ;6
EnableVICFIQ
               MSR     CPSR_c, #(NoFIQ :or: NoInt:or: SVC32Mode)
               
        CMP     R1, #32                                                        ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
                MOVCSS  PC, LR
        
        LDR     R0, =VICVectAddr0                                ;if (IRQ已加载) return FALSE;
        LDR     R3,[R0,R1,LSL #2]
        CMP     R3,#0
        MOVNE   R0, #0
                MOVNES  PC, LR
        
        LDR     R0, =VICIntSelect                                
        LDR     R3, [R0]
        MOV     R2, #1
        MOV     R2, R2, lsl R1
        ORR     R3, R3, R2               
        STR     R3, [R0]
        
        LDR     R0, =VICIntEnable
        STR     R3, [R0]
        MOV     R0, #1
        MOVS    PC, LR
DisableVICFIQ
                MSR     CPSR_c, #(NoFIQ :or: NoInt:or:SVC32Mode)
               
        CMP     R1, #32                                                        ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
                MOVCSS  PC, LR      
            
        LDR     R0, =VICIntSelect                                ;if(FIQ未使能)return FALSE
        LDR     R3, [R0]
        MOV     R2, #1
        MOV     R2, R2, LSL R1        
        ANDS    R2, R3, R2        
        MOVEQ   R0, #0
                MOVEQS  PC, LR         
      
        LDR     R0, =VICIntEnClr
        MOV     R3, R2
        STR     R3, [R0]                                                  ;Disable FIQ
        
        LDR     R0, =VICIntSelect
        LDR     R3, [R0]
        BIC     R3, R3,R2
        STR     R3, [R0]                                                      
        
        MOV     R0, #1
        MOVS    PC, LR            
ReEnableIRQ
        CMP     R1, #32                         ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
        MOVCSS  PC, LR
        
        LDR     R0, =VICVectAddr0               ;if (未加载) return FALSE;
        LDR     R3, [R0, R1, lsl #2]
        CMP     R3, #0
        MOVEQ   R0, #0
        MOVEQS  PC, LR
               
                LDR     R0, =VICIntEnable
        MOV     R2, #1
        MOV     R3, R2, lsl R1
        STR     R3, [R0]
        MOV     R0, #1
        MOVS    PC, LR               
DisableIRQ
        CMP     R1, #32                         ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
        MOVCSS  PC, LR
        
        LDR     R0, =VICVectAddr0               ;if (未加载) return FALSE;
        LDR     R3, [R0, R1, lsl #2]
        CMP     R3, #0
        MOVEQ   R0, #0
        MOVEQS  PC, LR
        
        LDR     R0, =VICIntEnClr
        MOV     R2, #1
        MOV     R3, R2, lsl R1
        STR     R3, [R0]
        MOV     R0, #1
        MOVS    PC, LR
FreeVICIRQFunction
        CMP     R1, #32                                                 ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
                MOVCSS  PC, LR
               
                LDR     R0, =VICIntSelect                              ;if (FIQ) return FALSE;
        MOV     R3, #1
        MOV     R3, R3, LSL R1
        LDR     R2, [R0]
        ANDS    R2, R2, R3        
        MOVNE   R0, #0
                MOVNES  PC, LR
        
        LDR     R0, =VICVectAddr0                                ;if (IRQ was not Set) return FALSE;
        LDR     R2,[R0,R1,LSL #2]
        CMP     R2,#0
        MOVEQ   R0, #0
                MOVEQS  PC, LR
               
                LDR     R0, =VICIntEnClr                               ;Disable IRQ
        STR     R3, [R0]            
        
        LDR     R0, =VICVectAddr0                              ;Clear VICVectAddr0
        MOV     R3, #0
        STR     R3, [R0, R1, lsl #2]        
        MOV     R0, #1        
                MOVS    PC, LR
GetIRQStatus
        CMP     R1, #32                                                        ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
                MOVCSS  PC, LR
        
        LDR     R0, =VICVectAddr0                                ;if (未加载) return FALSE;
        LDR     R3, [R0, R1, lsl #2]
        CMP     R3, #0
        MOVEQ   R0, #0
                MOVEQS  PC, LR      
        STMIA   R2!, {R1}                                                ;通道号

        LDR     R0, =VICVectPri0
        LDR     R0, [R0, R1, lsl #2]
        STMIA   R2!, {R0}                                       ;优先级
        STMIA   R2!, {R3}                                                ;处理函数地址

        LDR     R0, =VICIntEnable
        MOV     R3, #1
        MOV     R1, R3, lsl R1
        LDR     R3, [R0]
        AND     R3, R3, R1            
        CMP     R3, #0
        MOVHI   R3, #1
        STMIA   R2!,{R3}                                                ;IRQ使能与否的状态
        
                MOV     R0, #1
        MOVS    PC, LR
        
SetVICIRQFunction
        CMP     R1, #32                         ;if (通道号 >=32) return FALSE;
        MOVCS   R0, #0
        MOVCSS  PC, LR
        CMP     R2, #16                         ;if (优先级 >=16) return FALSE;
        MOVCS   R0, #0
        MOVCSS  PC, LR
        CMP     R3, #0                          ;if (处理函数 ==0) return FALSE;
        MOVEQ   R0, #0
        MOVEQS  PC, LR
                     
                MSR     CPSR_c, #(NoFIQ :or: NoInt :or: SYS32Mode)
        STMFD   SP!, {R2, R3}
                MOV     R2, #1                          ;if (Enable) return FALSE;
        MOV     R3, R2, lsl R1
      
        LDR     R0, =VICIntEnable
        LDR     R2, [R0]
        ANDS    R2, R2, R3                                                     
        BNE     SetVICIRQFunction_j
        
        LDR     R0, =VICVectAddr0               ;if (IRQ已经使能) return FALSE;
        LDR     R3, [R0, R1, lsl #2]
        CMP     R3, #0         
SetVICIRQFunction_j
        LDMFD   SP!, {R2, R3}
        MSR     CPSR_c, #(NoFIQ :or: NoInt :or: SVC32Mode)
        MOVNE   R0, #0
        MOVNES  PC, LR
        
        STR     R3, [R0, R1, lsl #2]
        LDR     R0, =VICVectPri0
        STR     R2, [R0, R1, lsl #2]
        
        LDR     R0, =VICIntEnable
        MOV     R2, #1
        MOV     R3, R2, lsl R1
        STR     R3, [R0]
                                             
        MOV     R0, #1
        MOVS    PC, LR   
         
    END
    我想问下      1.   ANDS    R2, R2, R3                                                     
                            BNE     SetVICIRQFunction_j                    这两句话的意思?
                      2.  Timer0_Exception定时器0中断函数的服务地址,该地址是怎么赋值给VICVectAddr{n}的?

相关帖子

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

本版积分规则

1

主题

8

帖子

1

粉丝