<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    μC/OS-II在S3C44BOX處理器上的移植

    發布時間:2010-11-17 12:46    發布者:designer
    關鍵詞: S3C44BOX , 處理器 , 移植
    介紹實時操作系統μC/OS-II的特點和內核結構,給出μC/OS-II在Samsung嵌入式S3C44BOX ARM7微處理器上的移植的步驟及詳細相關代碼,同時闡述μC/OS-II在應用中應注意的問題。

    μC/OS-II功能強大,支持56個用戶任務,其內核為占先式,支持信號量、郵箱、消息隊列等多種常用的進程間通信機制,現已成功應用到眾多商業嵌入式系統中,是一個成熟穩定的實時內核。與大多商用RTOS不同的是,μC/OS-II公開所有的源代碼,90%的代碼使用標準的ANSI C語言書寫,程序可讀性強、移植性好;同時它可免費獲得,即使商業應用也只收取少量的許可費用。因此,對μC/OS-II實時操作系統的學習研究、開發、應用具有重要意義。  

    Samsung S3C44B0X微處理器是三星公司專為手持設備和其它嵌入式應用提供的高性價比的微控制器解決方案。它使用ARM公司的16位/32位RISC結構,內核是ARM7TDMI,工作在66MHz,片上集成了以下部件:8K Cache、外部存儲器控制器、LCD控制器、4個DMA通道、2個UART、1個多主I2C總線控制器、1個I2C總線控制器,以及5通道PWM定時器和1個內部定時器、8通道12位ADC等,能夠與常用的外圍設備實現無縫連接,功能強大。目前,國內應用較為廣泛。





    1 μC/OS-II實時操作系統結構  

    圖1說明了μC/OS-II的軟硬件體系結構。應用程序處于整個系統的頂層,每個任務都可以認為自已獨占了CPU,因而可以設計成為一個無限循環。μC/OS-II處理器無關的代碼提供了μC/OS-II的系統服務,應用程序可以使用這些API函數進行內存管理、任務間通信及創建、刪除任務等。  

    大部分的μC/OS-II代碼是使用ANSI C語言書寫的,因此μC/OS-II的可移植性好,然而仍需要使用C和匯編語言寫一些處理器相關代碼。μC/OS-II的移植需要滿足以下要求:  

    ①處理器的C編譯器可以產生可重入代碼;  
    ②可以使用C調用進入和退出臨界區代碼;  
    ③處理器必須支持硬件中斷,并且需要一個定時中斷源;  
    ④ 處理器需要能夠容納一定數據的硬件堆棧;  
    ⑤處理器需要有能夠在CPU寄存器與內核和堆棧交換數據的指令。  

    S3C44B0X處理器完全滿足上述要求。  

    2 實時內核μC/OS-II在S3C44B0X上的移植  

    我們使用ARM SDT編譯器,移植μC/OS-II主要包括以下幾個步驟。  

    (1)設置OS_CPU.H中與處理器和編譯器相關的代碼  
    *************************************************  
    與編譯器相關的數據類型  
    *************************************************  
    typedef unsigned char BOOLEAN;  
    typedef unsigned char INT8U; /*8位無符號整數*/  
    typedef signed char INT8S; /*8位有符號整數*/  
    typedef unsigned short INT16U; /*16位有符號整數*/  
    typedef signed short INT16S; /*16位無符號整數*/  
    typedef unsigned long INT32U; /*32位無符號整數*/  
    typedef signed long INT32S; /*32位有符號整數*/  
    typedef float FP32; /*單精度浮點數*/  
    typedef double FP64; /*雙精度浮點數*/  
    typedef unsigned int OS_STK;/*堆棧入口寬度為16位*/與ARM處理器相關的代碼:  
    #define OS_ENTER_CRITICAL () ARMEnableInt() /*開啟中斷*/  
    #define OS_STK_GROWTH 1 /*堆棧由高地址向低地址增長*/  

    (2)用C語言編寫6個操作系統相關的函數(OS_CPU_C.C)  
    void OSTaskStkInit(void(task)(void *pd),void *pdata,void *ptos,INT16U opt)  
    { unsigned int *stk;  
    opt =opt; /*因“opt”變量沒有用到,防止編譯器產生警告*/  
    stk =(unsigned int *)ptos; /*裝載堆棧指針*/  
    /*為新任務創建上下文*/  
    *--stk=(unsigned int)task; /*lr*/  
    *--stk=(unsigned int)task /*pc*/  
    *--stk=0; /*r12*/  
    *--stk=0; /*r11*/  
    *--stk=0; /*r10*/  
    *--stk=0; /*r9*/  
    *--stk=0; /*r8*/  
    *--stk=0; /*r7*/  
    *--stk=0; /*r6*/  
    *--stk=0; /*r5*/  
    *--stk=0; /*r4*/  
    *--stk=0; /*r3*/  
    *--stk=0; /*r2*/  
    *--stk=0; /*r1*/  
    *--stk=(unsigned int)pdata; /*r0*/  
    *--stk=(SVC32MODE|0x0|); /*cpsr IRQ,  
    *--stk=(SVC32MODE|0x0); /*spsr IRQ,關閉FIQ*/  
    return((void*)stk);  
    }  
    后5個函數是鉤子函數,可以不加代碼:  
    void OSTaskCreateHook(OS_TCB *ptcb)  
    void OSTaksDelHool (OS_TCB *ptcb)  
    void OSTaskSwHook(void)  
    void OSTaskStatHook(void)  

    (3)用匯編語言編寫4個與處理器相關的函數(OS_CPU.ASM)  
    OSStartHighRdy() ;運行優先級最高的就緒任務  
    LDR r4,addr_OSTCBCur ;得到當前任務的TCB地址  
    LDR r5,addr_OSTCBHighRdy ;得到高優先級任務的TCB地址  
    LDR r5,addr_OSTCBHighRdy ;得到高優先級任務的TCB地址  
    LDR r5,[r5] ;得到堆棧指針  
    LDR sp,[r5] ;切換到新的堆棧  
    STR r5,[r4] ;設置新的當前任務的TCB地址  
    LDMFD sp!,{r4}  
    MSR CPSR_cxsf,r4  
    LDMFD sp!,{r0-r12,lr,pc} ;開始新的任務  
    END  
    OSCtxsw() 任務級的任務切換函數  
    STMFD sp!,{lr} ;保存PC指針  
    STMFD sp!,{lr} ;保存lr指針  
    STMFD sp!,{r0-r12} ;保存寄存器文件和返回地址  
    MRS r4,CPSR  
    STMFD sp!,{r4} ;保存當前PSR  
    MRS r4,SPSR  
    STMFD sp!,{r4}  
    ;OSPrioCur=OSPrioHighRdy  
    LDR r4,addr_OSPrioCur  
    LDR r5,addr_OSPrioHighRdy  
    LDRB r6,[r5]  
    STRB r6,[r4]  
    ;得到當前任務的TCB地址  
    LDR r4,addr_OSTCBCur  
    LDR r5,[r4]  
    STR sp,[r5] ;保存棧指針在占先任務的TCB上  
    ;取得高優先級任務的TCB地址  
    LDR r6,addr_OSTCBHighRdy  
    LDR r6,[r6]  
    LDR sp,[r6] ;得到新任務的堆棧指針  
    ;OSTCBCur=OSTCBHighRdy  
    STR r6,[r4]  
    ;得到當前新任務的TCB地址  
    LDMFD sp!,{r4}  
    MSR SPSR_cxsf,r4  
    LDMFD sp!,{r4}  
    MSR SPSR_cxsf,r4  
    LDMFD sp!,{r0-r12,lr pc}  
    OSIntCtxSw() ;中斷級的任務切換函數  
    LDMIA sp!,{al-vl,lr}  
    SUBS pc,lr,#4  
    SUB lr,lr,#4  
    MOV r12,lr  
    MRS lr,SPSR  
    AND lr,lr,#0XFFFFFE0  
    ORR lr,lr,#0XD3  
    MSR CPSR_CXSF,lr  
    OSTickISR() ;中斷服務函數  
    STMDB sp!,{r0-r11,lr}  
    MRS r0,CPSR  
    ORR r0,r0,#0x80; ;設置中斷禁止標志  
    MSR CPSR_cxsf,r0 ;中斷結束  
    LDR r0,I_ISPC  
    LDR r1,=BIT_TIMER0  
    STR r1,{r0}  
    BL IrqStart  
    BL osTimeTick  
    BL IrqFinish  
    LDR r0,=need_to_swap_context  
    LDR R2,[R0]  
    CMP r2,#1  
    LDREQ pc,=_CON_SW  
    完成上述工作后,μC/OS-II就可以運行在ARM處理器上了。  

    3 使用μC/OS-II系統應注意的問題  

    ①μC/OS-II和Linux等分時操作系統不同,不支持時間片輪轉法。它是一個基于優先級的實時操作系統。每一個任務的優先級必須不同(分析它的源碼會發現,μC/OS-II把任務的優先級當作任務在標識來使用,如果優先級相同,任務將無法區分)。進入就緒態的優先級最高的任務首先得到CPU的使用權,只有等它交出CPU的使用權后,其它任務才可以被執行。所以,它只能就是多任務,不能就是多進程,至少不是我們所熟悉的那種多進程。  

    ②μC/OS-II對共享資源提供了保護的機制。μC/OS-II是一個支持多任務的操作系統。我們可以把一個完整的程序劃分成幾個任務,不同的任務執行不同的功能。對于共享資源(比如串口),μC/OS-II也提供了很好的解決辦法,一般情況下使用的是信號量方法。我們創建一個信號量并對它進行初始化,當一個任務需要使用一個共享資源時,它必須先申請得到這個信號量。在這個過程中即使有優先權更高的任務進入了就緒態,因為無法得到信號量,也不能使用該資源。在μC/OS-II中稱為優先級反轉。簡單地說,就是高優先級任務必須等待低優先級任務的完成。在上述情況下,在兩個任務之間發生優先級后轉是無法避免的。所以不在使用μC/OS-II時,必須對所開發的系統了解清楚才能選擇對于某種共享資源是否使用信號量。  

    ③μC/OS-II內存管理不夠完善。在分析許多μC/OS-II的應用實例中發現,任務?臻g和內存分區的創建采用了定義全局數組的方法,這樣實現起來固然簡單,但不夠靈活有效。  

    編譯器會將全局數組作為未初始化的全局變量,放到應用程序映像的數據段。數組的大小是固定的,生成映像后不可能在使用中動態地改變。對于任務?臻g來說,數組定義大了會造成內存浪費;定義小了任務棧溢出,會造成系統崩潰。對于內存分區,在不知道系統初始化后給用戶留下了多少自由內存空間的情況下,很難定義內存分區所使用數組的大小。此外,現在μC/OS-II只支持固定大小的內存分區,容易造成內存浪費。μC/OS-II將來應該被改進以支持可變大小的內存分區。因此,系統初始化后能清楚地掌握自由內存空間的情況是很重要的。所以,應避免使用全局數組分配內存空間,關鍵是要知道整個應用程序在編譯、鏈接后代碼段和數據段的大小,在目標板內存中是如何定位,以及目標板內存的大小。  

    總之,隨著各種智能嵌入式系統的復雜化和系統實時性需求的提高,伴隨應用軟件朝著系統化發展的加速,功能強大的實時操作系統μC/OS-II將會有更大的發展。
    本文地址:http://www.portaltwn.com/thread-40079-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