亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? os_cpu_a.s

?? UCOS在ARM7TDMI上的移植。與它的官方版不同的是
?? S
字號:
;********************************************************************************************************
;                                               uC/OS-II
;                                         The Real-Time Kernel
;
;                               (c) Copyright 1992-2004, Micrium, Weston, FL
;                                          All Rights Reserved
;
;                                           ARM Generic Port
;                                            IAR C Compiler
;
; File    : OS_CPU_A.ASM
; Version : V1.50
; By      : Jean J. Labrosse
;********************************************************************************************************

            GLOBAL  OS_CPU_SR_Save               ; Functions declared in this file
            GLOBAL  OS_CPU_SR_Restore
            GLOBAL  OSStartHighRdy               
            GLOBAL  OSCtxSw
;            GLOBAL  OSIntCtxSw
            GLOBAL  OS_CPU_IRQ_ISR
;            GLOBAL  OS_CPU_FIQ_ISR

            IMPORT  OSRunning                    ; External references
            IMPORT  OSPrioCur
            IMPORT  OSPrioHighRdy
            IMPORT  OSTCBCur
            IMPORT  OSTCBHighRdy
            IMPORT  OSIntNesting
            IMPORT  OSIntCtxSwFlag
            IMPORT  OSIntEnter
            IMPORT  OSIntExit
            IMPORT  OSTaskSwHook
            IMPORT  OS_CPU_IRQ_ISR_Handler
 ;           IMPORT  OS_CPU_FIQ_ISR_Handler




NO_INT      EQU     0xC0                         ; Mask used to disable interrupts (Both FIR and IRQ)
SYS32_MODE  EQU     0x1F
FIQ32_MODE  EQU     0x11
IRQ32_MODE  EQU     0x12


;*********************************************************************************************************
;                                   CRITICAL SECTION METHOD 3 FUNCTIONS
;
; Description: Disable/Enable interrupts by preserving the state of interrupts.  Generally speaking you
;              would store the state of the interrupt disable flag in the local variable 'cpu_sr' and then
;              disable interrupts.  'cpu_sr' is allocated in all of uC/OS-II's functions that need to 
;              disable interrupts.  You would restore the interrupt disable state by copying back 'cpu_sr'
;              into the CPU's status register.
;
; Prototypes :     OS_CPU_SR  OS_CPU_SR_Save(void);
;                  void       OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
;
;
; Note(s)    : 1) These functions are used in general like this:
;
;                 void Task (void *p_arg)
;                 {
;                 #if OS_CRITICAL_METHOD == 3          /* Allocate storage for CPU status register */
;                     OS_CPU_SR  cpu_sr;
;                 #endif
;
;                          :
;                          :
;                     OS_ENTER_CRITICAL();             /* cpu_sr = OS_CPU_SaveSR();                */
;                          :
;                          :
;                     OS_EXIT_CRITICAL();              /* OS_CPU_RestoreSR(cpu_sr);                */
;                          :
;                          :
;                 }
;
;              2) OS_CPU_SaveSR() is implemented as recommended by Atmel's application note:
;
;                    "Disabling Interrupts at Processor Level"
;*********************************************************************************************************
        AREA    OS_ASM_CODE, CODE, READONLY
        CODE32

OS_CPU_SR_Save

        mrs r0,CPSR
        orr r1,r0,#NO_INT
        msr CPSR_c,r1
        mov pc,lr


OS_CPU_SR_Restore

        msr CPSR_c,r0
        mov pc,lr
        
;OS_CPU_SR_Save
;        MRS     R0,CPSR                     ; Set IRQ and FIQ bits in CPSR to disable all interrupts
;        ORR     R1,R0,#NO_INT
;        MSR     CPSR_c,R1
;        MRS     R1,CPSR                     ; Confirm that CPSR contains the proper interrupt disable flags
;        AND     R1,R1,#NO_INT
;        CMP     R1,#NO_INT
;        BNE     OS_CPU_SR_Save              ; Not properly disabled (try again)
;        MOV     PC,LR                       ; Disabled, return the original CPSR contents in R0
;
;
;OS_CPU_SR_Restore
;        MSR     CPSR_c,R0
;        MOV     PC,LR
;
;
;;*********************************************************************************************************
;;                                          START MULTITASKING
;                                       void OSStartHighRdy(void)
;
; Note(s) : 1) OSStartHighRdy() MUST:
;              a) Call OSTaskSwHook() then,
;              b) Set OSRunning to TRUE,
;              c) Switch to the highest priority task.
;*********************************************************************************************************


