咨詢電話
ENGLISH0755-88840386發(fā)布時間:2019-11-18 08:57:47 |來源:網(wǎng)絡(luò)轉(zhuǎn)載
1 引言
隨著嵌入式系統(tǒng) EOS 應(yīng)用的日益廣泛,控制系統(tǒng)的規(guī)模和難度也隨之加大,對嵌入式系統(tǒng)的軟件開發(fā)效率的要求也越來越高,像 μcos,Lin-ux,RTX 等,尤其 RTX 和 μcos 更加突出其實時性,在稱重控制行業(yè),越來越多的稱重控制儀表都采用嵌入式操作系統(tǒng),在沒有操作系統(tǒng)支持的情況下,多任務(wù)調(diào)度成為單片機應(yīng)用系統(tǒng)構(gòu)造上的重要難題 [1] 。比起傳統(tǒng)在單片機上運行程序,它的運行效率更高,穩(wěn)定性更好,實時性更好,同時也便于對產(chǎn)品軟件進(jìn)行維護(hù),相比傳統(tǒng)單片機裸奔,運用 RTX 開發(fā)稱重控制儀表具有如下幾個優(yōu)點:
●可搶占的任務(wù)調(diào)度—— — 根據(jù)需要進(jìn)行調(diào)用,從而確保了更好的程序流和稱重事件響應(yīng);
●多任務(wù)——— 任務(wù)調(diào)度會產(chǎn)生同時執(zhí)行多個任務(wù)的效應(yīng);
●確定性的行為——— 在定義的時間內(nèi)處理事件和中斷;
●較短的 ISR——— 實現(xiàn)更加確定的中斷行為;
●任務(wù)間通信——— 管理多個任務(wù)之間的數(shù)據(jù)、內(nèi)存和硬件資源共享;
●自定義的堆棧使用——— 每個任務(wù)分配一個定義的堆??臻g,從而實現(xiàn)可預(yù)測的內(nèi)存使用;
●系統(tǒng)管理——— 可以專注于應(yīng)用程序開發(fā)而不是資源管理 ( 內(nèi)務(wù)處理 )。
2 RTX 內(nèi)核簡介及稱重儀表的原理
2.1 RTX內(nèi)核構(gòu)架
Keil RTX定性為實時操作系統(tǒng) RTOS,適用于ARM核和 Cortex- M3 內(nèi)核的設(shè)備。
●任務(wù)調(diào)度 Scheduler,完成任務(wù)間的切換和中斷的嵌套;
●互斥事件 Mutex,當(dāng)共享內(nèi)部資源時,設(shè)置互斥標(biāo)志,可以防止共享沖突;
●內(nèi)存分頻 MemoryPool,任務(wù)通過調(diào)用內(nèi)存管理,分配和釋放內(nèi)存,節(jié)約空間;
●郵箱管理 Mailbox,可通過郵箱管理,在任務(wù)與任務(wù)間進(jìn)行數(shù)據(jù)交互;
●延時間隔 Delay&Interval,通過延時間隔調(diào)用,提高運行的實時性;
●事件信號 Event&Semaphore,實現(xiàn)任務(wù)間的等待執(zhí)行。
2.2 稱重儀表原理
稱重儀部件主要完成稱重數(shù)據(jù)采集、稱重數(shù)據(jù)顯示、參數(shù)存儲、按鍵輸入、還包含串口通訊、IO 控制、打印輸出等一系列任務(wù),這些任務(wù)的執(zhí)行都有一套參考標(biāo)準(zhǔn),即必須嚴(yán)格按照 GB/T 7724- 2008 《電子稱重儀表》[2] 和GB/T 23111- 2008 《 非自動衡器》[3] 來處理數(shù)據(jù)。
2.2.1 ARM CortexM3 的處理器
它有 1 個 128KB Flash,1 個 20KB SRAM,4個 16 位定時器,100 個可編程的 I/O 引腳,具有I2C、SPI、USB、15SART和 CAN接口,2 路 10 通道 12 位A/D 轉(zhuǎn)換器,RTC 功能模塊,WDT 功能和高級電源管理功能,最高支持 72MHz 主頻;提高 CPU的運行速率。
2.2.2 AD稱重數(shù)據(jù)采集
稱重數(shù)據(jù)采集的是 0mV~10mV 稱重傳感器電橋信號,我們在設(shè)計儀表時一般選擇帶內(nèi)部增益放大器的 AD,或者在傳感器和 AD 設(shè)備之間增加一道信號放大環(huán)節(jié),這樣可以幫助我們采集到更多的有用信號。本方案我們選擇 24bit 高精度Σ- Δ 型自帶內(nèi)部增益放大的 AD轉(zhuǎn)換器。
2.2.3 顯示器
一般常用七段數(shù)碼管,也有采用點陣液晶,點陣液晶可以顯示中文,方便 HMI 交互。
2.2.4 存儲器件
市場上的存儲器很多,目前較流行的是電擦除的 AT24CXX 系列,我們采用鐵電 FM24CXX 的存儲器,鐵電的速率比 AT24CXX 電擦除的要快,而且無擦寫次數(shù)限制,使用壽命更長。
2.2.5 實時時鐘
實時時鐘可以提供準(zhǔn)確的運行時間總和,可以用于實時打印和實時監(jiān)控記錄,方便根據(jù)日期調(diào)出數(shù)據(jù)等。
2.2.6 IO擴展
由于 MCU 的 IO 管腳驅(qū)動能力的限制,而帶動設(shè)備通常不僅需要增加驅(qū)動能,還要防止設(shè)備對 CPU 的干擾,一般我們采用光隔離或磁隔離去驅(qū)動 MOS 管或繼電器,這樣設(shè)備的運行干擾就相對小很多,而且能增加驅(qū)動設(shè)備的能力。
2.2.7 串口通訊
串口設(shè)計為了提高 EMC 特性和對外部的抗干擾,這里常選擇 ADI 磁隔離器件,串口通訊一般有標(biāo)準(zhǔn) RS232/RS485 信號,工業(yè)比較流行的總線還有 Profibus- DP 和 CAN 總線,主要用于與 PLC、DCS等外設(shè)數(shù)據(jù)交互,控制和打印信息的輸出。
3 實時稱重系統(tǒng)軟件設(shè)計
任務(wù)分配完后必須根據(jù)需要分配優(yōu)先級,比如想要得到較高的按鍵響應(yīng),可以把任務(wù) 1 的優(yōu)先級設(shè)為最高,但是本文主要是分析稱重數(shù)據(jù)的實時監(jiān)控,所以我們需要將任務(wù) 3 的優(yōu)先級設(shè)為最高,這樣可以以最快的響應(yīng)速度處理稱重數(shù)據(jù)。
注解1 :配置 ARM7 內(nèi)核的時鐘和外設(shè)等信息,以保證外設(shè)的正確運行。
注解2 :RTX 內(nèi)核的初始化,包含內(nèi)核時鐘,堆棧,任務(wù)數(shù)量等的分配,并創(chuàng)建第一個任務(wù)。
注解3 :“__task void Task0_init()”任務(wù)作用是根據(jù)需要創(chuàng)建用戶任務(wù),流程圖上的 os_tsk_create (Task1_Key,13), 就 是 創(chuàng) 建 了以Task1_Key 為函數(shù)名的任務(wù) 1,并且分配了其優(yōu)先級為 13,而且把創(chuàng)建任務(wù)時的任務(wù)序號存放在以TID_ 為前綴的變量里面,這是因為以后對任務(wù)的操作都需要用到此任務(wù)序號,這個序號是 RTX 內(nèi)核自動分配的,具有唯一性。
注解4 :多任務(wù)的調(diào)度和切換詳見 3.2 章節(jié)舉例說明。
注解5 :RTX 系統(tǒng)自帶的任務(wù)當(dāng) TCB( 任務(wù)管理器 ) 列表內(nèi)無就緒可執(zhí)行任務(wù),內(nèi)核暫時會切換執(zhí)行空閑任務(wù)。
注解6 :中斷入口函數(shù)。
注解7 :用戶函數(shù)可以根據(jù)用戶需要任意增加和減少,RTX內(nèi)核任務(wù)最大可運行 255 個。
3.2 任務(wù)切換舉例
任務(wù)的切換是要通過內(nèi)核 TCB 來管理的,假如當(dāng)前正在運行任務(wù) 2“Void Task2_Disp()” ,此時AD 轉(zhuǎn)換完成,給 CPU 發(fā)送一個中斷信號進(jìn)入中斷,中斷的任務(wù)就是告訴 RTX 內(nèi)核,任務(wù) 3“Void Task2_Disp()”已經(jīng)就緒,內(nèi)核則會判斷任務(wù) 3 的優(yōu)先級是否比任務(wù) 2 優(yōu)先級高,如果是,則重新分配任務(wù),把顯示任務(wù)的運行狀態(tài)壓入顯示任務(wù)的堆棧,再把數(shù)據(jù)采集任務(wù)的信息從數(shù)據(jù)采集任務(wù)的堆棧中恢復(fù)到 MCU 工作寄存器中,啟動數(shù)據(jù)采集任務(wù),而顯示任務(wù)則被掛起暫停,直到任務(wù) 3 完成,把 CPU 控制權(quán)釋放。
4 需要注意的問題
在應(yīng)用 RTX時應(yīng)注意以下幾點:
4.1 盡可能不使用循環(huán)任務(wù)切換。如果由os_dly_wait()函數(shù)來進(jìn)行任務(wù)觸發(fā),則不需要保存任務(wù)內(nèi)容。由于正處于等待運行的任務(wù)并不需要等待全部循環(huán)切換時間結(jié)束,因此 os_dly_wait()函數(shù)可以改進(jìn) RTX 內(nèi)核系統(tǒng)響應(yīng)時間,更加突出實時效果。
4.2 如果使用時間片,不要將時鐘節(jié)拍中斷速率設(shè)置得太高或太低,設(shè)定為一個較低的數(shù)值在增加每秒的時鐘節(jié)拍個數(shù)的同時會增加 RTX 內(nèi)核調(diào)度所產(chǎn)生的開銷,因為每次時鐘節(jié)拍中斷大約需要 100 個 ~200 個 CPU周期;也不可將時鐘節(jié)拍率太高,否則會增加中斷響應(yīng)時間,導(dǎo)致中斷響應(yīng)不及時,所以個人建議不使用時間片任務(wù)切換。我們做軟件的時候,可以在有較大數(shù)據(jù)量處理的任務(wù)中間穿插 os_dly_wait()函數(shù),以便其它任務(wù)得到響應(yīng),又不影響本次任務(wù)的運行。
4.3 _alloc_box()函數(shù)比較方便的根據(jù)需要隨時分配內(nèi)存給任務(wù),但是當(dāng)我們使用完本次內(nèi)存后一定要利用 _free_box()釋放內(nèi)存,否則不停的被創(chuàng)建內(nèi)存而不去釋放,那么運行時間一長,內(nèi)存占用達(dá)到飽和,內(nèi)存溢出了直接會導(dǎo)致系統(tǒng)癱瘓,這個錯誤是致命性的,而且有時候不容易被發(fā)現(xiàn),是一個隱患。
4.4 每一個任務(wù)必須都是一個死循環(huán),例如:
__task void Task1_key (void)
{
/* 添加任務(wù)變量,給設(shè)備初始化 */
os_itv_set(2); /* 設(shè)置本任務(wù)每 20ms 發(fā)生一次 */
while(1)
{
KeyManage(); /* 按鍵掃描和處理 */
os_itv_wait(); /* 等待下一個 20ms 的到來 */
}
}
如果沒有 while(1)把 PC 指針控制在 Task1_key(void),那么當(dāng)運行完一次任務(wù)后,PC 指針就會跑飛,程序就會亂掉,直接導(dǎo)致系統(tǒng)崩潰。
4.5 稱重過程是一個強實時過程,需要 CPU及時采集秤臺過程的數(shù)據(jù)并快速分析有效數(shù)據(jù),從而計算其重量。如果 CPU 速度過慢或者程序邏輯結(jié)構(gòu)設(shè)計不合理,必然會導(dǎo)致儀表在穩(wěn)定性和實時稱重控制方面的不足 [4] ,所以必要時我們可以把稱重數(shù)據(jù)采集任務(wù)的優(yōu)先級設(shè)為最高。
5 結(jié)論
本文介紹了多任務(wù)的創(chuàng)建、切換和并發(fā)多任務(wù)運行,并分析了 RTX高效率數(shù)據(jù)采集的實時性,RTX 內(nèi)核一旦接收到事件響應(yīng),可以在最短的時間內(nèi)去處理,這樣,提高采集效率的同時又可以提高控制的實時性。而不像傳統(tǒng)程序只能順序執(zhí)行完一圈后才能被響應(yīng)。任務(wù)切換是 RTX 的一個基本服務(wù),在實際應(yīng)用中還要對任務(wù)切換時的堆棧管理有一定了解,這樣才能更好地掌握任務(wù)切換的機制。且每個任務(wù)都可以隨時被創(chuàng)建和刪除,不僅可以把暫時不用的任務(wù)先從 TCB 中抽出掛起,也可以當(dāng)再次需要的時候再把它拉入運行 TCB 列表。本文只提到了幾個運用 RTX 設(shè)計稱重儀表的關(guān)鍵點,希望對同類系統(tǒng)設(shè)計有一定的借鑒意義。
本文源于網(wǎng)絡(luò)轉(zhuǎn)載,如有侵權(quán),請聯(lián)系刪除