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