音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

關(guān)于OSIntCtxSw()的問(wèn)題?

作者:cloudlily 欄目:ARM技術(shù)
關(guān)于OSIntCtxSw()的問(wèn)題?
在includes.h 中有關(guān)于
#define OSIntCtxSw()    return
的宏定義
這是否就是說(shuō)中斷返回時(shí)不進(jìn)行任何的任務(wù)切換了???那不是成了不可剝離內(nèi)核了
另外在os_cpu_a.s中有關(guān)于OSIntCtxSw的函數(shù),我的理解是此處的OSIntCtxSw與上面includes.h 中的不是同一函數(shù),不知理解對(duì)不對(duì)。
在os_cpu_a.s中對(duì)OSIntCtxSw的調(diào)用是在SWI軟件中斷中處理的,如下1處:

;軟件中斷
SoftwareInterrupt
        LDR     SP, StackSvc            ; 重新設(shè)置堆棧指針
        STMFD   SP!, {R0-R3, R12, LR}   ;些處是放入管理堆棧中
        MOV     R1, SP                  ; R1指向參數(shù)存儲(chǔ)位置

        MRS     R3, SPSR                ;中斷前任務(wù)的CPSR已保存至SPSR中
        TST     R3, #T_bit              ; 中斷前是否是Thumb狀態(tài)
        LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb狀態(tài)SWI號(hào)
        BICNE   R0, R0, #0xff00
        LDREQ   R0, [LR,#-4]            ; 否: 取得arm狀態(tài)SWI號(hào)
        BICEQ   R0, R0, #0xFF000000
                                        ; r0 = SWI號(hào),R1指向參數(shù)存儲(chǔ)位置
        CMP     R0, #1                  ;R0=0,任務(wù)級(jí)任務(wù)切換函數(shù)
        LDRLO   PC, =OSIntCtxSw         ;1處
        LDREQ   PC, =__OSStartHighRdy   ; SWI 0x01為第一次任務(wù)切換

        BL      SWI_Exception           ;SWI_Exception的參數(shù)是通過(guò)R0傳送的
        
        LDMFD   SP!, {R0-R3, R12, PC}^  ;返回
        
StackSvc           DCD     (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)




__swi(0x00) void OS_TASK_SW(void);              /*  任務(wù)級(jí)任務(wù)切換函數(shù)          */
__swi(0x01) void _OSStartHighRdy(void);         /*  運(yùn)行優(yōu)先級(jí)最高的任務(wù)        */
__swi(0x02) void OS_ENTER_CRITICAL(void);       /*  關(guān)中斷                      */
__swi(0x03) void OS_EXIT_CRITICAL(void);        /*  開(kāi)中斷                      */

__swi(0x40) void *GetOSFunctionAddr(int Index); /*  獲取系統(tǒng)服務(wù)函數(shù)入口        */
__swi(0x41) void *GetUsrFunctionAddr(int Index);/*  獲取自定義服務(wù)函數(shù)入口      */
__swi(0x42) void OSISRBegin(void);              /*  中斷開(kāi)始處理                */
__swi(0x43) int  OSISRNeedSwap(void);           /*  判斷中斷是否需要切換        */

__swi(0x80) void ChangeToSYSMode(void);         /*  任務(wù)切換到系統(tǒng)模式          */
__swi(0x81) void ChangeToUSRMode(void);         /*  任務(wù)切換到用戶模式          */
__swi(0x82) void TaskIsARM(INT8U prio);         /*  任務(wù)代碼是ARM代碼           */
__swi(0x83) void TaskIsTHUMB(INT8U prio);       /*  任務(wù)代碼是THUMB             */





那就是說(shuō)此處的OSIntCtxSw實(shí)際上就是任務(wù)切換函數(shù)。


如果以上理解正確,那么SP是在管理模式中的SP,以下代碼的前三行的SP又是如何得到當(dāng)前任務(wù)的PC和R12的:
OSIntCtxSw
                                                    ;下面為保存任務(wù)環(huán)境
1、        LDR     R2, [SP, #20]                       ;獲取PC,實(shí)際上是LR的值
2、        LDR     R12, [SP, #16]                      ;獲取R12
        MRS     R0, CPSR

        MSR     CPSR_c, #(NoInt | SYS32Mode)
        MOV     R1, LR
        STMFD   SP!, {R1-R2}                        ;保存LR,PC
        STMFD   SP!, {R4-R12}                       ;保存R4-R12

        MSR     CPSR_c, R0
        LDMFD   SP!, {R4-R7}                        ;獲取R0-R3
        ADD     SP, SP, #8          &nb
2樓: >>參與討論
hunteren
關(guān)于OSIntCtxSw()的問(wèn)題
你查看中斷處理宏定義,就會(huì)知道了.

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)教uC/OS OSIntCtxSw_1問(wèn)題
此版本有些問(wèn)題。需要仔細(xì)測(cè)試。
看門狗不復(fù)位 苦惱,在線等待
MFRC500支持SPI接口方式嗎?
求購(gòu)EasyARM2200,最好在上海
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)