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