于杰
(廈門大學嘉庚學院 計算機科學與技術系,福建 漳州 363105)
關于基于ARM嵌入式軟件設計教學的若干探索
于杰
(廈門大學嘉庚學院 計算機科學與技術系,福建 漳州 363105)
嵌入式軟件設計是當今社會需求的一個熱點,也是高校計算機專業(yè)教學的一個難點,長期以來高校的嵌入式軟件設計教學存在著忽視開源軟件教學工具,輕視軟件調試教學,和缺乏軟件設計實例化等問題,本文主要在實際教學的基礎上,總結出若干解決辦法,從而達到提高嵌入式軟件設計教學水平的目的.
嵌入式;軟件設計;軟件調試;開源軟件;項目化;教學
目前,嵌入式產品已經無處不在,通信、信息、數字家庭和工業(yè)控制等領域,隨處都能見到嵌入式產品.而ARM系列的處理器更是其中的佼佼者,這使得基于ARM的嵌入式系統成為當今計算機領域最熱門的學科之一,龐大的嵌入式軟件系統的市場急需大量合格的專業(yè)人才,這無疑為高校的嵌入式軟件設計教學帶來了新的機遇[1].但與此同此,嵌入式知識的學習非常廣泛,不僅要學習程序設計的知識,同時也涉及到數據結構,計算機組成原理,操作系統和編譯原理等相關知識,這樣為相應的教學帶來了不小的挑戰(zhàn),如何既能做到聯系相關課程的知識,又能突出嵌入式軟件設計本身的特點,便成為當前嵌入式軟件設計教學急需解決的問題.而本文主要總結了作者在嵌入式軟件設計教學方面的經驗,希望能夠對其他高校的嵌入式軟件設計教學有所啟發(fā).
目前高校傳統的嵌入式軟件教學主要采用的是ADS、RVDS、以及CodeWarrior等國外商業(yè)軟件進行,這些商業(yè)軟件有著穩(wěn)定可靠、方便易用、可擴展性強等諸多優(yōu)點,但是由于其商業(yè)性質的原因,也不可避免的帶來了,諸如知識產權,軟件費用,以及盜版泛濫等相關問題,這些問題已經嚴重的影響了嵌入式軟件教學的進一步發(fā)展.把開源軟件長期排除在外,使開源軟件教育以商業(yè)化培訓為主,是少數人才能接受的“陽春白雪”式高端教育,未能形成開源人才的規(guī)?;囵B(yǎng).對于國內眾多開源企業(yè)來說,“招不到合適的人才”也成為長期困擾企業(yè)發(fā)展的瓶頸之一.而把開源軟件和開發(fā)環(huán)境引入高校課堂當中,正是對開源軟件普及型教育的一種體現,也是增強計算機專業(yè)畢業(yè)生競爭力的一種手段.
為此,筆者根據本?;贏RM的嵌入式軟件設計教學實際情況,使用GNU-Make與編譯器配合負責代碼的管理.GNU-Make可以支持大多數PC操作系統,包括Windows、Linux、MacOS等,GNU-Make的機制簡單易懂且適用于模塊化的系統,而且GNU-Make其完全免費的特性,更可以在實驗室等環(huán)境大面積的使用,而沒有費用問題,這樣就為學生的學習搭建了一個有效的平臺,而且,該平臺由于沒有過多的封裝,開放其內部的細節(jié),也適合學生進一步的了解,且具有良好的跨平臺移植能力,可用于多種教學和實驗環(huán)境中.
2.1 嵌入式軟件調試教學的起因
在大多數傳統的基于ARM嵌入式軟件設計更多的是強調怎樣進行軟件的設計,希望通過程序設計的教學,讓學生掌握相應的知識,但這樣帶來的一個問題就是學生會認為軟件開發(fā)的主要過程就是設計和編碼的過程而對調試和測試的理解和掌握不夠深刻.初學者在設計編寫程序的時候,很可能出現各種意料之外的情況,比如突然有一個錯誤報告,或者給出一個看似正確但卻并非我們期望的結果,也可能忽略用戶的命令,甚至長時間沒有反應等,這些都是需要通過軟件調試來進行解決的.筆者在教學過程中注意總結出初學者易犯的若干種錯誤,并給出解決這些錯誤的常見調試方法.
2.2 調試工具GDB的引入
通過對調試工具GDB的引用來向學生介紹常見的調試方法和思路,比如調試中必不可少的內容—斷點,向學生講授關于斷點的細節(jié),包括設置、刪除和禁用斷點,從一個斷點移到另一個斷點,查看關于斷點的詳細信息等等.而對于這些調試最適應的算法,當非樹的遍歷莫屬,這樣就采用實例涉及遍歷樹的代碼,重點是介紹當到達斷點時如何方便的顯示樹中節(jié)點的內容.再比如由于段錯誤而產生的致命運行時錯誤,筆者首先介紹了崩潰時在底層發(fā)生了什么事,包括程序的內存分配以及硬件與操作系統的協同作用.并繼而向學生介紹核心文件,包括如何創(chuàng)建核心文件,如何使用它們來完成“事后反思”.
2.3 錯誤代碼的解決
使用GDB工具進行調試的前提是代碼的成功編譯,但是在實際的軟件開發(fā)當中,學生經常會遇到代碼不能編譯的情況,那么這時候,GDB調試工具將變得無能為力,因此一些常見的處理這種問題的方法也需要介紹給學生,比如如何處理缺少必要的庫造成的連接失敗問題,比如如何處理編譯器指出第x行有語法錯誤,而事實上第x行完全正確,真正的錯誤在前面的某一行.而這些過程中學生們會發(fā)現他們以前學過的確認原則,二分法搜索原則非但不再抽象,晦澀,反而是一種有效的解決問題的方法和手段[2].
現有的嵌入式教材大體可以分為兩類,一類教材泛泛而談:ARM、MIPS、x86等各種體系結構處理器均做了介紹;uC/OS、Linux、WinCE等各種操作系統也是一一羅列其特色,但這種教材對于學生來說,更多的是走馬觀花的查閱,很難掌握嵌入式的基礎知識,更無法了解基于某一款處理器的基本開發(fā)過程.另一類教材通常是由嵌入式系統實驗設備廠家提供的,基本就是數據手冊加實驗手冊,學生使用這種教材往往只見樹木不見森林,也很難系統掌握嵌入式系統的基本理論和概念[3].
筆者在從事基于ARM的嵌入式軟件設計教學工作中,根據自己的授課經驗,總結出一套實例化的教學方法,由于嵌入式程序開發(fā)平臺(PC機)和運行平臺(嵌入式設備)的不同,所以所有的嵌入式開發(fā)遇到的第一個問題,毫無疑問的就是軟件的移植,所以筆者的實例化教學也是圍繞著軟件移植而展開的.
首先是Bootloader的移植,介紹了Bootloader相關知識、移植方法及要注意的事項.之后以U-boot為例,詳細的分析了U-boot代碼,并修改U-boot代碼,使之支持Norflash和Nandflash、Nandflash啟動、DM9000網卡和YAFFS文件系統.通過本實例的學習,學生將會對嵌入式通用的Bootloader有一個大體的了解,并且可以熟練的移植U-boot和使用U-boot.
其次是內核的移植,對Linux內核組成和目錄進行講解,分析Linux內核的Makefile,解釋了Makefile的編譯流程,之后講解如何對內核進行剪裁配置,使之支持YAFFS、RTC時鐘、LCD和DM9000等,最終實現了在ARM平臺上的內核移植,這樣學生將對Linux內核有一個更深入的了解,學會如何進行內核的剪裁和內核的移植,同時以Busybox為基礎進行嵌入式開發(fā)板文件系統的移植,這樣學生通過對文件系統的選擇,對嵌入式系統特點有更深入的了解,也將熟練的掌握如何配置一個文件系統并對其進行移植.
再次是驅動程序的移植,首先對Linux設備驅動進行了介紹和分類,講解了設備驅動程序的移植步驟,以Hello world、led和按鍵三個實例介紹了Linux設備驅動的移植過程,之后講解了如何完善串口、USB、聲卡和SD卡的驅動.通過這些的學習,學生將會明白Linux設備驅動的重要性,學會如何寫一個簡單的Linux設備驅動并將此驅動編譯進內核,或者以模塊方式加載到內核中,之后學生將學會如何完善Linux已有的一些驅動程序.
最后是應用程序的移植,先對嵌入式GUI進行簡單的介紹,并對常見的一些GUI進行交叉編譯和安裝,之后進行音頻解碼器madplay的移植、數據庫SQLite的移植和Webserver的移植,通過這些學習,學生將掌握應用程序移植的關鍵,達到舉一反三的目的,嘗試移植更多的應用程序.由于現在Android系統的火爆和市場對Android人才的大量需求,筆者也加入了對Android系統的移植講解.
總結,通過上述教學方法的實施,學生的學習目標更加的確定,并使得學生對理論學習熱情和主動性都有所提高,加強了學生的動手能力,這些經歷可能會改變一個人的學習和工作習慣,也許對學生來說是受益終身的.另外,由于學生在大學期間已經有了一些項目開發(fā)的基礎,從文檔寫作到涉及編碼的過程都得到了鍛煉,因此學生很容易找到工作,就業(yè)之后,也能非常順利的實現過渡.
〔1〕文全剛.嵌入式linux操作系統原理與應用[M].北京航空航天大學出版社,2011.
〔2〕張云.軟件調試的藝術[M].人民郵電出版社,2009.
〔3〕李寧,宋薇,庫少平.項目化嵌入式教學方法研究[J].單片機與嵌入式系統應用,2010(2):5-8.
G642
A
1673-260 X(2013)10-0240-02