梁兆福
摘 要:當(dāng)學(xué)生學(xué)習(xí)單片機(jī)編程達(dá)到一定水平后,使用多任務(wù)實(shí)時系統(tǒng)編程是一種非常有益編程方法。文章以從初識RTX51到由流水燈實(shí)驗(yàn)產(chǎn)生學(xué)習(xí)RTX51興趣,再到由簡單任務(wù)入門為順序開了RTX51教學(xué)研究。
關(guān)鍵詞:單片機(jī);RTX51;流水燈;教學(xué)研究
中圖分類號:G712 文獻(xiàn)標(biāo)志碼:A 文章編號:1008-3561(2016)23-0082-02
目前在8051系列單片機(jī)上使用多任務(wù)實(shí)時操作系統(tǒng)(RTOS),主要有德國Keil公司開發(fā)單片機(jī)IDE軟件μVision自帶的RTX51和陳明計(jì)編寫的Small RTOS。RTX51有2個版本:RTX51 Tiny和RTX51 Full。RTX51 Tiny自身占用單片機(jī)硬件資源非常少,可以運(yùn)行在沒有外部擴(kuò)展存儲器的8051單片機(jī)系統(tǒng)上。很少在中職學(xué)生中開展RTX51教學(xué)的原因是:首先,RTX51教學(xué)中文資料和實(shí)例很少。其次,要求學(xué)習(xí)對象具備很好的編程能力。最后,沒有使用實(shí)時系統(tǒng)編程的習(xí)慣。目前編寫大型、分工的程序通常是在RTOS上編程的,其原因是單片機(jī)資源越來越豐富和價格越來越低。另外,在RTOS基礎(chǔ)上編程,優(yōu)點(diǎn)非常明顯。順應(yīng)單片機(jī)技術(shù)的快速發(fā)展態(tài)勢,中職學(xué)生有必要接觸ROTS,從而掌握一些基本知識和使用技巧。選擇一些編程能力比較強(qiáng)的中職學(xué)生為教學(xué)對象,進(jìn)行了單片機(jī)實(shí)時系統(tǒng)RTX51教學(xué)研究。
一、 初識多任務(wù)實(shí)時系統(tǒng)
為了幫助學(xué)生能對多任務(wù)實(shí)時系統(tǒng)形成一些初步認(rèn)識,可以通過編寫下面的程序,再通過調(diào)試程序觀察變量變化情況,來分析變化原因。
01 #include
02 #include "RTX51TNY.h"
03 long int counter1=0;
04 long int counter2=0;
05 void job_a (void) _task_ 0
06 {
07 os_create_task(1);
08 while(1)
09 {
10 counter1++;
11 }
12 }
13 void job_b (void) _task_ 1
14 {
15 while(1)
16 {
17 counter2++;
18 }
19 }
要運(yùn)行上面程序,必須將Conf_tny.A51文件(在 Keil\C51\RtxTiny2\SourceCode文件夾里面)加進(jìn)工程中,接著要在設(shè)置工程選項(xiàng)中的Operating條目選擇RTX-51 Tiny。最后,在程序中將RT51TNY.h文件包含進(jìn)來(如圖1第2行程序)。
程序講解:使用演示教學(xué)法進(jìn)行教學(xué)。演示1:程序全速執(zhí)行,提醒學(xué)生觀察變量counter1和counter2變化。現(xiàn)象是:兩個變量都在增加。演示2:單步執(zhí)行,提醒學(xué)生觀察變量counter1,counter2變化,同時觀察程序如何執(zhí)行?,F(xiàn)象是:程序在第8至11行連續(xù)執(zhí)行一段時間,每執(zhí)行一次循環(huán)體counter1增加1。當(dāng)執(zhí)行一段時間后,程序跑到第15至18行程序運(yùn)行,并且連續(xù)運(yùn)行一段時間,每執(zhí)行一次循環(huán)體counter2增加1。當(dāng)運(yùn)行一段時間后,程序在第8至11行連續(xù)執(zhí)行,如此重復(fù)。
現(xiàn)象解析:此程序使用了RTX51,在此系統(tǒng)上編寫用戶程序,用戶程序有兩個任務(wù)job_a和job_b,用關(guān)鍵詞_task_定義。每個任務(wù)都是一個死循環(huán)體,或者執(zhí)行后使用系統(tǒng)函數(shù)os_delete_task刪除。在實(shí)時系統(tǒng)運(yùn)行的每個用戶任務(wù)是輪循或搶占(RTX51是輪循)執(zhí)行一個時間片的(由數(shù)個時間“滴答”構(gòu)成),所以在單步調(diào)試運(yùn)行過程中,會觀察程序在第8至11行連續(xù)執(zhí)行一段時間,然后程序跑到第15至18行程序運(yùn)行,并且連續(xù)運(yùn)行一段時間。如果用戶任務(wù)運(yùn)行時間片比較小的時候,程序全速執(zhí)行,就會發(fā)現(xiàn)兩個用戶任務(wù)程序同時執(zhí)行,也就是看到counter1、counter2同時增加的現(xiàn)象。
疑問解析:main函數(shù)去哪里了?任務(wù)時間片大小怎么確定?學(xué)生會提出上述兩個問題。main函數(shù)在RTX51系統(tǒng)使用了,在RTX51中執(zhí)行main函數(shù)后自動跳轉(zhuǎn)到由_task_ 0定義的用戶任務(wù)中。任務(wù)時間片大小由Conf_tny.A51文件中宏INT_CLOCK和TIMESHARING確定,其中INT_CLOC稱為系統(tǒng)時鐘“滴答”。
通過上述程序演示和講解,有編程基礎(chǔ)的學(xué)生基本上能了解多任務(wù)實(shí)時系統(tǒng)概念和用戶程序運(yùn)行過程。
二、 由流水燈實(shí)驗(yàn)產(chǎn)生學(xué)習(xí)RTX51興趣
單片機(jī)經(jīng)典入門實(shí)驗(yàn)就是流水燈了,猶如許多學(xué)習(xí)計(jì)算機(jī)編程語言的第一個程序“Hello world!”。在RTOS上編寫流水燈程序和非使用RTOS編寫的程序思路非常不同。為了使得學(xué)生對RTOS產(chǎn)生學(xué)習(xí)興趣,教師準(zhǔn)備了圖1流水燈電路(該電路省去單片機(jī)復(fù)位、時鐘電路)和下面程序。
01 #include
02 #include "rtx51tny.h"
03 void job_a(void) _task_ 0
04 {
05 unsigned char i,dt;
06 os_create_task(1);
07 while(1){
08 dt=0x1;
09 for(i=0;i<8;i++){
10 P0=~dt;
11 dt=dt << 1;
12 os_wait(K_TMO,100,0);
13 }
14 }
15 }
16 void job_b(void) _task_ 1
17 {
18 unsigned char i,dt;
19 while(1){
20 dt=0x80;
21 for(i=0;i<8;i++){
22 P3=~dt;
23 dt=dt>>1;
24 os_wait(K_TMO,50,0);
25 }
26 }
27 }
為體現(xiàn)在RTOS上所編寫流水燈程序與初學(xué)單片機(jī)編寫程序在思路上的不同,在電路上設(shè)計(jì)P0和P3端口分別控制8只LED。功能要求P0端口控制的LED每隔1秒鐘從右邊到左邊循環(huán)流動顯示,P3端口控制的LED每隔0.5秒鐘從左邊到右邊循環(huán)流動顯示。講解程序時,先向?qū)W生介紹使用RTOS編寫的用戶程序思路,然后講解具體實(shí)現(xiàn)的方式,最后讓學(xué)生體會使用RTOS和不使用RTOS編寫流水燈程序的難易程度和擴(kuò)展性能。
程序思路:建立兩個用戶任務(wù)job_a和job_b,job_a任務(wù)控制P0端口的8只LED,job_b任務(wù)控制P3端口的8只LED。由于每個用戶任務(wù)只需要考慮自身該干的活而不需要考慮其他任務(wù),所以在每個任務(wù)中的程序編寫就變得非常簡單。
程序講解:在RTX51初始化后切換到任務(wù)job_a中運(yùn)行,內(nèi)核os_create_task(1)函數(shù)調(diào)用,準(zhǔn)備好任務(wù)job_b運(yùn)行所需要的各種數(shù)據(jù)結(jié)構(gòu)(如堆棧頂部位置)。執(zhí)行第7~10行程序,在P0輸出0xfe數(shù)據(jù)使得只有D8亮。第11行程序?yàn)橄麓卧赑0端口輸出正確數(shù)據(jù)做好準(zhǔn)備。第12行程序調(diào)用RTX51系統(tǒng)函數(shù)os_wait,os_wait函數(shù)使用非常頻繁,其功能是主動放棄該任務(wù)占用CPU時間,然后等待特定時間,時間間隔或者信號到來后重新在os_wait函數(shù)的下一行程序繼續(xù)執(zhí)行程序。在初識別多任務(wù)實(shí)時系統(tǒng)時候已經(jīng)介紹過用戶任務(wù)運(yùn)行“任務(wù)時間片”后被RTX51切換到其他任務(wù)中執(zhí)行,但是很多時候,用戶任務(wù)往往不需要執(zhí)行整個任務(wù)時間片,可以主動提前釋放占用CPU時間,這樣可以提高RTX51的實(shí)時性和效率。os_wait(K_TMO,100,0)函數(shù)中的參數(shù)K_TMO,表示任務(wù)job_a放棄CPU后,等待超時時間,這個超時時間是由第二個參數(shù)“100”確定,表示是等待100個系統(tǒng)“滴答”時間。當(dāng)執(zhí)行系統(tǒng)函數(shù)os_wait后RTX51切換到下一個任務(wù)job_b,過程幾乎和job_a一樣。
用與不用RTX51編寫程序差異體會:學(xué)生在初學(xué)單片機(jī)時,一定是不使用RTOS編寫流水燈程序的?,F(xiàn)在通過兩者的差異對比,學(xué)生會感受到使用RTX51編程的思路、難易和擴(kuò)展性有所不同。對于擴(kuò)展性,如在電路中增加按鍵識別,按鍵控制不同流水燈花樣,使用RTX51只需要增加一個按鍵識別和處理任務(wù)。通過流水燈實(shí)驗(yàn),觀察學(xué)生的學(xué)習(xí)態(tài)度和狀態(tài),可以確認(rèn)學(xué)生對RTX51非常感興趣,因?yàn)镽TX51為他們打開編程的第二扇門,門里有許多值得他們驚喜的知識。
三、 由簡單任務(wù)入門RTX51
學(xué)生要學(xué)習(xí)RTX51,必須有一些經(jīng)典且簡單的任務(wù)練習(xí)才能入門。在教學(xué)中可以發(fā)現(xiàn),學(xué)生初學(xué)單片機(jī)時學(xué)習(xí)過并且做過的任務(wù),可以在RTX51基礎(chǔ)上重新編寫程序完成。這樣做好處比較多,首先學(xué)生已經(jīng)明白任務(wù)要求;其次通過RTX51編寫用戶程序?qū)崿F(xiàn)相同功能,能深刻體會使用RTX51的方便和簡單;再次用不同的編程思路實(shí)現(xiàn)相同功能,反而進(jìn)一步鞏固已經(jīng)學(xué)習(xí)的單片機(jī)編程知識;最后學(xué)生學(xué)會取舍是否用RTOS編程。以YL236單片機(jī)實(shí)驗(yàn)設(shè)備作為實(shí)驗(yàn)硬件平臺,在此平臺上實(shí)現(xiàn)時鐘、溫度計(jì)、數(shù)字電壓表(AD轉(zhuǎn)換)、機(jī)械手控制等簡單的RTX51入門任務(wù)。學(xué)生在完成任務(wù)過程中會遇到很多問題,如在做時鐘任務(wù)過程中,學(xué)生將時鐘任務(wù)分解為數(shù)碼管顯示、按鍵識別、按鍵處理、時間調(diào)整這四個用戶任務(wù),任務(wù)之間需要通信的,如何解決?這可以調(diào)用RTX51系統(tǒng)函數(shù)發(fā)信號,也可以自己定義消息,并實(shí)現(xiàn)消息發(fā)送和接收功能,還可以用全局變量協(xié)調(diào)。又如多個用戶任務(wù)中需要使用共同資源,怎樣實(shí)現(xiàn)資源保護(hù)?學(xué)生通過不同的嘗試,最終找到解決問題的方法;通過多個簡單任務(wù)練習(xí)后,最終掌握RTX51的使用。
四、 結(jié)束語
通過簡單的演示程序,學(xué)生初識RTX51并了解任務(wù)實(shí)時系統(tǒng)的相關(guān)概念和用戶程序運(yùn)行過程;由在RTX51上實(shí)現(xiàn)經(jīng)典的流水燈實(shí)驗(yàn),學(xué)生對RTX51產(chǎn)生興趣;使用RTX51實(shí)現(xiàn)多個簡單的任務(wù),學(xué)生最終入門RTOS。通過RTX51教學(xué)研究,學(xué)生是有能力使用RTOS進(jìn)行程序編寫的。雖然以功能很弱的RTX51入門,但是學(xué)生熟練掌握RTX51使用方法后,很容易將知識遷移到其他功能比較強(qiáng)大的RTOS,如陳明計(jì)編寫的Small RTOS(該RTOS內(nèi)核主要用C語言編寫,搶占式切換任務(wù))。
參考文獻(xiàn):
[1]陳明計(jì),周立功.嵌入式實(shí)時操作系統(tǒng)small RTOS51原理及應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2004.
[2]李建忠.單片機(jī)原理及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2002
[3]艾云峰,姚鄭,覃力.“嵌入式實(shí)時操作系統(tǒng)”課程的教學(xué)研究[J].電氣電子教學(xué)學(xué)報,2013(01).
[4]沈紅衛(wèi).基于單片機(jī)的智能系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[M].北京:電子工業(yè)出版社,2005.