李寧,庫少平,付國江
(武漢理工大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,武漢430070)
自從2006年ARM公司推出第一款基于ARMv7體系結(jié)構(gòu)的32位微控制器內(nèi)核Cortex-M3以來,各半導(dǎo)體廠商陸續(xù)采用該內(nèi)核設(shè)計(jì)生產(chǎn)自己的MCU。之后,ARM公司2009年又推出了Cortex-M0和Cortex-M4內(nèi)核,2012年則推出了Cortex-M0+內(nèi)核。至2012年,基于Cortex-M的芯片出貨量就已經(jīng)達(dá)到22億片。經(jīng)過8年的發(fā)展,32位的Cortex-M處理器已經(jīng)開始主導(dǎo)嵌入式領(lǐng)域中的微控制器市場[1]。
為適應(yīng)技術(shù)和市場的需求,國內(nèi)各高校在近幾年也開始逐漸將Cortex-M微控制器引入到本科生教學(xué)中。本文將介紹筆者所在教學(xué)團(tuán)隊(duì)進(jìn)行Cortex-M微控制器教學(xué)的一些實(shí)際經(jīng)驗(yàn)。
8位的單片機(jī)8051由Intel公司開發(fā)設(shè)計(jì),后來各大半導(dǎo)體廠商都生產(chǎn)了各式各樣的51內(nèi)核單片機(jī),使得8051一度成為MCU領(lǐng)域中的王者,至今仍占有著重要的地位。國內(nèi)高校的MCU教學(xué)曾經(jīng)絕大多數(shù)以8051為對(duì)象進(jìn)行講解。由于Cortex-M微控制器是32位的,其硬件和軟件的復(fù)雜程度都高于8051單片機(jī),因此在教學(xué)重點(diǎn)上也有所差異。
由于8051單片機(jī)出現(xiàn)于1980年,那時(shí)候相當(dāng)多的51內(nèi)核單片機(jī)采用雙列直插封裝形式,至今市場上仍有大量雙列直插封裝的51內(nèi)核單片機(jī)。通過面包板和PCB萬能板,擴(kuò)展上拉電阻、電容、LED燈、按鍵等幾個(gè)簡單器件,每個(gè)學(xué)生都可非常方便地搭建起8051的最小系統(tǒng),并作為教學(xué)實(shí)驗(yàn)平臺(tái),如圖1(a)所示。目前,各半導(dǎo)體廠商生產(chǎn)的Cortex-M微控制器多數(shù)采用QFN、LQFP、BGA等封裝形式,幾乎見不到雙列直插封裝形式,Cortex-M微控制器的用戶也不會(huì)考慮使用雙列直插封裝形式。因此,讓學(xué)生自己動(dòng)手做出一個(gè)Cortex-M微控制器的最小系統(tǒng)非常困難,對(duì)于很多專業(yè)的學(xué)生而言,甚至幾乎不可能。
由于Cortex-M內(nèi)核計(jì)算能力強(qiáng)大,很多廠商開發(fā)的Cortex-M微控制器又提供了豐富的外圍接口,使得有大量的外設(shè)可以被輕松接入。因此,筆者在教學(xué)中采用集成了仿真器,并帶有Arduino接口的Cortex-M微控制器學(xué)習(xí)板,學(xué)生可以自由地?cái)U(kuò)展各種外設(shè)板,如圖1(b)所示。
由于Cortex-M微控制器的計(jì)算能力、存儲(chǔ)空間都遠(yuǎn)大于8051單片機(jī),因此在軟件上有了更大的擴(kuò)展空間,在軟件的教學(xué)上應(yīng)當(dāng)也有所調(diào)整。
圖1 8051教學(xué)平臺(tái)與Cortex-M微控制器教學(xué)平臺(tái)
(1)弱化匯編語言,強(qiáng)化C語言
無論是8051還是Cortex-M微控制器的匯編語言指令集都不是太復(fù)雜,尤其是Cortex-M0內(nèi)核僅有56條Thumb指令,學(xué)習(xí)和掌握其匯編語言指令集的難度并不大。
在早期的8051教學(xué)中,匯編語言是其中的重要內(nèi)容,甚至整個(gè)教學(xué)過程均采用匯編語言來講解,也有很多工程師一直采用匯編語言來對(duì)8051進(jìn)行編程。其理由是C語言編譯后的代碼密度比匯編語言的低,執(zhí)行效率也低。早期的8051單片機(jī)的計(jì)算能力和存儲(chǔ)空間都非常有限,導(dǎo)致某些工程師甚至在編程時(shí)對(duì)每個(gè)字節(jié)都“斤斤計(jì)較”,這是匯編語言曾在MCU領(lǐng)域被廣泛使用的重要原因。
Cortex-M微控制器的計(jì)算能力已經(jīng)非常強(qiáng)大,其存儲(chǔ)空間也足夠大,價(jià)格也很便宜;同時(shí)編譯系統(tǒng)的能力也有顯著提高,即使是采用GCC編譯器也可以獲得很好的代碼密度和執(zhí)行效率。此外,使用C語言進(jìn)行開發(fā),開發(fā)速度更快,更適合開發(fā)復(fù)雜的軟件,例如帶有RTOS的系統(tǒng),相比匯編語言,軟件越復(fù)雜,C語言的開發(fā)效率越高。因此,當(dāng)前絕大多數(shù)工程師已經(jīng)開始使用C語言作為MCU的開發(fā)語言,而基本不再使用匯編語言。
基于以上情況,在教學(xué)實(shí)踐中可適當(dāng)弱化匯編語言編程的要求,不要求學(xué)生用匯編語言完成較為復(fù)雜的程序。
(2)弱化寄存器操作,強(qiáng)化使用API
對(duì)MCU的各種外設(shè)接口的控制,都是通過對(duì)寄存器的操作來實(shí)現(xiàn)的。因此,過去在以8051為對(duì)象的單片機(jī)課程教學(xué)和以8086 CPU為對(duì)象的微機(jī)原理課程教學(xué)中,都花費(fèi)了大量時(shí)間介紹各外設(shè)接口的數(shù)據(jù)寄存器、控制寄存器和狀態(tài)寄存器含義,以及相應(yīng)的操作方法。Cortex-M微控制器中所帶有的外設(shè)越來越多,越來越復(fù)雜,如果逐一介紹各外設(shè)接口的寄存器組,其內(nèi)容將非常多,而且枯燥乏味。
目前,各個(gè)MCU廠商為了幫助使用其產(chǎn)品的工程師能進(jìn)行快速開發(fā),均提供了完善的外設(shè)驅(qū)動(dòng)庫。在每個(gè)外設(shè)驅(qū)動(dòng)庫中,均定義了相應(yīng)外設(shè)的數(shù)據(jù)結(jié)構(gòu)和一組API函數(shù),這一組API函數(shù)覆蓋了該外設(shè)的所有功能。而且,這些外設(shè)驅(qū)動(dòng)庫的文件結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、函數(shù)名和參數(shù)名都進(jìn)行了標(biāo)準(zhǔn)化。
基于以上情況,在教學(xué)實(shí)踐中通常可以僅介紹1~2個(gè)簡單外設(shè)的寄存器組,例如GPIO的寄存器組,讓學(xué)生了解如何通過操作寄存器來實(shí)現(xiàn)對(duì)外設(shè)接口的控制即可。同時(shí),應(yīng)增加對(duì)外設(shè)驅(qū)動(dòng)庫的介紹,包括外設(shè)驅(qū)動(dòng)庫的文件結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、函數(shù)名和參數(shù)名定義的規(guī)范。讓學(xué)生掌握查閱處理器數(shù)據(jù)手冊和API函數(shù)手冊進(jìn)行編程的能力。
(3)引入RTOS,中斷與OS任務(wù)調(diào)度并重
8051的計(jì)算能力有限,存儲(chǔ)空間很小,因此在實(shí)際應(yīng)用中基本不會(huì)使用RTOS,通常是直接進(jìn)行裸機(jī)編程。對(duì)于多任務(wù)的處理,通常是用中斷來實(shí)現(xiàn),因此中斷處理是MCU教學(xué)的重點(diǎn)。
Cortex-M微控制器的計(jì)算能力和存儲(chǔ)空間的大幅提高,使得MCU能適用于更加復(fù)雜的應(yīng)用。對(duì)于功能復(fù)雜的應(yīng)用,如果使用裸機(jī)編程的方法進(jìn)行開發(fā),則必然會(huì)遇到編程復(fù)雜、調(diào)試?yán)щy、代碼耦合性高、移植困難等諸多問題,因此,越來越多的Cortex-M微控制器應(yīng)用開始引入RTOS?;赗TOS的應(yīng)用程序開發(fā),會(huì)大大降低應(yīng)用程序的復(fù)雜性和代碼的耦合度,應(yīng)用的移植也變得簡單。當(dāng)然,仍有大量的Cortex-M微控制器應(yīng)用本身就比較簡單,無需引入RTOS。
基于以上情況,在教學(xué)實(shí)踐中可引入RTOS的知識(shí),同時(shí)也仍保持對(duì)中斷的重點(diǎn)介紹。對(duì)于計(jì)算機(jī)專業(yè)的學(xué)生而言,RTOS的知識(shí)是易于理解和掌握的,但是對(duì)于自動(dòng)化和電子專業(yè)的學(xué)生而言,則會(huì)存在著一些困難?;谶@種情況,可將RTOS介紹的重點(diǎn)放在任務(wù)調(diào)度的概念上,讓學(xué)生理解RTOS可以幫助編程者實(shí)現(xiàn)多任務(wù)的切換和調(diào)度即可。
由于常見Cortex-M微控制器的封裝形式不方便讓學(xué)生自己搭建起最小系統(tǒng),因此筆者在教學(xué)中采用集成了仿真器、并帶有Arduino接口的Cortex-M學(xué)習(xí)板,使用Cortex-M0處理器,如圖1(b)所示。同時(shí)還提供多種Arduino接口擴(kuò)展板,例如三色LED燈、矩陣鍵盤、步進(jìn)電機(jī)、溫度傳感器、光敏傳感器、重力加速度傳感器、ZigBee模塊等,便于搭建各種應(yīng)用系統(tǒng)。這樣既方便完成單一功能的驗(yàn)證實(shí)驗(yàn),又適于進(jìn)行較為復(fù)雜的課程設(shè)計(jì),還能用于學(xué)生自主創(chuàng)新項(xiàng)目。這樣的教學(xué)平臺(tái)體積小、靈活性高、方便攜帶,學(xué)生甚至不必在實(shí)驗(yàn)室就可以進(jìn)行實(shí)驗(yàn)或者自主創(chuàng)新開發(fā)。
筆者使用Coocox工具作為教學(xué)實(shí)踐的軟件平臺(tái)。Coocox工具包含一套完整的ARM MCU工具鏈,包含集成開發(fā)環(huán)境CoIDE、燒寫工具CoFlash、實(shí)時(shí)操作系統(tǒng)CoOS以及快速代碼生成工具CoSmart,而且完全免費(fèi)[2]。更重要的是,其基于組件化的編程思想和分享功能非常便于實(shí)踐教學(xué)的開展。
(1)組件化編程
圖2 CoIDE工程組件樹
在集成開發(fā)環(huán)境CoIDE中,外設(shè)驅(qū)動(dòng)、算法、通信協(xié)議棧、RTOS等均被包裝為組件(Component)。開發(fā)者只要通過鼠標(biāo)選擇相應(yīng)的組件,即可將組件添加到自己的應(yīng)用程序中。在組件樹窗口中可以清楚地顯示應(yīng)用程序所使用的外設(shè)、通信協(xié)議、RTOS等,如圖2所示。相比于文件樹而言,組件樹的結(jié)構(gòu)更清晰明確,而且還可以和文件樹相互參照。這種模塊化的編程方式,讓編程者非常易于理解應(yīng)用程序的結(jié)構(gòu),也大大加快了編程的進(jìn)度,減少了添加驅(qū)動(dòng)函數(shù)庫、RTOS等過程中可能出現(xiàn)的錯(cuò)誤。同時(shí),每個(gè)組件均有基本例程可以參考,只需選擇相應(yīng)例程即可自動(dòng)將相關(guān)代碼加入到自己的應(yīng)用程序中去。學(xué)生無需編程,就可完成第一個(gè)入門實(shí)驗(yàn),實(shí)踐教學(xué)的難度明顯降低,大大減少了學(xué)生對(duì)于MCU實(shí)踐教學(xué)的畏難心理。
(2)分享功能
CoIDE還具有基于Internet的分享功能,開發(fā)者可以將自己開發(fā)的組件、例程上傳到服務(wù)器上與其他開發(fā)者分享,這個(gè)功能也方便了教師對(duì)學(xué)生實(shí)踐教學(xué)的檢查和評(píng)分。學(xué)生可將自己的實(shí)驗(yàn)程序作為例子上傳,教師則可以非常方便地下載、查看并運(yùn)行學(xué)生的實(shí)驗(yàn)代碼,從而進(jìn)行評(píng)分,而不必當(dāng)場逐一檢查實(shí)驗(yàn)結(jié)果。這樣,老師和學(xué)生在實(shí)驗(yàn)場地和實(shí)驗(yàn)時(shí)間的安排上都變得非常靈活,學(xué)生甚至可以在寢室完成實(shí)驗(yàn),老師也可以根據(jù)自己的時(shí)間來進(jìn)行實(shí)驗(yàn)成績評(píng)分。
同時(shí),CoIDE也具有其他商用集成開發(fā)環(huán)境的各項(xiàng)功能,可以用于各種復(fù)雜的ARM MCU應(yīng)用的開發(fā)。近年來,Coocox工具鏈也逐漸成為一些歐美大學(xué)的MCU教學(xué)的軟件教學(xué)平臺(tái)。
隨著物聯(lián)網(wǎng)的快速發(fā)展,許多高校都開設(shè)了物聯(lián)網(wǎng)專業(yè),計(jì)算機(jī)、電子、自動(dòng)化等專業(yè)也開設(shè)了物聯(lián)網(wǎng)的相關(guān)課程。物聯(lián)網(wǎng)感知層中的各種傳感器節(jié)點(diǎn),其實(shí)就是MCU加上相關(guān)傳感器,如果能將MCU的教學(xué)與物聯(lián)網(wǎng)教學(xué)進(jìn)行結(jié)合,會(huì)有助于學(xué)生建立完整的物聯(lián)網(wǎng)系統(tǒng)概念。
在實(shí)踐教學(xué)中,在Arduino學(xué)習(xí)板上擴(kuò)展ZigBee模塊和傳感器模塊,可實(shí)現(xiàn)一個(gè)傳感器節(jié)點(diǎn);或者擴(kuò)展ZigBee模塊和一個(gè)步進(jìn)電機(jī)模塊,實(shí)現(xiàn)一個(gè)控制節(jié)點(diǎn)。一組學(xué)生即可構(gòu)建一個(gè)小的物聯(lián)網(wǎng),例如實(shí)現(xiàn)簡單的智能家居系統(tǒng)原型。
移動(dòng)終端、可穿戴設(shè)備的迅速普及,使得Android應(yīng)用開發(fā)成為了計(jì)算機(jī)專業(yè)學(xué)生的熱門選修課程。在Android應(yīng)用開發(fā)實(shí)踐教學(xué)中,也可以與MCU教學(xué)相結(jié)合。將MCU實(shí)踐教學(xué)與其他相關(guān)課程的實(shí)踐教學(xué)進(jìn)行有機(jī)的結(jié)合,不僅可以幫助學(xué)生建立各知識(shí)領(lǐng)域之間的聯(lián)系,還可以提高學(xué)生的興趣,也有利于鼓勵(lì)學(xué)生進(jìn)行自主創(chuàng)新開發(fā)。
在筆者的MCU教學(xué)實(shí)踐中也遇到如下一些問題和困難:
①缺乏合適教材。很多關(guān)于Cortex-M微控制器的書籍都是為MCU廠商做市場推廣而寫作的,更適合作為編程參考手冊,而不適合作為教材。由于ARM MCU比8051復(fù)雜,涉及的軟硬件內(nèi)容更豐富,已有的一些Cortex-M微控制器教材很難兼顧。各個(gè)專業(yè)的MCU教學(xué)需求也有所偏重,市面也缺乏根據(jù)專業(yè)特點(diǎn)來編寫合適的教材。
②學(xué)時(shí)少,內(nèi)容多,尤其實(shí)踐學(xué)時(shí)太少。對(duì)于這一問題,通過鼓勵(lì)學(xué)生將學(xué)習(xí)板帶回寢室學(xué)習(xí),得以適當(dāng)緩解。
③軟硬件知識(shí)如何平衡。對(duì)于不同專業(yè)的學(xué)生,需求是不同的。計(jì)算機(jī)專業(yè)的學(xué)生,偏向于軟件方面;電子專業(yè)的學(xué)生,偏向硬件方面;自動(dòng)化專業(yè)的學(xué)生,則更偏向于接口控制與通信方面。
④如何與其他相關(guān)課程的實(shí)踐課相互有機(jī)結(jié)合,在有限的學(xué)時(shí)中做到相互促進(jìn)、相互兼顧,并能完成相關(guān)知識(shí)點(diǎn)全覆蓋。
[1]ARM Limited.Cortex-M 系列[EB/OL].[2014-06].http://www.arm.com/zh/markets/embedded/mcu.php.
[2]Free/Open Cortex-M微控制器 Development Tools[EB/OL].[2014-06].http://www.coocox.org.