實(shí)時(shí)操作系統(tǒng)μC/OS- II在真空爐控制系統(tǒng)中的應(yīng)用
出處:xlg357300 發(fā)布于:2007-05-24 17:50:02
|
真空爐控制系統(tǒng)具有數(shù)據(jù)采集、處理、動(dòng)作實(shí)施、監(jiān)控、保護(hù)和網(wǎng)絡(luò)通信等功能。在正常工作時(shí),負(fù)責(zé)采集真空爐的運(yùn)行參數(shù),例如溫度、真空度、加熱元件的電壓、電流等相關(guān)參數(shù)。并對數(shù)據(jù)進(jìn)行處理,把處理結(jié)果與給定的工藝設(shè)置進(jìn)行比較后,發(fā)出相關(guān)執(zhí)行命令,在系統(tǒng)發(fā)生故障時(shí),控制系統(tǒng)還提供檢測、記錄、保護(hù)等功能。 該基于ARM的工業(yè)嵌入式系統(tǒng)價(jià)格便宜,功能強(qiáng)大,維護(hù)操作簡單,運(yùn)行穩(wěn)定,安全可靠。軟件部分工作,主要包括μC/OS-II的移植以及應(yīng)用軟件的編寫。 移植μc/OS-II的主要工作是處理器和編譯器相關(guān)代碼及BSP的編寫。 前提條件 (1) 處理器的c編譯器支持可重人函數(shù); (2) 程序中打開和關(guān)閉中斷; (3) 處理器支持中斷,并且能產(chǎn)生定時(shí)器中斷(uC/OS-II是通過定時(shí)器中斷來實(shí)現(xiàn)多任務(wù)的調(diào)度,即時(shí)間片的產(chǎn)生); (4) 處理器要具有一定的硬件堆棧數(shù)量。 (5) 處理器要有將堆棧指針和其他CPU寄存器存儲(chǔ)和讀出堆棧(或者內(nèi)存)的指令。 在此次系統(tǒng)改造中,使用的Atmel工業(yè)級(jí)處理器AT91RM9200(ARM920T)完全滿足以上條件。 UCOS肩動(dòng)中,系統(tǒng)在完成初的硬件初始化以后便轉(zhuǎn)入由開發(fā)者提供的main(),在main()中再調(diào)用一個(gè)內(nèi)核函數(shù)OSInit()來完成內(nèi)核的初始化,然后在完成了與應(yīng)用相關(guān)的初始化以后,就可以調(diào)用一個(gè)內(nèi)核函數(shù)OSStart()啟動(dòng)內(nèi)核的進(jìn)程調(diào)度。從上面的過程看出,main()函數(shù)其實(shí)是一個(gè)回調(diào)函數(shù),整個(gè)系統(tǒng)的人口是建立在特定CPU(匯編語言編寫的底層函數(shù)和數(shù)據(jù)結(jié)構(gòu))硬件初始化環(huán)境的程序中。 UCOS內(nèi)核引導(dǎo)裝入程序與硬件初始化程序連接,或者說在其上構(gòu)建內(nèi)核引導(dǎo)裝入程序。 引導(dǎo)程序針對具體的微處理器及其配置,完成系統(tǒng)內(nèi)存映射、中斷向量初始化、系統(tǒng)堆??臻g的分配和C語言變量初始化。,通過跳轉(zhuǎn)指令轉(zhuǎn)向C語言主程序main,在主程序中CPU的控制權(quán)交給操作系統(tǒng)。其中,內(nèi)存映射是對系統(tǒng)所使用的外部存儲(chǔ)器以及內(nèi)部使用的所有功能模塊的初始化,以便程序能正確地操作。中斷向量的初始化是將中斷處理程序存儲(chǔ)在相應(yīng)的中斷向量位置。系統(tǒng)堆??臻g的分配主要是對處理器的7種工作模式分別設(shè)置棧底和堆棧大小,這保證多任務(wù)切換或者異常中斷時(shí),當(dāng)前CPU的運(yùn)行狀態(tài)被保存,從而保證系統(tǒng)正常運(yùn)行。 主要包括如下步驟:標(biāo)志整個(gè)代碼的初始人口點(diǎn);設(shè)置異常中斷向量表;初始化存儲(chǔ)系統(tǒng);初始化MMU;將已經(jīng)初始化的數(shù)據(jù)搬運(yùn)到可寫的數(shù)據(jù)區(qū);初始化各個(gè)模式下的數(shù)據(jù)棧;初始化一些特殊外圍接口;中斷處理程序;使能IRQ異常中斷等。以上的步驟中根據(jù)處理器中相應(yīng)的寄存器,進(jìn)行數(shù)據(jù)的讀寫即可。 μC/OS-II移植 雖然μC/OS-II的大部分代碼是用C語言編寫,但還存在了一些與處理器相關(guān)的匯編語言代碼,從而實(shí)現(xiàn)對處理器寄存器的訪問以及堆棧的操作。μC/OS-II的體系結(jié)構(gòu)如圖1所示,可以看出μC/OS-II操作系統(tǒng)的移植主要是改寫如下3個(gè)文件:
OS_CPU.H OS_CPU.H包括一系列用#define定義的與處理器相關(guān)的數(shù)據(jù)類型、宏和常量,如關(guān)中斷、開中斷、任務(wù)切換和堆棧增長方式等。 (1) 數(shù)據(jù)類型定義 數(shù)據(jù)類型的修改與所用的編譯器相關(guān),不同的編譯器使用不同的字節(jié)長度表示同一數(shù)據(jù)類型。在系統(tǒng)中定義整型數(shù)據(jù)結(jié)構(gòu)為32位的整數(shù)。 (2) 堆棧單位及增長方向 在任務(wù)切換時(shí),CPU現(xiàn)場的寄存器將保存在當(dāng)前運(yùn)行任務(wù)的堆棧中,所以O(shè)S_STK數(shù)據(jù)類型應(yīng)與CPU的寄存器長度一致。 AT91RM9200堆棧由高地址向低地址增長。在函數(shù)調(diào)用時(shí),人口參數(shù)和返回地址一般保存在當(dāng)前任務(wù)的堆棧中,編譯器的編譯選項(xiàng)和由此生成的堆棧指令就會(huì)決定堆棧的增長方向。置Os_stk_growth為0,表示堆棧從下(低地址)往上遞增。 (3) 宏定義 包括開關(guān)中斷的宏定義,以及進(jìn)行任務(wù)切換的宏定義。 μc/OS-II在處理臨界代碼時(shí)要先關(guān)中斷,處置完后再打開,這樣可保護(hù)臨界代碼不被多任務(wù)和中斷服務(wù)子程序破壞,處理器提供匯編指令os_enter_critical()、os_exit_critical()來開關(guān)中斷。通過對os_critical_method賦值來選擇方式。 Os_task_sw()是從低優(yōu)先級(jí)任務(wù)切換到高優(yōu)先級(jí)任務(wù)時(shí)須用到的一個(gè)宏。Os_task_sw()總是在任務(wù)級(jí)代碼中被調(diào)用。 OS_GPU_C.C OS_CPU_C.C中包括一系列C語言函數(shù):OSTaskStkInit()和若干個(gè)Hook函數(shù)。必要的是OSTaskStkInit(),其他9個(gè)只須聲明,并不一定包含任何代碼。 實(shí)現(xiàn)任務(wù)初始化時(shí)的堆棧設(shè)計(jì)。在ARM體系結(jié)構(gòu)下,任務(wù)堆??臻g由高至低依次保存著pc、lr等寄存器。一方面,當(dāng)前任務(wù)堆棧初始化完成后,OSTaskStkInit返回新的堆棧指針STK,OSTaskCreate()執(zhí)行時(shí),將會(huì)調(diào)用OSTaskStkInit的初始化過程,然后通過OSTCBInit()函數(shù)調(diào)用,將返回的SP指針保存到該任務(wù)的TCB塊中;其次,初始狀態(tài)的堆棧是模擬了中斷后的堆棧結(jié)構(gòu),因?yàn)槿蝿?wù)創(chuàng)建后并不是直接就獲得執(zhí)行,而是通過OSSched()函數(shù)進(jìn)行調(diào)度分配,滿足執(zhí)行條件后才能獲得執(zhí)行。為使調(diào)度簡單一致,預(yù)先將該任務(wù)的PC指針和返回地址LR都指向函數(shù)人口,以便被調(diào)度時(shí)從堆棧中恢復(fù)剛開始運(yùn)行時(shí)的CPU現(xiàn)場。 OSTaskstkInit()在創(chuàng)建任務(wù)時(shí)被OSTaskCreate()或OSTaskCreateExt()調(diào)用來初始化任務(wù)的堆棧結(jié)構(gòu)。表1顯示了在AT91RM9200中需要放到任務(wù)堆棧中的寄存器及其順序。
OSTaskStkInit()的代碼如下,4個(gè)參數(shù)中,task是任務(wù)的起始地址,pdata是傳給任務(wù)的數(shù)據(jù)指針,ptos是初的SP,opt沒有用到。函數(shù)返回的是全部人棧操作完成后的新的SP。
OS_CPU_C.ASM OS_CPU_A.ASM中包括4個(gè)匯編語言函數(shù):OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。 Osstart()調(diào)用OSStartHighRdy()函數(shù)使就緒態(tài)任務(wù)中優(yōu)先級(jí)的任務(wù)開始運(yùn)行。任務(wù)級(jí)的切換是通過執(zhí)行軟中斷指令,或依據(jù)處理器的不同,執(zhí)行陷阱指令實(shí)現(xiàn)。中斷服務(wù)子程序、陷阱或異常處理的向量地址必須指向OSCtxSw()。 OSIntCtxSw0實(shí)現(xiàn)中斷級(jí)的任務(wù)切換,在ISR中被調(diào)用的,由于所有的CPU寄存器都已經(jīng)被ISR正確地保存到了被中斷任務(wù)的堆棧之中,并且如果該ISR是中斷嵌套的層,則ISR已經(jīng)將SP保存到被中斷任務(wù)的任務(wù)控制塊(TCB)中了。因此除了不需要再保存CPU寄存器和堆棧指針外,OSIntCtxSw()完全可以采用OSCtxSw()中的大部分代碼,實(shí)際上本系統(tǒng)中的中斷級(jí)切換就是直接跳轉(zhuǎn)到OSCtxSw()中的標(biāo)號(hào)為_OSIntCtxSw的那一行的。 μC/OS-II要求用戶提供一個(gè)周期性的時(shí)鐘源實(shí)現(xiàn)時(shí)間的延遲和超時(shí)功能,可以使用硬件定時(shí)器,也可以從交流電中獲得50/60Hz的時(shí)鐘頻率。Osintexit()通過調(diào)用osintctxsw ()函數(shù)在ISR中執(zhí)行任務(wù)切換功能。 OSTickISR()的主要任務(wù)就是調(diào)用函數(shù)OSTimeTick(),其作用是給每個(gè)需要延時(shí)的任務(wù)的延時(shí)時(shí)間OSTCBDly減1(如果該項(xiàng)不為零的話)。當(dāng)某個(gè)任務(wù)的OSTCBDly減到了零,這個(gè)任務(wù)就進(jìn)入了就緒態(tài)。具體代碼如下: 將μC/OS-II引入嵌入式系統(tǒng)后,應(yīng)用程序的設(shè)計(jì)就變得非常簡單。盡管真空爐控制功能繁多,但可以將比較復(fù)雜的程序?qū)哟位?,按照功能劃分為多個(gè)任務(wù),各個(gè)任務(wù)可以分別編寫,但要事先設(shè)計(jì)好任務(wù)間的通信方式,這樣程序?qū)⒏菀组_發(fā)與維護(hù)。 我們根據(jù)應(yīng)完成的功能將應(yīng)用軟件劃分為十個(gè)用戶任務(wù)和4個(gè)ISR,按照任務(wù)的重要性和是否具有硬實(shí)時(shí)性來分配優(yōu)先級(jí),優(yōu)先級(jí)數(shù)值越低,任務(wù)的優(yōu)先級(jí)越高。所有給任務(wù)分配的優(yōu)先級(jí)都是在用戶自定義頭文件userdef.h中用宏來定義的,由于保護(hù)處理任務(wù)需要大量的局部變量空間,故而該任務(wù)的堆棧非常大,為2048字節(jié),其余任務(wù)均為128字節(jié)。所有任務(wù)的編號(hào)、名稱和功能描述如表2所列。
任務(wù)其實(shí)就是一個(gè)簡單的無限循環(huán)的程序,該程序可以認(rèn)為CPU完全只屬于它自己。在循環(huán)中必須調(diào)用延時(shí)或等待消息等函數(shù),以便將CPU控制權(quán)交給其他的任務(wù)。在上述任務(wù)中,比較復(fù)雜的就是保護(hù)處理任務(wù)。它根據(jù)A/D中斷子程序中采集到的瞬時(shí)值計(jì)算出電流的基波及二次諧波分量,結(jié)合相應(yīng)的電壓信號(hào),判斷是否有線路故障,如是則啟動(dòng)故障后錄波,然后向主站上報(bào)故障信息。除此之外,該任務(wù)還能配合通信任務(wù)進(jìn)行遠(yuǎn)方或當(dāng)?shù)囟ㄖ嫡?。任?wù)流程從略。 μC/OS-Ⅱ提供一個(gè)計(jì)算CPU使用率的統(tǒng)計(jì)任務(wù)OSTaskStat()。該任務(wù)每秒鐘運(yùn)行,計(jì)算當(dāng)前的CPU使用率。如果應(yīng)用程序打算使用統(tǒng)計(jì)任務(wù),必須在初始化時(shí)建立一個(gè)的任務(wù),并且只在這個(gè)任務(wù)中調(diào)用OSStatInit()。換句話說,在調(diào)用系統(tǒng)啟動(dòng)函數(shù)OSStart()之前,必須先建立一個(gè)任務(wù),在這個(gè)任務(wù)中調(diào)用統(tǒng)計(jì)初始化函數(shù)OSStatInit(),然后再建立應(yīng)用程序中的其他任務(wù)。 有時(shí)候決定任務(wù)實(shí)際所需的堆棧大小是很有必要的,這樣我們就可以避免為任務(wù)分配過多的堆棧空間。μC/OS-II提供的函數(shù)OSTaskStkChk()可以為開發(fā)者提供這種有價(jià)值的信息。每調(diào)用該函數(shù),就會(huì)執(zhí)行堆棧檢驗(yàn)。每次在調(diào)用OSTaskStkChk()的時(shí)候,可能會(huì)得到不同的空閑空間數(shù)。應(yīng)該讓應(yīng)用程序運(yùn)行足夠長的時(shí)間,才有可能經(jīng)歷壞的堆棧使用情況,這樣才能得到正確的信息,我們就可以據(jù)此重新設(shè)置堆棧的終容量了。 實(shí)測證明,采用μC/OS-II提高了系統(tǒng)的實(shí)時(shí)性,特別是提高了通信處理和保護(hù)處理等較高優(yōu)先級(jí)任務(wù)的響應(yīng)速度。在滿足系統(tǒng)對實(shí)時(shí)性的整體要求的基礎(chǔ)上,μC/OS-II所采用的基于優(yōu)先級(jí)的調(diào)度策略可以限度地滿足關(guān)鍵的任務(wù)。同時(shí)以μC/OS-II作為整個(gè)軟件體系的基礎(chǔ),非常方便應(yīng)用軟件的模塊化設(shè)計(jì)。各個(gè)任務(wù)之間除通過μC/OS-II提供的函數(shù)進(jìn)行通信之外,沒有其他的聯(lián)系途徑,這種松耦合結(jié)構(gòu)提高了整個(gè)軟件的可靠性。 | |||
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04
- PCB焊盤與過孔設(shè)計(jì)核心實(shí)操規(guī)范(含可焊性與可靠性保障)
- 汽車電子常用電子元器件選型指南
- MOSFET驅(qū)動(dòng)與隔離方案設(shè)計(jì)
- 高溫環(huán)境下電源IC選型建議
- 安防監(jiān)控設(shè)備連接器應(yīng)用分析
- 高速PCB信號(hào)完整性(SI)設(shè)計(jì)核心實(shí)操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計(jì)算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護(hù)設(shè)計(jì)
- 連接器耐腐蝕性能測試方法