OSStartHighRdy  

        MSR     CPSR_cxsf, #0xDF        ; Switch to SYS mode with IRQ and FIQ disabled
        
        BL      OSTaskSwHook            ; OSTaskSwHook();

        LDR     R4, =OSRunning        ; OSRunning = TRUE
        MOV     R5, #1
        STRB    R5, [R4]

                                        ; SWITCH TO HIGHEST PRIORITY TASK
        LDR     R4, =OSTCBHighRdy     ;    Get highest priority task TCB address
        LDR     R4, [R4]                ;    get stack pointer
        LDR     SP, [R4]                ;    switch to the new stack

        ldmfd sp!,{r4}              ; pop new task's psr
        msr CPSR_cxsf,r4
        ldmfd sp!,{r0-r12,lr,pc}    ; pop new task's r0-r12,lr & pc


;*********************************************************************************************************
;                         PERFORM A CONTEXT SWITCH (From task level) - OSCtxSw()
;
; Note(s) : 1) OSCtxSw() is called in SYS mode with BOTH FIQ and IRQ interrupts DISABLED
;
;           2) The pseudo-code for OSCtxSw() is:
;              a) Save the current task's context onto the current task's stack
;              b) OSTCBCur->OSTCBStkPtr = SP;
;              c) OSTaskSwHook();
;              d) OSPrioCur             = OSPrioHighRdy;
;              e) OSTCBCur              = OSTCBHighRdy;
;              f) SP                    = OSTCBHighRdy->OSTCBStkPtr;
;              g) Restore the new task's context from the new task's stack
;              h) Return to new task's code
;
;           3) Upon entry: 
;              OSTCBCur      points to the OS_TCB of the task to suspend
;              OSTCBHighRdy  points to the OS_TCB of the task to resume
;*********************************************************************************************************

        CODE32

OSCtxSw
                                        ; SAVE CURRENT TASK'S CONTEXT
        stmfd sp!,{lr}              ; push pc (lr should be pushed in place of PC)
        stmfd sp!,{r0-r12,lr}       ; push lr & register file
        mrs r4,cpsr
        stmfd sp!,{r4}              ; push current psr
        
        LDR     R4, =OSTCBCur         ; OSTCBCur->OSTCBStkPtr = SP;
        LDR     R5, [R4]
        STR     SP, [R5]

        BL      OSTaskSwHook            ; OSTaskSwHook();

        LDR     R4, =OSPrioCur        ; OSPrioCur = OSPrioHighRdy
        LDR     R5, =OSPrioHighRdy
        LDRB    R6, [R5]
        STRB    R6, [R4]
        
        LDR     R4, =OSTCBCur         ; OSTCBCur  = OSTCBHighRdy;
        LDR     R6, =OSTCBHighRdy
        LDR     R6, [R6]
        STR     R6, [R4]

        LDR     SP, [R6]                ; SP = OSTCBHighRdy->OSTCBStkPtr;

                                        ; RESTORE NEW TASK'S CONTEXT
        ldmfd sp!,{r4}              ; pop new task's psr
        msr CPSR_cxsf,r4
        ldmfd sp!,{r0-r12,lr,pc}    ; pop new task's r0-r12,lr & pc



