張玲+晏伯武
摘要:嵌入式處理器和接口編程是嵌入式課程體系的基礎課程,是培養學生理解并應用嵌入式硬件資源的實踐性課程,因此嵌入式處理器和接口編程實踐教學項目的設置對學生理解處理器原理和硬件接口有著重要的意義。本文針對嵌入式處理器接口及外圍資源編程的實踐教學,設置了嵌入式處理器體系結構及編程、GPIO編程、異常和中斷、嵌入式處理器外圍資源編程等教學內容,以階段項目驅動的教學方法將抽象知識具體化,以期讓學生更好地理解硬件原理,學會時序控制硬件的編程,提高實際操作能力和對綜合知識的運用能力。
關鍵詞:驅動編寫;嵌入式處理器編程;項目驅動
中圖分類號:G434 文獻標識碼:A 論文編號:1674-2117(2017)11-0095-03
● 引言
近年來,從工業控制應用到智能家具,再到人工智能都離不開嵌入式系統的發展。為了滿足社會需求,各大高校相繼開設了嵌入式課程體系。與一般某門課程的教學不同,嵌入式課程是一個課程體系,幾乎涉及計算機專業的所有課程,所以常規的上課和實驗方式已經不能滿足該課程體系的需求。為了提高教學效率,本文針對嵌入式處理器和接口編程實踐教學進行了研究,旨在實施以項目為驅動的教學方式,將抽象的知識具體化,并應用到實際的項目中,這樣不僅可以提高學生的學習興趣,而且可以提高學生對基本知識的理解和應用能力,以及動手實踐能力,為后續課程的學習打下良好的基礎。
鑒于嵌入式處理器和接口編程要求學生掌握和理解嵌入式處理器的體系結構、指令系統、匯編語言、匯編與C混合編程,筆者對嵌入式處理器體系結構及編程、通用輸入輸出接口、異常和中斷、處理器外圍資源編程等方面進行了詳細闡述。
● 嵌入式處理器體系結構及編程
該部分主要針對嵌入式處理器結構和編程進行項目設置和教學內容設置,其中包括嵌入式處理器組成原理、寄存器設置、CPU原理、指令格式、指令系統和匯編語言。
由于該部分的知識點比較抽象,且難以設置足夠的課時來詳細講授,所以如何把抽象知識具體化,使學生掌握嵌入式體系結構的硬件和軟件原理非常關鍵。該部分項目設置的目的就是讓學生掌握基本匯編的用法、匯編和C語言用法,掌握寄存器的設置方法等。
考慮到學生是第一次接觸嵌入式硬件編程,還沒完全形成硬件編程思想,所以筆者設置了基本通用輸入輸出接口點亮LED燈的小項目,以此達到兩個目的:一是學會匯編語言的基本編程、匯編和C混合編程以及基本的在線調試和運行方法;二是了解基本的GPIO編程思想,學會硬件寄存器的配置方法,為下一步的GPIO編程打下基礎。
具體的項目設置和教學內容如下頁表1所示,在第一個項目中,GPJ2口接8個LED小燈,要求學生實現至少3種跑馬燈效果。教師先給學生講解點亮一個小燈的原理,然后要求學生以同樣的方式點亮同一組GPIO連接的所有小燈,并用軟件方式實現不同的顯示效果。在第二個項目中,要求學生通過打開和關閉Cache運行小燈閃爍的程序,來體會Cache的作用。
● GPIO(通用可編程IO接口)編程
GPIO編程是嵌入式處理器編程的核心部分,它可以用編程語言通過簡單地描述數字信號來控制外部設備工作。由于CPU對所有外設的控制都是通過GPIO編程來完成,所以該部分的學習對嵌入式應用開發來說非常重要。對于教學用到的嵌入式核Cortex-A8來說,它包含多組基本功能引腳,由于每組都涉及不同的寄存器,所以每組引腳都能提供不同的功能。然而,功能較多所帶來的問題就是繁瑣的編程,因為針對不同的功能需要設置不同的工作模式,這些都需要用編程語言進行寄存器配置。
為了簡化難度,使學生更易于理解,筆者針對該部分的知識點設置的項目是:C語言實現寄存器設置,完成跑馬燈的不同效果;C語言完成蜂鳴器的控制,實現不同的音樂;時鐘的原理和設置。具體的項目設置和教學內容如表2所示。
● 異常和中斷
Cortex-A8的異常處理的實質是利用中斷原理處理各類異常。中斷技術是處理器高效處理各類事件的有效方式,這個概念雖然簡單,但對于剛接觸中斷技術的學生來說,理解起來還是存在困難。為了較好地理解該部分的知識點,學生可以將其與已學過的查詢式編程進行類比。在查詢式編程中,處理器除了查詢標志位外,其他什么事情也不用做,而中斷的主動權在請求程序上,當哪個資源需要CPU時,會主動發出中斷請求,相當于告訴CPU:我準備好了,你可以過來處理這件事情。而在中斷源還沒準備好時,CPU可以處理其他事情,這樣就減少了CPU的等待時間,提高了CPU的工作效率。
中斷部分的講解利用外部中斷源發出中斷,而要處理的中斷服務程序為點亮LED燈,即CPU要處理的事情為點亮LED燈,以及以不同的方式點亮LED燈。在該項目中,中斷源為CPU的外部中斷引腳,觸發中斷產生的中斷源為每位學生,請求CPU處理的程序為點亮LED燈。這樣能讓學生通過親自編程和體驗,將抽象的知識具體化,理解和掌握中斷概念,并學會中斷編程。
該項目利用外部中斷GPJ1口的編程過程可以描述為:設置GPJ1CON= GPJ1CON & 0xffff0fff,GPJ1CON|= GPJ1CON|(0xF<<4*3),即可配置寄存器為中斷功能;GPJ1_3下拉功能,GPJ1PUD=GPJ1PUD& 0xff3f,GPJ1PUD=GPJ1PUD| (0x40);將CPJ4_4設置為輸出模式,GPJ4CON=GPJ4CON& 0xfff0ffff,GPJ4CON=GPJ4CON| 0x10000;設置GPJ4_4輸出高電平,GPJ4DAT=GPJ4DAT|0x10;清除中斷掛起位,GPJ1_INT_PEND= GPJ1_INT_PEND&(1<<3);點亮LED燈,GPJ2DAT=GPJ2DAT| 0x1,clear_Vicaddress()。