新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ucOS-II移植到S3C2410筆記之一

        ucOS-II移植到S3C2410筆記之一

        作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
        1: 問題: 移植匯編函數(shù):OSStartHighRdy, 如下,但發(fā)現(xiàn)只有OS_TaskIdle一個任務(wù)時,都不能正確運行。
        .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,即上面紅色部分代碼)后,系統(tǒng)正常。

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

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


        關(guān)鍵詞: ucOS-II移植S3C241

        評論


        相關(guān)推薦

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

        關(guān)閉
        主站蜘蛛池模板: 越西县| 苏尼特左旗| 苗栗县| 崇左市| 沁源县| 个旧市| 阜康市| 博野县| 湘潭市| 灵台县| 裕民县| 定兴县| 灯塔市| 汾西县| 克山县| 唐海县| 怀柔区| 兴仁县| 望城县| 巴彦县| 介休市| 奈曼旗| 河北区| 普宁市| 巨鹿县| 徐闻县| 元朗区| 无为县| 中卫市| 太仓市| 城口县| 葫芦岛市| 元朗区| 丽水市| 衡南县| 黄石市| 兴仁县| 邻水| 永兴县| 湘乡市| 聂荣县|