;*********************************************************************************************************
;                                      IRQ Interrupt Service Routine
;*********************************************************************************************************
;中斷的處理是操作系統移植的很重要的一部分
;我在移植中完全沒有按官方版的思路,而主要參照Jean J. Labrosse版本
;在此基礎上貫徹了我的一個主要思想,讓中斷發生后,如果需要進行任務切換,
;則場景看起來就像是中斷從新任務中發生的,然后返回來新任務
;如果不進行切換,則場景就是完全和原任務一致
;并且一個很主要的一點,中斷處理過程中,全程都是禁止中斷的
;直到最后一個語句返回到SYS模式(新任務或原任務)才恢復正確的CPSR,允許中斷
;為了達到這個目的,沒有在INTEXIT中調用Intctxsw,而是設置了一個標志位,然后在最后才執行
;*********************************************************************************************************


        CODE32

OS_CPU_IRQ_ISR
        stmfd sp!,{r0-r12,lr}

        bl OSIntEnter
        bl OS_CPU_IRQ_ISR_Handler
        bl OSIntExit

        ldr r0,=OSIntCtxSwFlag
        ldr r1,[r0]
        cmp r1,#1
        beq _IntCtxSw			;if executed, will not return here

        ldmfd sp!,{r0-r12,lr}
        subs pc,lr,#4
                                       
;*********************************************************************************************************
;                   PERFORM A CONTEXT SWITCH (From interrupt level) - OSIntCtxSw()
;
; Note(s) : 1) OSIntCtxSw() is called in SYS mode with BOTH FIQ and IRQ interrupts DISABLED
;
;           2) The pseudo-code for OSCtxSw() is:
;              a) OSTaskSwHook();
;              b) OSPrioCur             = OSPrioHighRdy;
;              c) OSTCBCur              = OSTCBHighRdy;
;              d) SP                    = OSTCBHighRdy->OSTCBStkPtr;
;              e) Restore the new task's context from the new task's stack
;              f) Return to new task's code
;
;           3) Upon entry: 
;              OSTCBCur      points to the OS_TCB of the task to suspend
;              OSTCBHighRdy  points to the OS_TCB of the task to resume
;*********************************************************************************************************
_IntCtxSw
        mov r1,#0
        str r1,[r0]				;OSIntCtxSwFlag = 0;

        ldmfd sp!,{r0-r12,lr}
        stmfd sp!,{r0-r3}		;r0-r3 need use below
        mov r1,sp				;r1 is sp of int
        add sp,sp,#16
        sub r2,lr,#4			;r2 is old task pc

       mrs r3,spsr				;spsr->no int
;        orr r0,r3,#NO_INT
;        msr spsr_c,r0
        msr spsr_c, #0xdf        ; Switch to SYS mode with IRQ and FIQ disabled

        ldr r0,=.+8				;r0 = pc+8	僅僅是為了將SPSR賦值到CPSR
        movs pc,r0				;pc = r0, and CPSR=SPSR
;以下已經切換到了SYS模式
        stmfd sp!,{r2}              ; push old task's pc
        stmfd sp!,{r4-r12,lr}       ; push old task's lr,r12-r4
        mov r4,r1                   ; SP_irq->r4
        mov r5,r3					;CSSR->r5
        ldmfd r4!,{r0-r3}			;從IRQ的中斷中恢復R0-R3
        stmfd sp!,{r0-r3}           ; push old task's r3-r0
        stmfd sp!,{r5}              ; push old task's psr
;        mrs r4,spsr				;no spsr in sys mode
;        stmfd sp!,{r4}              ; push old task's spsr

;to here old task context save finished, except save sp to tcb    
		mov r7, r4					;SP_irq->r7

        ; OSPrioCur = OSPrioHighRdy
        ldr r4,=OSPrioCur
        ldr r5,=OSPrioHighRdy
        ldrb r5,[r5]
        strb r5,[r4]
        
        ; Get current task TCB address
        ldr r4,=OSTCBCur
        ldr r5,[r4]
        str sp,[r5]                 ; store sp in old tasks's TCB

        bl OSTaskSwHook             ; call Task Switch Hook

        ; Get highest priority task TCB address
        ldr r6,=OSTCBHighRdy
        ldr r6,[r6]
        ldr sp,[r6]                 ; get new task's stack pointer

        ; OSTCBCur = OSTCBHighRdy
        str r6,[r4]                 ; set new current task TCB address


        ldmfd sp!,{r4}              ; pop new task's psr to r4
        ldmfd sp!,{r0-r3}   		 ; pop new task's r0-r3, r0-r3 used as temp registers
		;push to Stack of irq
        stmfd r7!,{r0-r3}           ; push new task's r0-r3
        mov r3, r4					;save PSR to r3
		
        ldmfd sp!,{r4-r12,lr}    	; pop new task's r4-r12,lr 
        ldmfd sp!,{r2}              ; pop new task's pc to r2
        
