• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    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

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 咸丰县| 宿州市| 嘉义市| 望江县| 枝江市| 邛崃市| 乌拉特前旗| 来宾市| 苍溪县| 乡宁县| 科技| 英超| 兴仁县| 沙湾县| 罗源县| 南漳县| 柯坪县| 曲松县| 高唐县| 惠水县| 江华| 保亭| 金平| 普格县| 乌恰县| 元氏县| 朝阳县| 安图县| 山丹县| 长岛县| 万年县| 泰州市| 昌平区| 郸城县| 乌拉特中旗| 房山区| 辽宁省| 崇义县| 锦州市| 桦南县| 庐江县|