文獻標識碼: A
文章編號: 0258-7998(2014)09-0010-04
Nucleus操作系統(tǒng)作為一個實時性較強的嵌入式操作系統(tǒng)具有較高可移植性,,目前在ARM(Advanced RISC Machines)架構上已經(jīng)成功實現(xiàn)移植,現(xiàn)有文獻中實現(xiàn)多基于較老的ARM7或是ARM9架構,,并且介紹籠統(tǒng),,和實際結合不緊密[1-2]。本文詳細介紹Nucleus在ARM11架構上的移植,,以S3C6410芯片的實驗數(shù)據(jù)為證,,分析在移植過程的內存分配、堆棧配置,、時鐘,、中斷設置。文中詳細闡述了具體應用于TD-LTE系統(tǒng)時,,移植過程中啟動模塊設計對系統(tǒng)性能的影響,,以及內核移植中的關鍵接口和系統(tǒng)任務調度方式。
1 基本啟動流程與內存分配
移植過程中的基本流程如圖1所示,。
流程中的各個部分的設置并非是像框圖這樣獨立開來的,,在實際的應用設計中各個模塊都是互相有聯(lián)系的,會根據(jù)加載方式的不同,、內存分配的差異或是具體功能的要求而產(chǎn)生關聯(lián)性的改變,。在后面幾個重要模塊的移植過程介紹中也會對此詳述。
移植的目的在于應用,,本移植應用于TD-LTE無線綜合測試儀中(該產(chǎn)品采用ARM11架構的S3C6410芯片),,為該產(chǎn)品實現(xiàn)協(xié)議層的任務調度。很多實驗項目中采用手動方式加載啟動模塊,,然而在應用中,,實現(xiàn)一個產(chǎn)品不可能像普通的調試程序一樣手動加載驅動與操作系統(tǒng),然后進入任務調度,,因此需要實現(xiàn)自動加載而利用到Flash,。
另外中斷向量表設置必須從內存起始地址0x0000-0000加載[3],否則無法實現(xiàn)正常硬件中斷,而在中斷產(chǎn)生時使得程序異常終止,。在啟動時首先要完成兩個模塊的加載,,一是硬件的初始化模塊,需要在SROM啟動調試模式下燒寫到Flash中,,F(xiàn)lash啟動模式下自動加載到0x0c000000上并自動拷貝到0x00000000運行,;第二個模塊是操作系統(tǒng)的初始化模塊,在啟動過程中Flash自動燒寫加載到DDR中運行 [4],,操作系統(tǒng)模塊同樣需要設置中斷向量表,。然而這時的起始內存地址0x00000000已經(jīng)被模塊一占用,,因此需要設計一種機制在啟動過程中動態(tài)加載操作系統(tǒng)。
這些限制都是在中斷向量表設置與內存分配中需要綜合考慮的,。下面介紹兩種方式來實現(xiàn)上述啟動加載,并在后文進行比較測試,。
1.1 基于MMU的啟動設計
傳統(tǒng)的MMU(存儲器管理單元)方式,,即是在內存上做映射。具體方案是在第一部分的硬件初始化程序段中從0x50000000到0x59000000的DDR物理地址做地址映射,,實現(xiàn)中在0x50000000到0x51000000部分存放頁表,,建立虛擬存儲空間,映射地址為0x00000000到0x08000000,,這樣可以在SROM啟動模式和Flash啟動模式下將帶有中斷向量表的操作系統(tǒng)模塊從映射過的0x00000000位置加載,,完成中斷向量表設置[4]。內存分配方式如圖2所示,。
但是映射后讀寫系統(tǒng)數(shù)據(jù)時會使用到頁表查詢來計算實際物理地址,,影響到系統(tǒng)效率。
1.2 基于重寫的啟動設計
映射方式雖然設計與加載方面比較簡單方便,,但是由于采用了MMU會產(chǎn)生頁,、段等數(shù)據(jù)換算,同時還要兼顧DDR的運行速度,,數(shù)據(jù)讀寫速度可能跟不上,,因此在設計過程中也設計了第二套方案,考慮如何在不使用MMU的條件下實現(xiàn)啟動加載[5],。采用重寫方式來實現(xiàn),。由于函數(shù)調用會使用到堆棧空間,,因此重寫部分必須在操作系統(tǒng)模塊堆??臻g分配完成后實現(xiàn),采用memcpy()函數(shù)(內存復制函數(shù))將在0x50000000位置的中斷向量表復制重寫到0x00000000地址,。由于系統(tǒng)在0x50000000后面的地址上運行,,這種方法在中斷發(fā)生時會有比較大的內存跨越尋址,也會對系統(tǒng)執(zhí)行效率有些許影響,。此外這種方法還有一個無法避免的缺點,,就是在SROM啟動的調試模式無法實現(xiàn),因為S3C6410在該啟動模式下0x00000000是只讀的(無法重寫),,因此只能在Flash啟動模式加載,。
1.3 兩種啟動方式的性能對比
上述兩種方案各有優(yōu)缺點,因此筆者通過在現(xiàn)實情況比較接近的中斷頻率條件下寫入等量數(shù)據(jù)到相同內存下,,并比較寫入時間來確定較優(yōu)方案,。通過在寫數(shù)據(jù)前后拉高拉低電平來統(tǒng)計時間,,在0.5 ms一次的中斷頻率下,寫10萬個8 bit數(shù)據(jù)到操作系統(tǒng)中聲明的相同數(shù)組上,,所用時間在示波器上的截圖如圖3所示,。
圖中X部分是使用了MMU的映射內存啟動模式,10萬8 bit數(shù)據(jù)耗時約2.82 ms,,而Y部分所示采用重寫方式下耗時約為1.33 ms,,可見采用重寫方式加載中斷向量表具有比較明顯的執(zhí)行效率優(yōu)勢,更能滿足實際需求,。當然在調試過程中采用MMU方式是比較便于調試修改的,,無需每次修改后都進行Flash燒寫,而且MMU方式對ARM7以上架構具有普遍實用性,,而重寫方式僅在本實例中實現(xiàn),,因此MMU方式也有其實用性。
2 中斷與定時器
定時器是通過中斷來實現(xiàn)的,,這里一并介紹,。首先在Nucleus的啟動代碼加載前配置文件存儲區(qū)域結束地址,通??刹捎脴耸痉皘Image$$ZI$$Limit|”作為堆棧起始加載地址,,避免加載運行后,破壞代碼存儲區(qū),;其次需要在Nucleus內核初始化區(qū)域中對高級中斷進行配置并設置堆棧區(qū)域,,以支持定時器初始化;然后傳遞堆棧分配結束地址到應用初始化模塊,,用于動態(tài)分配內存池,;最后切換到SVC模式運行系統(tǒng),方便系統(tǒng)設置與模式切換,。上述幾點是Nucleus內核加載配置的幾個關鍵點,。
2.1 硬中斷(低級中斷)
硬中斷是由硬件觸發(fā)的中斷,通過硬件引腳的電平變動觸發(fā),,有最高的實時性,,且可以通過公共引腳來實現(xiàn)外部設備的交互。本文介紹其中3個關鍵中斷,,分別對應S3C6410的VIC0,、VIC1、VIC28(Vectored Interrupt Controller)寄存器,,其中VIC0與VIC1對應外部中斷,,本文在應用中設計為DSP中斷與FPGA中斷,VIC28對應PWM定時器,其他功能性中斷在這里就不贅述,。
在設計中采用IRQ中斷模式,,中斷發(fā)生時現(xiàn)場保護比較重要,值得注意的是在低級中斷中采用C語言自帶的“__irq”做返回值的方法來保護現(xiàn)場是不可取的,,Nucleus硬中斷需要對寄存器做更有針對性的保護,,Nucleus提供了內核級接口對現(xiàn)場做詳細保護。首先在IRQ中斷入口處對A1到A4寄存器做壓棧保護,,并保存IRQ模式下的lr寄存器,,然后調用Nucleus提供的函數(shù)TCT_Interrupt_Context_Save(內核函數(shù))現(xiàn)場保護,并在中斷服務處理完成后調用TCT_Interrupt_Context_Restore(內核函數(shù))恢復現(xiàn)場,。
2.2 高級中斷
高級中斷可以有效處理低級中斷中需要高效處理或是嵌套處理實時任務的情況。以本應用為例,,由于FPGA中斷服務中做的數(shù)據(jù)處理需要消耗一定的時間,,而且在系統(tǒng)IRQ中斷過程中IRQ中斷處于屏蔽狀態(tài),因此會出現(xiàn)在中斷處理過程中積壓后面的中斷服務的情況,,這里就可以設置高級中斷,,在低級中斷服務中只需將高級中斷激活,耗時極短,,數(shù)據(jù)處理由操作系統(tǒng)在高級中斷中調度完成,。圖4中第一行波形高電平段為FPGA中斷。
此外在有強時序性的任務調度中,,也可以使用高級中斷來保障時序同時不影響系統(tǒng)低級中斷的實時性,。在本應用中DSP中斷中的數(shù)據(jù)處理與協(xié)議棧小區(qū)激活部分的數(shù)據(jù)處理都具有強時序性同時由于數(shù)據(jù)處理量較大會影響系統(tǒng)實時性,導致指針號無法對齊或指針號記錄積壓等問題,,這里也需要使用高級中斷來激發(fā)任務,,加強系統(tǒng)實時性。圖4中第二行高電平段為DSP中斷數(shù)據(jù)處理,。
從圖4中可以看出,,采用了高級中斷的FPGA子幀中斷的時間非常的短,幾乎可以忽略不計,,第二行的高電平為DSP處理消息時需要耗費的時間長度為465 ?滋s,,可見該處理時間較長,若在低級中斷中處理很可能影響到FPGA中斷的時序,,從而影響系統(tǒng)時序,。在圖中明顯可以看到低級中斷與任務處理間的調度時間間隔在微秒級,完全滿足系統(tǒng)實時性的性能指標,。同時在DSP數(shù)據(jù)處理完成后后續(xù)任務的執(zhí)行在第三行波形中顯示出來,,運行時序正常。
2.3 定時器設計與中斷整體設計
操作系統(tǒng)定時器采用PWM硬件定時器做節(jié)拍計時,,根據(jù)TD-LTE無線綜合測試儀的設計要求,,采用了0.5 ms一次的節(jié)拍頻率作為操作系統(tǒng)定時的基本單位,。設計中采用Timer4硬件定時器,并開啟自動重置(Auto-Reload)模式使計時持續(xù),。在每0.5 ms產(chǎn)生一次的定時器硬件中斷中調用TMT_Timer_Interrupt()函數(shù)(內核函數(shù))來將硬件定時器與Nucleus操作系統(tǒng)關聯(lián)[6],。整體中斷設計如圖5所示。
移植應用中可以通過PWM調整定時器單位時間,,如果使用了外部設備中斷產(chǎn)生單位時間中斷,,也可作為定時器使用,只需要把TMT_Timer_Interrupt()放在該外部中斷中即可,。
3 任務調度
根據(jù)TD-LTE無線綜合測試儀中的設計要求TD-LTE任務流程與觸發(fā)方式涉及到應用初始化與任務調度設置兩個模塊,。在應用初始化內需要做內存池初始化、任務初始化,、隊列初始化,、時鐘設置初始化與高級中斷初始化等工作,這些工作比較常規(guī)在這里不再詳述,。任務調度設置需要根據(jù)協(xié)議棧各層順序設置,,在各層任務中需要設置任務觸發(fā)方式,任務流程如圖6所示,。
本文采用隊列方式進行任務調度,。各任務間采用消息機制觸發(fā)并支持搶占,操作系統(tǒng)運行時首先在循環(huán)調度中按順序調度任務并將每個任務掛起,,在此之后的調度中在每個任務中檢查隊列中是否有對應消息,,需要執(zhí)行該層任務的時候就在前一個任務中發(fā)送該層對應消息到隊列中,檢測到消息后該層任務從掛起狀態(tài)進入就緒或執(zhí)行狀態(tài),,不需要執(zhí)行該層任務的時候不發(fā)送消息給該層,,該層任務在檢測不到消息的情況下就會掛起任務等待下一次調用[7],在沒有任務的情況下系統(tǒng)進入idle狀態(tài)等待計時器激活或是硬件中斷發(fā)生,。其中小區(qū)激活與DSP任務采用外部硬件中斷機制激活,,外部中斷激活高級中斷,任務在高級中斷來執(zhí)行,,既可以滿足操作系統(tǒng)實時性也可以很好的管理好各層任務,。
操作系統(tǒng)移植過程中不僅需要從硬件角度來實現(xiàn)操作系統(tǒng)的正常運作還需要綜合考慮系統(tǒng)的管理性能與整個系統(tǒng)的執(zhí)行效率和實時性。移植后在ARM Workbench IDE v4.0與RealView Debugger v4.0上編譯調試,,并通過測試板驗證和聯(lián)機驗證,,運行結果和理論值一致。此移植具有較強的獨立性和穩(wěn)定性,,優(yōu)化了系統(tǒng)資源利用率,,實現(xiàn)了任務中斷與任務調度的高強度反復穩(wěn)定運行,符合項目“TD-LTE無線終端綜合測試儀表” 調試中對系統(tǒng)實時性與資源調度的要求并應用于其中。
參考文獻
[1] 李書根,,潘海燕,,王培.一種嵌入式實時操作系統(tǒng)高可靠文件系統(tǒng)[J].微電子學與計算機,2014,,31(2):14-16.
[2] 徐宇柘,,鐘銳.Nucleus實時操作系統(tǒng)在繼電保護系統(tǒng)中的實時性研究[J].電腦知識與技術,2007(13):3-4.
[3] 杜春雷.ARM體系結構與編程[M].北京:清華大學出版社,,2003.
[4] Samsung Electronics.S3C6410X RISC microprocessor user′smanual[Z].2008.
[5] LEE J,,PARK J,HONG S.Memory footprint reduction withquasi-static shared libraries in MMU-less embedded sys-tems[C].Real-Time and Embedded Technology and Appli-cations,,2006,,Proceedings of the 12th IEEE,2006:24-36.
[6] Accelerated Technology,,Inc..Nucleus NET reference man-ual[Z].2005.
[7] NGOLAH C F,,Wang Yingxu,Tan Xinming.Implementingtask scheduling and event handling in RTOS+[C].Electricaland Computer Engineering,,2004,Canadian Conference,,2004:1523-1526.