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

    EEPW首頁 > 嵌入式系統 > 設計應用 > LPC2292芯片的μC/OS-II硬件抽象層構建

    LPC2292芯片的μC/OS-II硬件抽象層構建

    作者: 時間:2009-12-18 來源:網絡 收藏

    按此在新窗口瀏覽圖片
    圖2 堆棧增長的方向

    3.4 任務上下文切換

      任務上下文管理負責嵌入式操作系統內核中任務管理部分對任務寄存器上下文的創建、刪除以及切換等操作。任務的寄存器上下文是操作系統內核所管理的任務的重要組成部分,是CPU內核的寄存器中內容的映像,因此上下文管理的實現依賴于CPU 內核中寄存器的組織,是與體系結構密切相關的。通用層的任務上下文管理統一定義體系結構中的寄存器上下文的保護格式,提供了任務管理對任務上下文的基本操作的API接口。

      μ的任務切換其實就是通過改變PC中的內容來實現的。將PC指向新任務開始運行的地方,同時將當前任務(被搶占任務)環境保存到相應的任務堆棧中,將新任務環境從任務堆棧中恢復到相應的寄存器中。

      μ用OS_TASK_SW()完成任務級切換。將μ移植到上,其任務切換代碼如下:

      ;OS_TASK_SW
      ;/************************************************
      ;① 在當前任務(被搶占任務)的堆棧保存當前任務環境
      ;/************************************************
      STMFDSP!, {LR};LR中其實是任務切換時對應的PC值
      STMFDSP!, {LR}
      STMFDSP!, {R0R12}
      MRSR0,CPSR
      STMFDSP!,{R0}
      ;/************************************************
      ;② 獲取當前任務(被搶占任務)控制塊地址,地址在R0;獲取當
      ;前任務(被搶占任務)SP地址,在R1;保存新SP到當前任務(被
      ;搶占任務)的TCB
      ;/************************************************
      LDRR0,=OSTCBCur
      LDRR1,[R0]
      STRSP,[R1]
      ;/**********************************************
      ;③ 獲取新最高優先級任務控制塊地址,保存最高優先級任務
      ;地址到當前任務地址
      ;/************************************************
      LDRR2,=OSTCBHighRdy
      LDRR1,[R2]
      STRR1,[R0]
      ;/************************************************
      ;④ 獲取當前新任務SP
      ;/************************************************
      LDRSP,[R1]
      ;/************************************************
      ;⑤ 恢復任務環境
      ;/************************************************
      LDMFDSP!,{R0}
      MSRSPSR_csxf,R0
      LDMFDSP!,{R0R12,PC}^

    3.5 中斷結構和中斷處理程序的設計

      中斷結構和中斷處理程序的設計是嵌入式操作系統HAL中最重要的組成部分。中斷機制是操作系統內核實現與外部設備通信、任務系統調用、進行出錯處理,以及實現對任務的實時調度的重要手段。因此,層中斷系統的管理部分是整個層中的關鍵。

      μC/OS-II采用了二次跳轉的辦法。首先在處理器定義的中斷向量處安放跳轉指令,跳轉到指定位置后,再進行位置的第二次映射。其中位置的映射是通過一個匯編定義的宏來實現的。將μC/OS-II移植到中,其宏匯編的定義如下:

    MACRO
      $IRQ_Label HANDLER $IRQ_Exception_Function
      EXPORT$IRQ_Label; 輸出的標號
      IMPORT$IRQ_Exception_Function; 引用的外部標號

    $IRQ_Label
      SUBLR, LR, #4; 計算返回地址
      STMFDSP!, {R0R3, R12, LR}; 保存任務環境
      MRSR3, SPSR; 保存狀態
      STMFDSP, {R3, SP, LR}^; 保存用戶狀態的R3、SP、LR,注意不能回寫
      BL$IRQ_Exception_Function; 調用C語言的中斷處理程序
      ;/************************************************
      ;比較當前任務控制塊和最高優先級任務控制塊是否一致,如果一致則直接恢復任務環境;否則,在中斷退出時需要進行任務切換,CPU將運行優先級最高的任務,而不是中斷前運行的任務
      ;***********************************************
      LDRR0, =OSTCBHighRdy
      LDRR0, [R0]
      LDRR1, =OSTCBCur
      LDRR1, [R1]
      CMPR0, R1
      ADDSP, SP, #4*3
      MSRSPSR_cxsf, R3
      LDMEQFDSP!, {R0R3, R12, PC}^; 恢復環境
      LDRPC, =OS_TASK_SW; 調用進行任務切換
    MEND

      為了使用ISR的匯編宏,每個受μC/OS-II管理的ISR都必須按宏匯編要求的格式,在文件IRQ.S中定義:

      XXXX_HANDLERHANDLERXXXX_Exception

      其中:

      XXXX_HANDLER是ISR的起始地址,即匯編宏的起始地址,在初始化向量中斷控制器時作為中斷向量的地址使用。用戶按中斷源來命名,即把其中的XXXX換為具體的中斷源名稱。

      XXXX_Exception是用戶用C語言實現編寫的功能函數名。該函數供匯編宏調用,用戶可以按實際的中斷源來命名,即把XXXX換為具體的中斷源名稱。

    3.6 定時管理

      μC/OS-II需要一個周期性的中斷源來產生系統時鐘節拍。μC/OS-II利用了的Timer0作為定時器產生時鐘節拍。其實現步驟為:

      添加中斷句柄Timer0_HandlerHANDLER Timer0_Exception配置中斷源定時器T0IR = 0xffffffff;T0TC = 0;T0TCR = 0x01;T0MCR = 0x03;T0MR0 = (Fpclk / OS_TICKS_PER_SEC);配置向量中斷控制器extern void Timer0_Handler(void);VICVectAddr0 = (uint32)Timer0_Handler;VICVectCntl0 = (0x20 | 0x04);使能中斷VICIntEnable = 14;

    4 總結

      硬件抽象層的出現,使得嵌入式操作系統的設計者不需要考慮嵌入式系統硬件環境差異較大的問題,可以專心設計通用的操作系統,而將與硬件的接口部分留給硬件抽象層來實現,這樣大大提高了嵌入式操作系統在不同硬件平臺之間的移植能力。本文基于LPC2292硬件平臺,詳細介紹了μC/OS-II的硬件抽象層的方法,對其向其他平臺的移植提供了參考。


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 瑞丽市| 新干县| 嘉善县| 抚顺市| 射洪县| 师宗县| 和田县| 且末县| 杭州市| 昭觉县| 桑日县| 永顺县| 祥云县| 蕲春县| 台湾省| 沾益县| 柳河县| 揭东县| 洱源县| 绥宁县| 江达县| 石屏县| 北宁市| 双柏县| 宁武县| 固阳县| 铁力市| 张家港市| 龙门县| 镇江市| 南康市| 阿荣旗| 南江县| 昭平县| 射阳县| 台南县| 江山市| 宕昌县| 灯塔市| 济宁市| 石首市|