石宜金 譚貴生
摘? 要:根據(jù)應(yīng)用型本科院校和教育部的教育方針,需要不斷地提高學生實踐能力,文章提出一種嵌入式技術(shù)教學方法,通過以實踐的教學項目為中心,提高學生編寫嵌入式開發(fā)驅(qū)動程序的書寫技能,提出一種基于Hello World程序設(shè)計思維的LED驅(qū)動程序開發(fā)教學模式,通過項目的教學實踐,比較各種模式下LED驅(qū)動的優(yōu)缺點和使用情景,該方法與其他三種編程方法相比,操作簡單,能夠提高學生的積極性,最終達到教學要求,在很大程度上提高教學質(zhì)量。
關(guān)鍵詞:教學模式;嵌入式;Hello World;能力培養(yǎng)
中圖分類號:G642? ? ? ?文獻標志碼:A? ? ? ? ? 文章編號:2096-000X(2022)06-0100-05
Abstract: In view of the educational policy of application-oriented universities and the Ministry of Education, it is necessary to continuously improve students' practical ability. This paper proposes a teaching method based on embedded technology, which, through practical teaching projects as the center, improves students writing skills of embedded development drivers. This paper proposes a teaching mode of LED driver development based on Hello World programming thinking. Through the teaching practice of the project, the advantages and disadvantages of LED drivers in various modes and application scenarios are compared. Compared with the other three programming methods, the method is simple in operation, can improve the enthusiasm of students, and finally can meet the teaching requirements, which shows that the teaching method is effective and improves the teaching quality to a large extent.
Keywords: teaching mode; embedded; Hello World; ability training
嵌入式技術(shù)所涵蓋的面較廣,包括硬件、軟件以及操作系統(tǒng)和通信等,在對電子信息工程和計算機科學與技術(shù)專業(yè)大學本科三年級和四年級的教學中,該課程的方向可以分為硬件方向和軟件方向,其中硬件方向的驅(qū)動開發(fā)難度較大,對于學生的能力要求較高,既需要硬件知識,又需要軟件知識。因此,第一次課程的教學設(shè)計和教學內(nèi)容尤其重要。
和其他編程課程一樣,各種語言的學習一開始都為大家設(shè)計了一個著名的Hello World程序,對該程序情有獨鐘。對于硬件程序的編程來說,僅僅依靠以前的一個Hello World就達不到這個程序的目標。Hello World程序其實在早期起著較為重要的作用。一方面,這個程序可以讓學習者較為輕松地了解將要學習的程序設(shè)計有什么特點?怎么編寫?怎么編譯?怎么運行?另外一方面,通過這個程序的學習和演示,可以提高學習者的學習興趣,更重要的是對這門課程或語言的學習有一個系統(tǒng)的清晰的認識,在心里上降低學習者的學習難度,提高學習興趣,這也符合認知的自然規(guī)律。
嵌入式技術(shù)中的硬件驅(qū)動編程部分,對于學生來說,學習難度較大,主要體現(xiàn)在編程環(huán)境的搭建、編譯器的不同和軟硬件結(jié)合的繁瑣上。從查閱的參考文獻來看,目前嵌入式技術(shù)類課程驅(qū)動開發(fā)的第一個程序主要是關(guān)于LED燈的程序,其中點亮一個燈和流水燈程序選擇的較多,基于這個思想,筆者根據(jù)多年的嵌入式技術(shù)教學,提出嵌入式驅(qū)動開發(fā)Hello World的教學設(shè)計,具體設(shè)計包括三個步驟,一是圖形化界面的編程,二是Windows環(huán)境下使用Keil編程,三是在Linux環(huán)境下利用GCC編程。
為了提高教學質(zhì)量和教學深度,筆者通過幾輪的教學,摸索出OBE成果導向的教學模式分為圖形化編程、Windows下函數(shù)調(diào)用編程和Linux環(huán)境下的GCC 編程。在第一次課程的教學中以LED驅(qū)動程序的三種寫法作為嵌入式驅(qū)動開發(fā)的課程案例引入,同時在后續(xù)的教學中貫穿這種教學模式,讓學生在編程思維和開發(fā)流程上有較為深刻的認識。
一、圖形編程思維培養(yǎng)
從課程難度來看,如果一開始就進行Linux環(huán)境下的驅(qū)動編寫勢必會使學生產(chǎn)生一定的畏懼感,因此,查閱國內(nèi)外的教學研究資料,最終決定采用圖形化編程進行編程思維培養(yǎng),讓學生首先清楚自己要做什么?要完成的學習任務(wù)和學習目標是什么?通過分析大量的圖形化編程軟件,考慮到延續(xù)性和體系性,決定采用ArduBlock這款圖形化編程軟件來培養(yǎng)學生的編程思維,更重要的是讓學生知道我們要完成的任務(wù),先讓學生有一種成就感。ArduBlock是Arduino的第三方圖形化編程軟件,依附于Arduino軟件,其是文本式、圖形化積木搭建編程的一種可視化的交互性極強的編程方式,如圖1所示。編程門檻降低對于大學生程序設(shè)計能力的提升作用較大,還有一個優(yōu)點是它可以生成C語言,如果你不懂C語言,這樣就能夠引導學生明白C語言的重要性,同時也可以作為C語言的練習環(huán)境,讓學生能夠回憶C語言,同時能夠理解C語言在驅(qū)動編寫方面的高效性和重要性。在安裝圖形化編程環(huán)境后,第一次授課便可以先以圖形化編程實現(xiàn)LED驅(qū)動,并配合硬件的實驗結(jié)果來導入驅(qū)動開發(fā)的第一次課程。如圖1所示,左邊是C語言程序,右邊是圖形化的界面編程界面,通過設(shè)置引腳的輸入輸出來設(shè)置一個閃爍的LED驅(qū)動程序,中間進行演示控制和高低電平的控制,操作非常簡單,學生可以很快上手,同時也能夠發(fā)揮自己的想象空間來完成一些設(shè)計。如圖2所示是制作好的LED燈的實驗結(jié)果。
圖形化編程的優(yōu)勢在于簡單易學,學生能夠大大提高學習興趣并能夠在較短的時間完成簡單的驅(qū)動開發(fā),但是缺點在于理論性不夠,技術(shù)性不夠,不利于學生的深入學習。
二、Windows下函數(shù)調(diào)用編程
在圖形化程序?qū)崿F(xiàn)后,學生對于課程的目的和需要完成的任務(wù)有了清晰的認識,進一步引導學生了解圖形化程序背后的原理,通過理論教學,應(yīng)該讓學生明白驅(qū)動程序的編寫主要是對寄存器的功能設(shè)置,數(shù)據(jù)設(shè)置和測試用例的書寫,因此看懂硬件原理圖和芯片對應(yīng)的用戶手冊后便可以進行程序編寫,目前在這部分的教學中使用Keil軟件來進行教學的學校比較多,因為這款軟件將很多函數(shù)進行了封裝,同時芯片參加也提供了BSP程序,因此程序開發(fā)的流程相對來說難度會有所降低,同時對函數(shù)進行了封裝以后,調(diào)用就比較容易,驅(qū)動的書寫流程就簡化為硬件設(shè)計、寄存器理解和驅(qū)動案例編寫。
圖2 LED硬件實驗結(jié)果
因此,第二部分的教學是在Windows環(huán)境下通過函數(shù)的調(diào)用來完成LED驅(qū)動的編寫,由于有了圖形化編程的經(jīng)驗,學生對于硬件的原理理解起來就相對比較容易,目標就是通過對寄存器的操作來完成高低電平的輸出控制,以及延時程序的書寫,采用的編程語言是C語言。硬件采用STM32F4,體系架構(gòu)采用哈弗架構(gòu)的RISC。要完成這款芯片的LED驅(qū)動編寫,主要任務(wù)有硬件設(shè)計、軟件設(shè)計和bin程序的下載驗證。如圖3所示,硬件采用的是共陽極的二極管,LED0和LED1分別對應(yīng)的引腳是PF9和PF10,此部分可以在芯片原理圖中查找到,要驅(qū)動二極管發(fā)光,需要設(shè)置GPIO,讓PF9和PF10輸出低電平即可,若進行閃爍效果的設(shè)置,就需要調(diào)用延時程序。
在查閱了寄存器之后,分別書寫LED的頭文件和驅(qū)動文件。這部分的教學需要讓學生能夠較好掌握芯片手冊的查閱方式,同時能夠具備一定的英文閱讀能力和理解能力,通過查閱資料可以讓學生慢慢適應(yīng)芯片手冊的使用方式。在理解硬件原理圖和配合芯片手冊的基礎(chǔ)上,結(jié)合寄存器的設(shè)置方式,學會寄存器的功能設(shè)置和寄存器的數(shù)據(jù)設(shè)置,能夠進一步使用芯片所提供的板級支持包來進行函數(shù)調(diào)用,簡化芯片驅(qū)動的開發(fā)流程和進一步熟悉LED驅(qū)動的開發(fā)方法。關(guān)鍵代碼如下:
RCC->AHB1ENR|=1<<5;//使能 PORTF 時鐘
GPIO_Set(GPIOF,PIN9|PIN10,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,PIO_PUPD_PU); //PF9,PF10 設(shè)置
LEDS0=1;//LED0 關(guān)閉
LEDS1=1;//LED1 關(guān)閉
如圖4所示為寄存器的設(shè)置,為了能夠讓硬件驅(qū)動正常工作,首先應(yīng)該對PORTF進行功能設(shè)置。讓它處于使能狀態(tài),通過C語言的位操作來設(shè)置bit5置1,這樣這個時鐘寄存器就能工作,在設(shè)置完寄存器后通過系統(tǒng)提供的板級支持包,調(diào)用GPIO_Set 函數(shù),設(shè)置PF9 和 PF10為OUT模式,然后通過寄存器對LED所接的引腳進行操作,輸出高電平則燈滅,輸出低電平則燈亮。這樣的程序設(shè)計方式能夠讓學生深入地理解keil平臺下借助函數(shù)庫進行編程的原理。關(guān)鍵代碼如下:
#define LED0 PFout(9) // DS0
#define LED1 PFout(10) // DS1
void LED_InitDr(void); //初始化
#define LED0 PFout(9) // DS0
#define LED1 PFout(10) // DS1
驅(qū)動編寫完成后,將其加載到芯片上,硬件已經(jīng)能夠進行正常的工作,為了測試驅(qū)動的功能,下一步進行測試用例的編寫。主要是對上面兩個LED燈進行控制,以函數(shù)的形式進行調(diào)用,調(diào)用之后只需要設(shè)置LED數(shù)據(jù)寄存器的輸出信號為低電平亮,高電平滅,若學生在學習過程中需要添加更加復(fù)雜的功能,可以進行進一步的程序升級。完成硬件驅(qū)動編寫后,學生便可以使用flymcu軟件將驅(qū)動燒錄到芯片上,最后進行功能測試。如圖5所示。
三、Linux操作系統(tǒng)下的驅(qū)動編寫
硬件驅(qū)動的編寫在圖形化界面和Keil環(huán)境下都相對比較容易,上述兩種編程方式可以讓學生清楚課程所需要掌握的技能,同時更加明確課程要學習什么,最終對硬件配置的目的是什么。通過上述兩個LED驅(qū)動的編寫,學生能夠基本掌握驅(qū)動的編寫流程,熟悉了工具軟件的使用方法,起到了Hello World程序教學的目的,但是學生想深入地理解硬件驅(qū)動編程,還必須在Linux操作系統(tǒng)下進行程序開發(fā)。在第二種LED驅(qū)動開發(fā)中,學生進行函數(shù)調(diào)用比較容易,但是卻忽略了函數(shù)背后的深層次原理,對于底層的認識不透徹,尤其在寄存器的定義和配置上面的理解不深入,這樣會導致學生在后續(xù)的學習和工作中無法深入理解嵌入式驅(qū)動開發(fā)的原理,尤其重要的是,在當前的企業(yè)開發(fā)中,大多數(shù)環(huán)境為Linux操作系統(tǒng)下的編程環(huán)境,驅(qū)動開發(fā)完成后還需要進行驅(qū)動內(nèi)核加載和驅(qū)動程序的加載,加載完成后便可以裁減進入到操作系統(tǒng)內(nèi)核,同時進行動態(tài)加載,方便上層APP的調(diào)用。所以進行Linux操作系統(tǒng)下的驅(qū)動開發(fā)教學尤其重要,在教學過程中采用難度較低的Ubuntu操作系統(tǒng),硬件選擇市場上教學資料較多的2440A芯片。
和上面的兩種編程方式一樣,主要進行硬件電路圖的識別、芯片手冊查閱、寄存器物理地址的查找、寄存器的配置和源程序書寫和源程序的GCC編譯。如圖6所示。
GPFCON &= ~(GPF0_mask|GPF2_mask);
GPFCON |=(GPF0_in|GPF2_in);
GPGCON &= ~GPG3_mask;
GPGCON |=GPG3_in;
GPFCON&= ~(GPF4_mask |GPF5_mask|GPF6_mask);
GPFCON |=(GPF4_out|GPF5_out|GPF6_out);
完成源程序編寫后,還需要引入啟動文件,主要是利用一個匯編文件完成看門狗和初始化棧的初始化,然后利用Makefile來使源程序的編譯和鏈接生成bin文件,最后利用u-boot燒寫到nand-flash便可以觀察到LED的效果。
四、教學方法總結(jié)
通過三輪的教學經(jīng)驗總結(jié)和摸索,對于嵌入式技術(shù)的課程教學,主要以成果導向OBE方式進行教學,構(gòu)建和改良了這門課程的教學體系,讓電子信息工程專業(yè)的學生在大一的時候接觸圖形化編程和程序設(shè)計,在大二學習C語言程序設(shè)計的時候通過函數(shù)調(diào)用方法來進行嵌入式驅(qū)動程序的開發(fā),在大三的時候以Linux操作環(huán)境下的編程方式來深入學習嵌入式系統(tǒng)中的驅(qū)動程序開發(fā),進一步對芯片的控制有深入了解。同時,通過LED驅(qū)動的三種教學模式探索適合嵌入式技術(shù)教學的教學方法,通過一個LED程序的書寫,讓學生能夠進一步進行按鍵驅(qū)動、蜂鳴器驅(qū)動和PWM驅(qū)動等程序的編寫,通過這種教學方向,讓學生能夠一步步接觸到嵌入式驅(qū)動開發(fā)的流程,熟悉開發(fā)方法,同時能夠明白自己應(yīng)該努力和重視的方向。經(jīng)典程序LED驅(qū)動程序的開發(fā),借助了Hello World的程序設(shè)計思維,讓學生能夠從現(xiàn)象級別開始,進行深入的底層研究,最終達到教學目標和教學目的。
舉一反三很重要,成功比失敗重要。從心理學的角度看,讓學生擁有巔峰體驗。這是北京航空航天大學高小鵬教授在交流實驗教學的過程中談到的,也正是基于這樣的一個出發(fā)點,在嵌入式驅(qū)動開發(fā)的課程中引入Hello World程序設(shè)計思路,以LED驅(qū)動開發(fā)為案例,分別從圖形化到Keil再到ARM教學,這樣就給學生一種心理上的成功感,同時圖形化編程相當于是功能的模擬,而在Keil環(huán)境下則是進行進一步功能的深入,在Linux環(huán)境下是進行底層的分析,這樣階梯式的教學可以讓學生在掌握更多的同時研究的更多。
以LED驅(qū)動作為出發(fā)點,強化舉一反三的重要性,更加重視這一個導向性,引入Hello World程序設(shè)計思維,做好嵌入式驅(qū)動開發(fā)的Hello World,一方面可以將學生引入課程,另一方面可以提高學生的學習興趣,階梯型遞進的模式讓技術(shù)能夠深挖。通過三輪的嵌入式技術(shù)教學,目前已經(jīng)形成了一個完整的教學體系,每一個模塊的驅(qū)動開發(fā)都借鑒LED驅(qū)動開發(fā)的模式,先進行圖形化編程,進一步進行Keil編程,最后才進入到Linux環(huán)境下進行學習,第一步和第二步都讓學生在課后完成,Linux的驅(qū)動開發(fā)難度稍大,所以在課上教師主要是進行Linux驅(qū)動開發(fā)的講解。通過第一次課LED驅(qū)動開發(fā),學生入門后便能夠自主在課后進行預(yù)習,那么課堂上的學習效率較高,筆者通過這種教學模式的實施,目前學生的硬件驅(qū)動開發(fā)能力逐步提高,學期末的作品考核,學生都能夠獨立完成一個簡單的嵌入式硬件系統(tǒng)的開發(fā),可見這種教學模式的改革在一定程度上提高了教學質(zhì)量,同時缺點在于三種模式的講解比較耗費教學時數(shù),學生需要的硬件設(shè)備也較多,因此在后續(xù)的教學中,一方面需要設(shè)計一種能夠較好兼容圖形化編程、Keil編程和Linux環(huán)境下驅(qū)動編程的硬件,另一方面需要調(diào)整教學方法,在第一次講解完LED驅(qū)動程序后,后續(xù)的實驗要求學生能夠在課后先完成圖形化編程和Keil編程。
對2016級電子信息工程的學習進行統(tǒng)計分析,從學習效果表(表1)可知:嵌入式技術(shù)教學模式的教學效果優(yōu)于其他三門課程的教學方法,說明該方法有效、可行。圖形化驅(qū)動編程是比較簡單的操作課程,容易上手,主要是大一的學生,有一定的引導性;Windows平臺下借助Keil的編程和Linux環(huán)境下的驅(qū)動編程有一定難度,學生的效果不是很明顯;主要是針對大二和大三的學生;嵌入式技術(shù)教學模式主要是從簡到難的過程,有很好的銜接部分,保證學生的學習效率和學習效果,有一定積極性;最終保證良好的學習效果。
五、結(jié)束語
本文通過程序設(shè)計中的Hello World程序設(shè)計思維,以LED驅(qū)動開發(fā)為原型,在嵌入式課程上提出了硬件的Hello World程序,即“三種編程模式的LED驅(qū)動開發(fā)”,旨在提高嵌入式技術(shù)教學的教學質(zhì)量,更重要的是讓學生能夠通過教師的“舉一”,來完成課后的“反三”,讓學生能夠階梯式地進行學習,更重要的是讓學生找到成就感,提高興趣。
參考文獻:
[1]華清遠見嵌入式培訓中心.嵌入式Linux應(yīng)用程序開發(fā)詳解
[M].北京:人民郵電出版社,2009.
[2]華清遠見嵌入式培訓中心.嵌入式Linux應(yīng)用程序開發(fā)標準教程(第2版)[M].北京:人民郵電出版社,2009.
[3]王田苗.嵌入式系統(tǒng)設(shè)計與實例開發(fā)——基于ARM微處理器與uC/OS-II實時操作系統(tǒng)[M].北京:清華大學出版社,2002.
[4]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2008:4.
[5]鳥哥,王世江.鳥哥的Linux私房菜基礎(chǔ)學習篇(第三版)[M].北京:人民郵電出版社,2010.
[6]呂憲軍.基于ARM9的指紋識別門禁系統(tǒng)[D].北京:北京郵電大學,2010.
[7]飛凌嵌入式技術(shù)有限公司.飛凌開發(fā)板配套教程[Z].2009.
[8]陳先在,張麗萍.Linux C函數(shù)實例速查手冊[M].北京:人民郵電出版社,2009.