;now, all context of new task was poped. 
;r0-r3, in irq's stack, r4-r12,lr in place, cpsr in r3, pc in r2, sp in sp_sys
;return IRQ mode!
        msr cpsr_c, #0xD2        ; Switch to IRQ mode with IRQ and FIQ disabled

		msr spsr_cxsf, r3			;new task's cpsr to irq's spsr
		mov lr, r2					;new task's pc to lr
		
		sub sp, sp, #16				;TBD
        ldmfd sp!,{r0-r3}			;restore r0-r3
;now all context of new task was in place, just like interrpt was occur in new task		
        movs pc,lr					;restore cpsr

        END

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕一区二区三区四区不卡| 一区二区三区欧美在线观看| 国产精品国产三级国产aⅴ原创 | 欧美v亚洲v综合ⅴ国产v| 中文字幕二三区不卡| 日日摸夜夜添夜夜添精品视频| 国产精品亚洲第一| 4438x亚洲最大成人网| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 天堂av在线一区| 色哟哟在线观看一区二区三区| 精品日韩一区二区三区| 亚洲成人福利片| 色综合久久综合网欧美综合网| wwwwxxxxx欧美| 婷婷开心激情综合| 欧美亚洲高清一区二区三区不卡| 国产亚洲成aⅴ人片在线观看| 日本 国产 欧美色综合| 欧美日韩国产一级二级| 亚洲欧美视频一区| 成人aa视频在线观看| 久久久久久久电影| 精品一区免费av| 欧美一区二区视频在线观看| 亚洲在线成人精品| 欧美综合久久久| 亚洲精品乱码久久久久久久久| 99麻豆久久久国产精品免费优播| 久久久亚洲高清| 国模冰冰炮一区二区| 欧美精品一区二区在线观看| 久久国产精品色婷婷| 日韩久久久久久| 国内精品免费在线观看| 精品国产乱码久久久久久闺蜜| 成人午夜私人影院| 欧美国产日韩在线观看| eeuss影院一区二区三区| 亚洲精品视频一区二区| 国产日韩v精品一区二区| 国产乱国产乱300精品| 久久婷婷成人综合色| 国产九色精品成人porny| www亚洲一区| 成人福利视频网站| 亚洲美女电影在线| 欧美精品v日韩精品v韩国精品v| 亚洲成人av电影在线| 日韩一级片在线播放| 国产一区二区在线观看免费| 国产精品久久久久久久久免费桃花| 成人久久久精品乱码一区二区三区| 亚洲人成在线播放网站岛国| 欧美中文一区二区三区| 久久黄色级2电影| 中文字幕精品三区| 欧美网站一区二区| 久久超碰97人人做人人爱| 国产精品久久久久9999吃药| av中文字幕不卡| 午夜精品一区二区三区电影天堂| 日韩亚洲欧美中文三级| 成人午夜私人影院| 天天影视涩香欲综合网| 久久久噜噜噜久久人人看| 99精品久久久久久| 日本美女一区二区三区视频| 国产精品久久久久一区二区三区| 欧美日韩国产不卡| 国产99久久久国产精品免费看| 一区二区三区在线观看网站| 欧美v日韩v国产v| 色呦呦国产精品| 国产乱人伦偷精品视频不卡| 一区二区三区在线观看动漫| 日韩精品中文字幕在线一区| 99久久久国产精品| 久久精品二区亚洲w码| 亚洲精品videosex极品| 久久久久九九视频| 欧美福利电影网| av在线一区二区三区| 精品系列免费在线观看| 亚洲成人综合网站| 中文字幕免费在线观看视频一区| 欧美人伦禁忌dvd放荡欲情| 99精品欧美一区二区三区小说 | 99久久夜色精品国产网站| 日本亚洲一区二区| 亚洲黄色尤物视频| 久久精品亚洲乱码伦伦中文| 91精品国产综合久久福利软件| jvid福利写真一区二区三区| 国产主播一区二区| 天天色综合天天| 亚洲一区在线电影| 亚洲欧美一区二区视频| 久久久久99精品国产片| 日韩欧美综合在线| 欧美人狂配大交3d怪物一区| 色狠狠av一区二区三区| 从欧美一区二区三区| 精品亚洲国产成人av制服丝袜 | 国产91对白在线观看九色| 美女被吸乳得到大胸91| 亚洲国产精品一区二区久久恐怖片| 国产女主播一区| 国产日韩欧美一区二区三区乱码| 日韩免费电影网站| 日韩一级二级三级| 欧美一区二区三区四区高清| 在线不卡a资源高清| 欧美剧情片在线观看| 欧美日韩国产欧美日美国产精品| 色婷婷综合五月| 色一区在线观看| 在线日韩av片| 欧美日韩三级一区| 8x8x8国产精品| 日韩视频一区二区三区 | 国产网红主播福利一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 一级特黄大欧美久久久| 亚洲精品成人悠悠色影视| 一级精品视频在线观看宜春院| 亚洲一区视频在线| 偷窥少妇高潮呻吟av久久免费| 日韩av一区二区三区四区| 久久精品999| 成人午夜视频网站| 欧美主播一区二区三区| 欧美一区二区日韩| www国产精品av| 国产精品不卡在线观看| 一区二区三区日韩欧美| 日韩av在线播放中文字幕| 精品亚洲成a人在线观看| 成人免费看视频| 日本精品一区二区三区高清| 91 com成人网| 国产欧美日韩亚州综合 | 精品国产一区a| 亚洲国产高清不卡| 伊人性伊人情综合网| 青青草97国产精品免费观看无弹窗版| 久久se精品一区精品二区| www.欧美日韩| 欧美高清dvd| 国产精品女上位| 丝袜亚洲精品中文字幕一区| 国产在线视频一区二区三区| 色8久久精品久久久久久蜜| 日韩一区二区麻豆国产| 亚洲婷婷在线视频| 另类小说色综合网站| 91丨九色丨蝌蚪丨老版| 欧美xxxx老人做受| 一区二区三区欧美| 国产主播一区二区三区| 欧美视频一区二区三区在线观看| 欧美成人精精品一区二区频| 亚洲人成影院在线观看| 国模一区二区三区白浆 | 91麻豆.com| www久久精品| 午夜精品在线视频一区| 国v精品久久久网| 欧美久久久久久蜜桃| 亚洲柠檬福利资源导航| 国产一区在线观看视频| 欧美亚日韩国产aⅴ精品中极品| 中文字幕av免费专区久久| 美腿丝袜亚洲综合| 欧美三级中文字幕| 成人免费一区二区三区在线观看| 精品一区二区三区香蕉蜜桃| 欧美色电影在线| 亚洲美女在线一区| 国产大陆精品国产| 精品久久久久久久久久久久久久久 | 91国偷自产一区二区使用方法| 久久久久国产一区二区三区四区| 五月综合激情日本mⅴ| 91在线云播放| 国产欧美一区二区精品秋霞影院 | 久久众筹精品私拍模特| 日本美女一区二区三区视频| 在线成人av影院| 五月天激情综合网| 日韩欧美国产精品| 性做久久久久久免费观看| 在线免费视频一区二区| 一区二区三区中文字幕电影| 99视频国产精品| 亚洲精品成人天堂一二三| 一本大道av伊人久久综合| 亚洲久草在线视频| 在线一区二区三区做爰视频网站| 亚洲精品一二三|