新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ucOS-II移植到S3C2410筆記之一

        ucOS-II移植到S3C2410筆記之一

        作者: 時間:2016-11-11 來源:網絡 收藏
        1: 問題: 移植匯編函數:OSStartHighRdy, 如下,但發現只有OS_TaskIdle一個任務時,都不能正確運行。
        .globl OSStartHighRdy
        .type OSStartHighRdy, %function
        OSStartHighRdy:

        /* C variable OSRunning = TRUE */

        mov r0, #1
        ldr r1, =OSRunning
        str r0, [r1]

        /* get the stack pointer of task that will be running. */
        ldr r5, =OSTCBHighRdy /* R0= the address of pointer variable OSTCBHighRdy */
        ldr r6, [r5] /* R1= the the value of pointer variable OSTCBHighRdy= OS_TCB(TaskIdle) */
        ldr r7, [r6] /* R2= the value of pointer variable OS_TCB->OSTCBStkPtr, the value is address*/
        /*ldr r8, [r7]*/ /* R3= the value of pointer*/

        mov sp, r7 /* restore SP*/

        ldr r1, [sp, #0]
        msr cpsr, r1 /* restore CPSR */

        add sp, sp, #4 /* pointer to R0 location */
        ldmia sp!,{r0-r12, lr, pc} /* restore R0-R12, LR, PC */

        2:實驗,刪掉如下代碼(OSRunning=1,即上面紅色部分代碼)后,系統正常。

        3:分析
        說明系統是在執行OSRunning=1對應的匯編代碼出現異常,于是查看變量OSRunning的定義:
        ucos_ii.h:451:OS_EXT BOOLEAN OSRunning;
        再查看BOOLEAN的原始類型:
        os_cpu.h:42:typedef unsigned char BOOLEAN;
        即變量OSRunning是unsigned char類型,至此,問題的原因已經找到,即錯誤的使用了匯編指令
        因為匯編訪問C語言的變量時,需要根據變量的類型,而確定其匯編指令,這里應該使用:ldrb/strb
        4: 修正后的代碼
        mov r0, #1
        ldrb r1, =OSRunning
        strb r0, [r1]
        5: 總結
        匯編在訪問C語言的變量時,需要根絕變量的類型使用不同的匯編指令:

        unsigned char -----------------------> LDRB/STRB
        unsigned short -----------------------> LDRH/STRH
        unsigned int -----------------------> LDR/STR
        char -----------------------> LDRSB/STRSB
        short -----------------------> LDRSH/STRSH


        關鍵詞: ucOS-II移植S3C241

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 塔城市| 通州市| 特克斯县| 景宁| 平顺县| 阆中市| 茌平县| 尚义县| 象山县| 黄陵县| 芮城县| 德清县| 益阳市| 邵阳市| 衡南县| 龙口市| 宿松县| 泗阳县| 逊克县| 辽宁省| 桃园县| 曲松县| 博罗县| 萝北县| 房山区| 息烽县| 安阳县| 伊金霍洛旗| 朔州市| 庆云县| 大同市| 犍为县| 吉林市| 年辖:市辖区| 上饶县| 阿勒泰市| 辽中县| 霍山县| 界首市| 新密市| 微山县|