滿 毅,徐國(guó)鑫
(北京郵電大學(xué)電子工程學(xué)院,北京 100876)
嵌入式系統(tǒng)設(shè)計(jì)課程對(duì)嵌入式系統(tǒng)的概念、軟硬件組成、設(shè)計(jì)開(kāi)發(fā)方法、嵌入式操作系統(tǒng)、嵌入式軟件(包括應(yīng)用程序和設(shè)備驅(qū)動(dòng)程序)的設(shè)計(jì)開(kāi)發(fā)進(jìn)行全面的介紹。并以ARM體系架構(gòu)的處理器為例講解嵌入式系統(tǒng)硬件結(jié)構(gòu)和處理器指令體系,以嵌入式Linux操作系統(tǒng)為例介紹了嵌入式操作系統(tǒng)的主要結(jié)構(gòu)和嵌入式應(yīng)用開(kāi)發(fā)的基本方法。通過(guò)這門(mén)課的學(xué)習(xí)使學(xué)生深入地了解嵌入式系統(tǒng)結(jié)構(gòu),掌握其軟硬件設(shè)計(jì)方法,提高學(xué)生的嵌入式系統(tǒng)的開(kāi)發(fā)能力。
目前,在嵌入式系統(tǒng)相關(guān)課程的教學(xué)改革研究主要集中在幾個(gè)方面,一是教學(xué)模式的改變,如探討國(guó)際化教學(xué)模式和本土案例驅(qū)動(dòng)相結(jié)合的課程建設(shè)[1]。從建設(shè)開(kāi)放實(shí)驗(yàn)室、興趣小組、強(qiáng)調(diào)理論聯(lián)系實(shí)際的教學(xué)方法、促進(jìn)師生交流等方面探討了嵌入式系統(tǒng)課程的教改思路[2]。二是從教學(xué)內(nèi)容的角度梳理嵌入式系統(tǒng)設(shè)計(jì)相關(guān)課程在知識(shí)體系中的定位,提出“計(jì)算機(jī)組成與體系結(jié)構(gòu)”課程群的建設(shè)目標(biāo)和思路,給出嵌入式系統(tǒng)課程的定位和教學(xué)內(nèi)容[3]。研究多所高校的嵌入式系統(tǒng)課的教學(xué)內(nèi)容,給出更合理的課程架構(gòu)和教學(xué)內(nèi)容設(shè)置[4]。三是針對(duì)特定專(zhuān)業(yè)來(lái)探討嵌入式系統(tǒng)相關(guān)課程的教學(xué)內(nèi)容,如探討面向物聯(lián)網(wǎng)專(zhuān)業(yè),基于新的實(shí)驗(yàn)平臺(tái)的嵌入式系統(tǒng)開(kāi)發(fā)課程的教學(xué)改革思路[5-6]。還有就是針對(duì)實(shí)驗(yàn)環(huán)節(jié)的一些教改想法,如針對(duì)嵌入式系統(tǒng)的實(shí)驗(yàn)內(nèi)容設(shè)置和管理提出教改的思路[7]。綜上所述,針對(duì)嵌入式系統(tǒng)相關(guān)課程的實(shí)踐教學(xué)改革項(xiàng)目還比較少。目前嵌入式系統(tǒng)課程的實(shí)踐教學(xué)也存在一些問(wèn)題:以開(kāi)發(fā)板實(shí)物為核心的實(shí)驗(yàn)環(huán)境在非面對(duì)面教學(xué)需求下開(kāi)展難度大;實(shí)物開(kāi)發(fā)板的配置靈活性差、成本高,不能快速適應(yīng)課程教學(xué)的需求變化。比如針對(duì)新的 RISC-V架構(gòu),購(gòu)置設(shè)計(jì)一整套R(shí)ISC-V開(kāi)發(fā)實(shí)驗(yàn)環(huán)境和實(shí)驗(yàn)需要的時(shí)間周期和成本都比較高,在網(wǎng)絡(luò)相關(guān)實(shí)驗(yàn)中配置多實(shí)例的實(shí)驗(yàn)環(huán)境也比較困難。
使用指令模擬器、仿真運(yùn)行環(huán)境可以很好地解決上述問(wèn)題。業(yè)界出于降低成本的考慮,采用仿真平臺(tái)驗(yàn)證嵌入式系統(tǒng)和芯片軟硬件設(shè)計(jì)已經(jīng)比較普遍,完全有必要引入本課程支撐實(shí)踐教學(xué)環(huán)節(jié)。而且基于仿真平臺(tái)的實(shí)驗(yàn)教學(xué)能夠很方便地支撐遠(yuǎn)程或線上教學(xué)的需求,還能充分利用線上教學(xué)的各種便利條件。仿真平臺(tái)又保證了在其上的操作系統(tǒng)、應(yīng)用軟件與真實(shí)硬件環(huán)境里的完全一樣。仿真平臺(tái)可以很方便地實(shí)現(xiàn)多實(shí)例部署,實(shí)現(xiàn)仿真多個(gè)目標(biāo)系統(tǒng)的實(shí)驗(yàn)環(huán)境。仿真平臺(tái)也能很方便地變換為對(duì)另一個(gè)處理器環(huán)境,比如RISC-V等。
QEMU(quickemulator)是一款由FabriceBellard編寫(xiě)的免費(fèi)的可執(zhí)行硬件虛擬化的開(kāi)源托管虛擬機(jī)。具有較高的運(yùn)行速度、跨平臺(tái)的特性。QEMU通過(guò)動(dòng)態(tài)的二進(jìn)制轉(zhuǎn)換,在宿主環(huán)境中模擬多種不同類(lèi)型的處理器,并且提供一組設(shè)備模型,使它能夠運(yùn)行多種未修改的操作系統(tǒng),并可通過(guò)與 KVM 協(xié)作達(dá)到接近本地處理器速度運(yùn)行虛擬機(jī)。QEMU還可以以用戶(hù)模式運(yùn)行,提供基本的運(yùn)行庫(kù)環(huán)境??紤]到性能表現(xiàn)QEMU僅提供功能級(jí)仿真,但對(duì)于嵌入式系統(tǒng)課程教學(xué)來(lái)說(shuō)已經(jīng)足夠了。在本課程的實(shí)踐環(huán)境中,用QEMU仿真ARM處理器運(yùn)行樹(shù)莓派操作系統(tǒng)Raspbian模擬樹(shù)莓派ARM開(kāi)發(fā)環(huán)境。
QEMU功能全面,同時(shí)也具有命令行參數(shù)復(fù)雜,系統(tǒng)級(jí)仿真運(yùn)行的運(yùn)行準(zhǔn)備工作復(fù)雜繁多。為了簡(jiǎn)化問(wèn)題,讓學(xué)生在學(xué)習(xí)處理器指令時(shí)也有一個(gè)較好的實(shí)例化練習(xí)環(huán)境,本課程還引入了一個(gè)ARM指令模擬器。ArmSim#是R.Nigel Horspool開(kāi)發(fā)的ARM7TDMI指令模擬器,可以完成嵌入式系統(tǒng)設(shè)計(jì)課程講授的 ARM7TDMI指令的模擬運(yùn)行,可以顯示處理器寄存器、內(nèi)存、堆棧等部件的狀態(tài),能進(jìn)行GNU格式匯編程序的編譯和運(yùn)行,并支持調(diào)試運(yùn)行、簡(jiǎn)單的外設(shè)模擬和SWI中斷服務(wù)。ArmSim#可以通過(guò)插件的形式實(shí)現(xiàn)虛擬的開(kāi)發(fā)板,支持按鈕、LED、七段數(shù)碼管、鍵盤(pán)、LCD顯示屏等功能,并通過(guò)一套SWI軟中斷服務(wù)程序進(jìn)行驅(qū)動(dòng)。ArmSim#的運(yùn)行環(huán)境非常簡(jiǎn)單,對(duì)程序的編寫(xiě)格式要求低,不需要操作系統(tǒng)特別支持,也不需要運(yùn)行庫(kù)支撐,能運(yùn)行在一般Windows環(huán)境,能方便地進(jìn)行調(diào)試運(yùn)行,對(duì)于學(xué)生學(xué)習(xí)ARM基本指令有很大幫助。
圖1 基于仿真系統(tǒng)的教學(xué)平臺(tái)架構(gòu)
上圖是基于仿真系統(tǒng)的教學(xué)平臺(tái)架構(gòu)。在 Vmware基本虛擬運(yùn)行環(huán)境中運(yùn)行 Ubuntu作為虛擬的宿主系統(tǒng),在Ubuntu環(huán)境中再運(yùn)行QEMU系統(tǒng)仿真ARM環(huán)境,再運(yùn)行Raspbian樹(shù)莓派系統(tǒng)作為虛擬的目標(biāo)系統(tǒng)。這種架構(gòu)主要考慮到學(xué)生的計(jì)算機(jī)基本環(huán)境主要是 Windows10/11、MacOS、Ubuntu 等。通過(guò)Vmware運(yùn)行 Ubuntu操作系統(tǒng),取得一致的基本運(yùn)行環(huán)境。雖然Windows10/11環(huán)境有更好WSL環(huán)境,但是考慮到安裝WSL需要進(jìn)行Windows版本升級(jí),而且其他操作系統(tǒng)沒(méi)有對(duì)應(yīng)的支持,仍然在實(shí)驗(yàn)指導(dǎo)書(shū)中建議使用Vmware虛擬機(jī)的方式,當(dāng)然對(duì)能力較強(qiáng)的學(xué)生也鼓勵(lì)使用其他方法得到基本的Ubuntu運(yùn)行環(huán)境。在這樣的基本環(huán)境中再運(yùn)行QEMU的ARM版本,用system方式運(yùn)行,運(yùn)行專(zhuān)用的kernel文件、設(shè)備樹(shù)文件和對(duì)應(yīng)文件系統(tǒng)文件啟動(dòng)Raspbian操作系統(tǒng)。Ubuntu系統(tǒng)作為宿主系統(tǒng),Raspbian系統(tǒng)作為目標(biāo)系統(tǒng),構(gòu)成基本的虛擬樹(shù)莓派嵌入式開(kāi)發(fā)環(huán)境。并且Ubuntu運(yùn)行于x86處理器架構(gòu)下,Raspbian運(yùn)行于ARM處理器架構(gòu)下,符合對(duì)實(shí)際硬件環(huán)境的仿真要求。
通過(guò)上述兩個(gè)環(huán)境,能夠很好地支持學(xué)生學(xué)習(xí)ARM處理器和指令,學(xué)習(xí)基于ARM和Linux環(huán)境的嵌入式環(huán)境搭建、開(kāi)發(fā)、調(diào)試技能。下面就基于指令模擬器和仿真系統(tǒng)設(shè)計(jì)的一些典型實(shí)驗(yàn)做一下說(shuō)明。
為了講授虛擬開(kāi)發(fā)板的基本外設(shè)控制設(shè)計(jì)本實(shí)驗(yàn)。實(shí)驗(yàn)要求學(xué)生編寫(xiě)簡(jiǎn)單ARM匯編程序調(diào)用SWI軟件中斷服務(wù)實(shí)現(xiàn)虛擬開(kāi)發(fā)板通過(guò)按鈕控制LED燈按照一定的規(guī)律循環(huán)閃亮,并通過(guò)數(shù)碼管顯示當(dāng)前模式。通過(guò)程序控制輸入設(shè)備按鈕、輸出設(shè)備LED,并編程實(shí)現(xiàn)延時(shí),并需要考慮單執(zhí)行線索程序如何處理延時(shí)操作和讀取外設(shè)狀態(tài)操作的關(guān)系保證程序?qū)斎雱?dòng)作具有合理的響應(yīng)時(shí)延。
此實(shí)驗(yàn)對(duì)訓(xùn)練學(xué)生的 ARM 匯編編程能力有很大好處,需要初步的規(guī)劃寄存器的使用,需要考慮歸納部分常用邏輯作為子程序調(diào)用,需用通盤(pán)考慮程序邏輯的分配。
為了講授虛擬開(kāi)發(fā)板的 LCD顯示屏和鍵盤(pán)的控制,并練習(xí)較復(fù)雜的程序邏輯編寫(xiě)設(shè)計(jì)本實(shí)驗(yàn)。實(shí)驗(yàn)要求學(xué)生通過(guò)鍵盤(pán)控制貪吃蛇游戲的顯示。編寫(xiě)程序通過(guò)鍵盤(pán)控制在LCD顯示屏上以動(dòng)畫(huà)顯示字符串方式實(shí)現(xiàn)蛇身的行進(jìn)、改變方向等過(guò)程,并完成基本的生死判斷,如觸碰區(qū)域邊界等。
此實(shí)驗(yàn)的編程難度較高,對(duì)訓(xùn)練學(xué)生的ARM指令編程能力有很大好處。需要形成一套較完整的寄存器使用規(guī)則,需要學(xué)會(huì)分解和抽象問(wèn)題進(jìn)行整體的架構(gòu)設(shè)計(jì),需要設(shè)計(jì)核心數(shù)據(jù)結(jié)構(gòu),使用內(nèi)存區(qū)域保存多種狀態(tài)參量等。是一個(gè)較完整的編程邏輯和布局訓(xùn)練實(shí)驗(yàn)。
為了講授仿真嵌入式環(huán)境的組成結(jié)構(gòu)、虛擬嵌入式基本開(kāi)發(fā)環(huán)境搭建和驗(yàn)證設(shè)計(jì)了本實(shí)驗(yàn)。實(shí)驗(yàn)要求學(xué)生先搭建基本框架,包括:Vmware15、Ubuntu 18.04、QEMU 6.1.0、Raspbian10。其次建立網(wǎng)絡(luò)環(huán)境,通過(guò)QEMU端口映射連接虛擬宿主機(jī) Ubuntu和目標(biāo)系統(tǒng) Raspbian的練習(xí)。在網(wǎng)絡(luò)連接的基礎(chǔ)上建立ssh、SFTP的登錄和文件傳輸通道并傳送文件進(jìn)行驗(yàn)證。最后通過(guò)在宿主系統(tǒng)中編寫(xiě)C應(yīng)用程序并上傳至目標(biāo)系統(tǒng)進(jìn)行編譯并運(yùn)行,驗(yàn)證整個(gè)仿真系統(tǒng)運(yùn)行環(huán)境搭建的是否正確。
此實(shí)驗(yàn)主要是知識(shí)性的,技能要求較低。要求學(xué)生按步驟完成即可。但也要求學(xué)生對(duì)整體結(jié)構(gòu)概念清晰,并學(xué)習(xí)各個(gè)部件的功能和使用,了解對(duì)應(yīng)指令的功能和用法。此實(shí)驗(yàn)?zāi)芎芎玫赜?xùn)練學(xué)生對(duì)整體結(jié)構(gòu)了解和認(rèn)識(shí)功能部件。
為了講授Linux內(nèi)核基本結(jié)構(gòu)和功能設(shè)計(jì)了本實(shí)驗(yàn)。實(shí)驗(yàn)要求學(xué)生在宿主系統(tǒng)中先安裝x86到ARM的交叉編譯環(huán)境和IDE環(huán)境Vscode;下載安裝對(duì)應(yīng)版本的linux內(nèi)核源碼;對(duì)內(nèi)核源碼進(jìn)行配置和簡(jiǎn)單修改;重新編譯制作內(nèi)核和設(shè)備樹(shù)文件;使用Busybox制作對(duì)應(yīng)文件系統(tǒng);通過(guò)QEMU裝載內(nèi)核、設(shè)備樹(shù)文件和文件系統(tǒng)。最后在宿主系統(tǒng)安裝gdb的多體系架構(gòu)支持版本,進(jìn)行QEMU內(nèi)核啟動(dòng)的gdb調(diào)試運(yùn)行;在Vscode中安裝C/C++插件,進(jìn)行調(diào)試運(yùn)行配置文件配置,通過(guò)Vscode進(jìn)行QEMU內(nèi)核啟動(dòng)的調(diào)試運(yùn)行。
此實(shí)驗(yàn)雖然主要也是知識(shí)概念性的,但處理環(huán)節(jié)多,出錯(cuò)的可能較大。為降低難度,實(shí)驗(yàn)過(guò)程中所有使用到的部件均已準(zhǔn)備好,保證是能相互適配的。本實(shí)驗(yàn)要求學(xué)生對(duì)操作系統(tǒng)、仿真運(yùn)行環(huán)境的概念清晰,對(duì)相關(guān)指令的功能和使用有了解,并且需要具備一定的發(fā)現(xiàn)問(wèn)題、解決問(wèn)題的能力。
為了講授Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)設(shè)計(jì)了本實(shí)驗(yàn)。實(shí)驗(yàn)要求學(xué)生基于一個(gè)樣例設(shè)備驅(qū)動(dòng)程序源碼開(kāi)發(fā)一個(gè)簡(jiǎn)單隨機(jī)數(shù)發(fā)生器字符設(shè)備驅(qū)動(dòng)程序,編譯制作后裝載入內(nèi)核。進(jìn)而基于一個(gè)WEB數(shù)據(jù)展示樣例應(yīng)用進(jìn)行修改,增加對(duì)設(shè)備驅(qū)動(dòng)對(duì)應(yīng)設(shè)備文件的訪問(wèn)得到隨機(jī)數(shù)字序列并展示在宿主系統(tǒng)的瀏覽器上。
本實(shí)驗(yàn)有一定難度,需要學(xué)生學(xué)習(xí)了解設(shè)備驅(qū)動(dòng)程序的組成和工作方式,學(xué)習(xí)了解WEB應(yīng)用框架的組成和運(yùn)行機(jī)制,并具備一定編程能力。實(shí)驗(yàn)?zāi)芎芎玫赜?xùn)練學(xué)生編寫(xiě)設(shè)備驅(qū)動(dòng)程序和綜合應(yīng)用程序的能力。
目前產(chǎn)業(yè)界已經(jīng)存在大量基于嵌入式系統(tǒng)承載物體識(shí)別、人臉識(shí)別類(lèi)的AI應(yīng)用。為了能讓學(xué)生了解AI技術(shù)的發(fā)展,我們?cè)谇度胧较到y(tǒng)課程實(shí)踐環(huán)節(jié)也增加了移植人工智能平臺(tái)并進(jìn)行物體識(shí)別的實(shí)驗(yàn)。實(shí)驗(yàn)要求在仿真Raspbian系統(tǒng)中移植原來(lái)在x86環(huán)境運(yùn)行的AI平臺(tái)darknet,并進(jìn)行物體識(shí)別運(yùn)算過(guò)程以驗(yàn)證移植的效果。
之所以選擇darknet,主要是考慮到darknet是C語(yǔ)言開(kāi)發(fā)的,對(duì)支持庫(kù)的需求很小。而且darknet可以運(yùn)行多種yolo族物體識(shí)別模型,yolo族模型是物體識(shí)別領(lǐng)域效果好且非常常見(jiàn)的基于深度神經(jīng)網(wǎng)絡(luò)的算法,并且在開(kāi)放資源中能夠得到訓(xùn)練好的權(quán)重文件。
實(shí)驗(yàn)要求學(xué)生從x86環(huán)境把darknet源碼移植到ARM環(huán)境,在宿主系統(tǒng)中進(jìn)行制作文件修改,交叉編譯制作。使用準(zhǔn)備好的權(quán)重文件對(duì)特定圖片文件進(jìn)行模型判斷。實(shí)驗(yàn)有一定難度,為降低難度,事先已經(jīng)準(zhǔn)備好可以移植的darknet源碼版本,實(shí)際移植的步驟已經(jīng)確定,不需要探索。實(shí)驗(yàn)要求學(xué)生掌握軟件移植的基本原則和過(guò)程,了解基于深度學(xué)習(xí)的AI技術(shù)基本知識(shí),AI平臺(tái)運(yùn)行的基本知識(shí),了解在嵌入式平臺(tái)運(yùn)行AI應(yīng)用會(huì)遇到的問(wèn)題和解決方法。
基于模擬仿真平臺(tái)的實(shí)踐教學(xué)能很好地解決非面對(duì)面環(huán)境下的教學(xué)工作,而且在部署靈活性、可調(diào)試、展示能力上極大地超越實(shí)物環(huán)境。本文中提到的所有實(shí)驗(yàn)都在本科或研究生嵌入式系統(tǒng)課程的實(shí)踐環(huán)節(jié)得到了應(yīng)用,取得了較好的效果。雖然模擬仿真環(huán)境并不能模擬實(shí)物環(huán)境實(shí)驗(yàn)遇到的全部問(wèn)題,在產(chǎn)業(yè)界仿真工作環(huán)節(jié)也不會(huì)完全代替實(shí)物調(diào)試環(huán)節(jié),但是模擬仿真步驟能取代很大部分實(shí)物調(diào)試工作,并極大地縮短實(shí)物調(diào)試的時(shí)間。因此,基于模擬仿真平臺(tái)的實(shí)踐教學(xué)方式是嵌入式系統(tǒng)課程和其他計(jì)算機(jī)類(lèi)課程實(shí)踐環(huán)節(jié)的有益嘗試。今后在虛擬設(shè)備的研發(fā)上可以做進(jìn)一步工作,開(kāi)發(fā)出不同類(lèi)型的虛擬設(shè)備,可以支持更深入、更真實(shí)的嵌入式系統(tǒng)實(shí)踐訓(xùn)練。