⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portform3.asm

📁 基于MDK的LPC1100处理器开发应用例程
💻 ASM
字号:
;*******************************************************************************
;                         PUBLIC FUNCTIONS
;*******************************************************************************
		
	; Functions declared in this file
	PUBLIC  Inc8              ; U8   Inc8(U8 *data);
	PUBLIC  Dec8              ; U8   Dec8(U8 *data); 
	PUBLIC  IRQ_ENABLE_RESTORE; void IRQ_ENABLE_RESTORE(void) ;
  PUBLIC  IRQ_DISABLE_SAVE  ; void IRQ_DISABLE_SAVE(void) ; 
	PUBLIC  SwitchContext     ; void SwitchContext(void); 
	PUBLIC  PendSV_Handler    ; void PendSV_Handler(void);
	PUBLIC	SetEnvironment	  ; void SetEnvironment(void);

	EXTERN  TCBRunning
	EXTERN  TCBNext
	EXTERN  OSSchedLock

;*******************************************************************************
;                              EQUATES
;*******************************************************************************	
NVIC_INT_CTRL   EQU     0xE000ED04      ; Interrupt control state register
NVIC_SYSPRI2    EQU     0xE000ED22      ; System priority register (PendSV 14)
NVIC_PENDSV_PRI EQU           0xFF      ; PendSV priority value (Lowest)
NVIC_PENDSVSET  EQU     0x10000000      ; Value to trigger PendSV exception


    RSEG    CODE:CODE(2)
    thumb


;U8 Inc8(U8 *data);
Inc8
    PUSH    {R1}
    CPSID   I
    LDRB    R1,[R0]
    ADDS    R1,#1
    STRB    R1,[R0]
    CPSIE   I
    SUBS    R1,#1
    MOVS    R0,R1
    POP     {R1}
    BX      LR	


;U8 Dec8 (U8 *data);
Dec8
    PUSH    {R1}
    CPSID   I
    LDRB    R1,[R0]
    SUBS    R1,#1
    STRB    R1,[R0]
    CPSIE   I
    MOVS    R0,R1
    POP     {R1}
    BX      LR

IRQ_ENABLE_RESTORE
    CPSIE   I
    BX      LR
	
IRQ_DISABLE_SAVE	
	  CPSID   I
    BX      LR
    
SetEnvironment
    SUBS    R0, #28
    MSR     PSP, R0
    BX      LR	
 
 	
; void SwitchContext(void)
SwitchContext
    LDR     R0, =NVIC_INT_CTRL  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]
    BX	    LR


; void PendSV_Handler(void)
PendSV_Handler
    LDR     R3,=TCBRunning
    LDR     R1,[R3]             ; R1 == running tcb
    
    LDR     R2,=TCBNext
    LDR     R2,[R2]             ; R2 == next tcb
    
    CMP     R1,R2
    BEQ     exitPendSV              
    
    MRS     R0, PSP             ; Get PSP point (can not use PUSH,in ISR,SP is MSP )
    STMDB   R0!,{R4-R11}        ; Store r4-r11,r0 -= regCnt * 4,r0 is new stack 
                                ; top point (addr h->l r11,r10,...,r5,r4)
    STR     R0,[R1]             ; Save orig PSP
      
    STR     R2, [R3]            ; TCBRunning  = TCBNext;
    LDR     R0, [R2]            ; Get SP of task that be switch into.
    LDMIA   R0!,{R4-R11}        ; POP {R4-R11},R0 += regCnt * 4
    MSR     PSP, R0             ; Mov new stack point to PSP
  
exitPendSV  
    LDR     R3,=OSSchedLock
    MOVS    R0, #0x0
    STRB    R0, [R3]
    ORR     LR, LR, #0x04       ; Ensure exception return uses process stack
    BX      LR                  ; Exit interrupt
    
    END	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -