新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 移植ucosII到STM32F103ZE(五)

        移植ucosII到STM32F103ZE(五)

        作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏

        PendSV 中斷處理函數(shù)偽代碼如下:
        OS_CPU_PendSVHandler()
        {
        if (PSP != NULL) {
        Save R4-R11 onto task stack;
        OSTCBCur->OSTCBStkPtr = SP;

        }
        OSTaskSwHook();
        OSPrioCur = OSPrioHighRdy;
        OSTCBCur = OSTCBHighRdy;
        PSP = OSTCBHighRdy->OSTCBStkPtr;
        Restore R4-R11 from new task stack;
        Return from exception;
        }

        OS_CPU_PendSVHandler ;xPSR, PC, LR, R12, R0-R3 已自動(dòng)保存 #0
        CPSID I ;任務(wù)切換期間需要關(guān)中斷
        MRS R0, PSP ;R0 = PSP
        ;如果 PSP ==0,跳到OS_CPU_PendSVHandler_nosave 執(zhí)行 #1
        CBZ R0, OS_CPU_PendSVHandler_nosave
        ;保存 R4-R11 到任務(wù)堆棧
        SUBS R0, R0, #0x20 ;R0 -= 0x20
        STM R0, {R4-R11} ;保存 R4-R11 到任務(wù)堆棧
        ;OSTCBCur->OSTCBStkPtr = SP;
        LDR R1, =OSTCBCur ;R1 = &OSTCBCur
        LDR R1, [R1] ;R1 = *R1 (R1 = OSTCBCur)
        STR R0, [R1] ;*R1 = R0 (*OSTCBCur = SP) #2

        OS_CPU_PendSVHandler_nosave
        ;調(diào)用 OSTaskSwHook()
        PUSH {R14} ;保存 R14,因?yàn)楹竺嬉{(diào)用函數(shù)
        LDR R0, =OSTaskSwHook ;R0 = &OSTaskSwHook
        BLX R0 ;調(diào)用 OSTaskSwHook()
        POP {R14} ;恢復(fù) R14
        ;OSPrioCur = OSPrioHighRdy;
        LDR R0, =OSPrioCur ;R0 = &OSPrioCur
        LDR R1, =OSPrioHighRdy ;R1 = &OSPrioHighRdy
        LDRB R2, [R1] ;R2 = *R1 (R2 = OSPrioHighRdy)
        STRB R2, [R0] ;*R0 = R2 (OSPrioCur = OSPrioHighRdy)
        ;OSTCBCur = OSTCBHighRdy;
        LDR R0, =OSTCBCur ;R0 = &OSTCBCur
        LDR R1, =OSTCBHighRdy ;R1 = &OSTCBHighRdy
        LDR R2, [R1] ;R2 = *R1 (R2 = OSTCBHighRdy)
        STR R2, [R0] ;*R0 = R2 (OSTCBCur = OSTCBHighRdy)
        LDR R0, [R2] ;R0 = *R2 (R0 = OSTCBHighRdy), 此時(shí) R0 是新任務(wù)的 SP
        ;SP = OSTCBHighRdy->OSTCBStkPtr #3
        LDM R0, {R4-R11} ;從任務(wù)堆棧 SP 恢復(fù) R4-R11
        ADDS R0, R0, #0x20 ;R0 += 0x20
        MSR PSP, R0 ;PSP = R0,用新任務(wù)的 SP 加載PSP
        ORR LR, LR, #0x04 ;確保 LR 位2 為1,返回后使用進(jìn)程堆棧 #4
        CPSIE I ;開中斷
        BX LR ;中斷返回
        END
        #0 OS_CPU_PendSVHandler 要替換為 PendSV_Handler。


        #1 如果 PSP==0,說(shuō)明OSStartHighRdy()啟動(dòng)后第一次做任務(wù)切換,而任務(wù)剛創(chuàng)建時(shí) R4-R11 已經(jīng)保存在堆棧中了,所以不需要再保存一次了。
        #2 OSTCBStkPtr 是任務(wù)控制塊結(jié)構(gòu)體的第一個(gè)變量,所以*OSTCBCur = SP(不是很科學(xué))就是 OSTCBCur->OSTCBStkPtr = SP;
        #3 和#2 類似。
        #4 因?yàn)樵谥袛嗵幚砗瘮?shù)中使用的是 MSP,所以在返回任務(wù)后必須使用PSP,所以LR位2必須為1。
        os_dbg.c
        用于系統(tǒng)調(diào)試,可以不管。
        需要修改的代碼就介紹到這里,如果還有不明白之處,就再看看 AN-1018.pdf,邵老師的書和<
        Cortex-M3 權(quán)威指南>>。
        App.c
        App.c文件中建立如下函數(shù) App文件中有對(duì) SysTick的初始化函數(shù)(上面已經(jīng)解釋過(guò))。
        static void systick_init(void); //函數(shù)聲明

        static void systick_init(void)
        {
        RCC_ClocksTypeDef rcc_clocks;
        RCC_GetClocksFreq(&rcc_clocks); //調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù),獲取系統(tǒng)時(shí)鐘。
        SysTick_Config(rcc_clocks.HCLK_Frequency / OS_TICKS_PER_SEC); //調(diào)用庫(kù)函數(shù),初始化并使能 SysTick
        //OS_TICKS_PER_SEC是在 os_cfg.h 中定義的
        }
        os_cfg.h 是用來(lái)配置 ucosii 系統(tǒng)的,對(duì)其做如下修改: 共9處
        #define OS_APP_HOOKS_EN 0 //關(guān)掉App 鉤子功能
        #define OS_DEBUG_EN 0 //關(guān)掉uC/OS 自帶調(diào)試功能
        #define OS_EVENT_MULTI_EN 0 //
        #define OS_SCHED_LOCK_EN 0 //關(guān)掉調(diào)度加鎖功能
        #define OS_TASK_CHANGE_PRIO_EN 0 //關(guān)掉改變?nèi)蝿?wù)優(yōu)先級(jí)功能
        #define OS_TASK_QUERY_EN 0 //關(guān)掉任務(wù)查詢功能
        #define OS_TASK_STAT_EN 0 //關(guān)掉 CPU 使用率統(tǒng)計(jì)功能
        #define OS_TASK_STAT_STK_CHK_EN 0 //關(guān)掉 CPU 使用率統(tǒng)計(jì)功能的堆棧設(shè)置
        #define OS_TASK_SUSPEND_EN 0 //關(guān)掉任務(wù)掛起功能
        所做的修改主要是把一些功能給去掉,減少內(nèi)核大小,也利于調(diào)試。等移植完成后,如果需要該功能,
        再做開啟。
        最后,還要記得把stm32f10x_it.h文件中的void PendSV_Handler(void);注釋掉,以防和 OS_CPU.HH
        文件中的聲明沖突,stm32f10x_it.c 中的相應(yīng)函數(shù)體也得注釋掉。如圖:







        注釋掉多余的PendSV 聲明

        上一頁(yè) 1 2 下一頁(yè)

        關(guān)鍵詞: 移植ucosIISTM32F103Z

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 自治县| 奉化市| 丘北县| 龙州县| 洪洞县| 唐海县| 监利县| 博白县| 萨迦县| 河间市| 铅山县| 淮南市| 江津市| 武鸣县| 汕尾市| 新兴县| 资阳市| 青川县| 琼海市| 建宁县| 东阳市| 游戏| 余庆县| 遂平县| 吉安市| 区。| 苍南县| 法库县| 康定县| 乐亭县| 忻城县| 若尔盖县| 太和县| 尼木县| 栖霞市| 筠连县| 平湖市| 夏邑县| 雅江县| 绥江县| 稻城县|