張?zhí)m芳 紀娟娟
具有強大功能的嵌入式系統(tǒng),目前已作為電信、微電子等專業(yè)的專業(yè)課程,也是相關(guān)專業(yè)學(xué)生就業(yè)的一個良好方向。如何讓學(xué)生快速掌握嵌入式系統(tǒng)匯編指令,能夠進行簡單的程序設(shè)計,為學(xué)生的就業(yè)打下良好基礎(chǔ),是本門課程亟待解決的問題。本文利用ADS開發(fā)環(huán)境對嵌入式匯編指令的學(xué)習(xí)進行了探討,為《嵌入式系統(tǒng)》教學(xué)提供參考。
嵌入式系統(tǒng)ADS匯編指令具有系統(tǒng)內(nèi)核小、專用性強、系統(tǒng)精簡、實時性高等特性的嵌入式系統(tǒng),目前已在許多領(lǐng)域中掀起了嵌入式系統(tǒng)應(yīng)用的熱潮。為了適應(yīng)社會人才的需要以及解決本專業(yè)學(xué)生的就業(yè)工作問題,給本院電子信息科學(xué)與技術(shù)專業(yè)的學(xué)生課設(shè)了嵌入式課程。
嵌入式作為以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),軟硬件可裁剪,適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統(tǒng),對硬件和軟件的要求都相當(dāng)高。學(xué)生可以通過開發(fā)板、實驗箱等了解開發(fā)系統(tǒng)的處理器及相關(guān)設(shè)備,學(xué)生普遍反映匯編語言下的底層文件、初始化文件、控制命令都看不懂。因此,掌握匯編指令是嵌入式系統(tǒng)學(xué)習(xí)的難點,為了解決該問題,本文借助嵌入式開發(fā)集成環(huán)境ADS對如何快速掌握嵌入式匯編指令進行了探討和嘗試。
一、嵌入式系統(tǒng)開發(fā)過程
(一)ADS簡介
ADS及ARM Developer Suite的縮寫,是Metrowerks公司在1993年開發(fā) ARM處理器下最主要的開發(fā)工具。ADS是全套的實時開發(fā)軟件工具,編譯器生成的代碼密度和執(zhí)行速度都較優(yōu)異。
ADS對匯編、C/C++、java均有很好的支持,是目前最成熟的ARM開發(fā)工具。ADS有ARM擴展調(diào)試器(AXD,ARM Extended Debugger)、ARM 符號調(diào)試器(ARMSD,ARM Symbolic Debugger)、與老版本兼容的Windows或Unix下的ARM調(diào)試工具(ADW/ADU,Application Debugger Windows/Unix)等三種調(diào)試器。
AXD不僅擁有低版本ARM調(diào)試器的所有功能,還新添了圖形用戶界面,更方便的視窗管理數(shù)據(jù)顯示,格式化和編輯以及全套的命令行界面。該產(chǎn)品還包括Real Monitor(可以在前臺調(diào)試的同時斷點續(xù)存并且在不中斷應(yīng)用的情況下讀寫內(nèi)存跟蹤調(diào)試工具)。
(二)ADS工程開發(fā)過程
ADS工程開發(fā)和前期課程學(xué)習(xí)的單片機開發(fā)環(huán)境KEIL有很多地方是類似的,但是它的位置又復(fù)雜了一些。ADS工程開發(fā)過程主要分為以下三個過程:
1.建立工程
(1)在建立工程時有7個選項,如圖1所示。ARM處理器有32位ARM和16位Thumb兩種工作狀態(tài),一般工作在32位狀態(tài)下,因此一般選擇第一項,ARM Executable Image是ARM的通用模板,選中它即可生成ARM的執(zhí)行文件。
(2)對于Debug Setting的ARM linker是工程設(shè)置的重點, 在output欄中設(shè)定程序的代碼段地址,以及數(shù)據(jù)使用的地址。圖2中的RO Base欄中填寫程序代碼存放的起始地址,RW Base欄中填寫程序數(shù)據(jù)存放的起始地址。在Layout欄中,如圖3,在Place at beginning of image框內(nèi),需要填寫項目的入口程序的目標(biāo)文件名,如,整個工程項目的入口程序是44binit.s,那么應(yīng)在Object/Symbol處填寫其目標(biāo)文件名44binit.o,在Section處填寫程序入口的起始段標(biāo)號。它的作用是通知編譯器,整個項目的開始運行,是從該段開始的。
2.編譯和鏈接工程
將編輯好的程序代碼進行保存添加到工程中去,點擊make即可實現(xiàn)整個工程的編譯鏈接,若編譯成功,會出現(xiàn)編譯錯誤為0的報告,接下來就可對工程進行仿真調(diào)試。
3.仿真調(diào)試
點擊debug,IDE環(huán)境就會啟動AXD調(diào)試軟件。如果沒啟動就要對其目標(biāo)進行設(shè)定,如圖4所示,在軟件仿真時選擇ARMULATOR。
二、如何快速掌握匯編指令
匯編語言是學(xué)生學(xué)習(xí)多門課程的難點,而對于一些I/O、底層文件等又必須要用匯編,實際中幾乎每個工程都要用匯編的,因此匯編語言的掌握是嵌入式開發(fā)的關(guān)鍵。雖然學(xué)生在前期《微機原理》《單片機》《DSP》等課程中已學(xué)習(xí)了匯編語言,大家知道,每一種處理器它所用的匯編語言是不同的,也就是說,對于《嵌入式系統(tǒng)》課程又要重新學(xué)習(xí)匯編語言,嵌入式有100條指令,實際應(yīng)用中又與條件碼一起用,因此嵌入式匯編語言相比前幾門課程難度更大。
(一)利用前期基礎(chǔ)來學(xué)習(xí)指令
前期基礎(chǔ)主要包括2個,一個是要把學(xué)生的英語調(diào)動起來,二是利用前期專業(yè)課程的指令。
1.利用英語單詞熟記條件碼
由于條件碼較多,學(xué)生經(jīng)?;煜?,當(dāng)與指令一起時更不知什么意思了。因此,在教學(xué)中經(jīng)常引導(dǎo)學(xué)生用英語單詞的方法來記條件碼。如EQ和NE條件碼,在教學(xué)中會問學(xué)生“相等,等于”的英語怎么譯,即“equal”,那么EQ就是“equal”的縮寫,即是“相等,等于”條件的判定,對應(yīng)著程序狀態(tài)寄存器CPSR中的“Z=1”的標(biāo)志。同理,NE就是“not equal”,不相等,不等于條件的判定,對應(yīng)著 “Z=1”的標(biāo)志。
2.利用英語詞匯熟記指令
指令與條件碼有些近似,大部分都是某些詞匯的縮寫。把握住此規(guī)律,指令的掌握也就沒那么難了。如ARM中用的比較多的存儲器和寄存器之間傳送數(shù)據(jù)的LDR和STR指令。LDR是“Load Register”的縮寫,即加載寄存器,將某存儲器單元中的內(nèi)容裝載到某寄存器中去。STR是“Store Register”的縮寫,即存儲寄存器,將某寄存器中的內(nèi)容存儲到某存儲器單元中去。通過實際教學(xué)發(fā)現(xiàn),把握此規(guī)律的學(xué)生指令明顯掌握的較為牢靠。endprint
3.把前期課程學(xué)習(xí)的匯編指令搬出來
雖然嵌入式系統(tǒng)和前期課程學(xué)習(xí)的匯編指令不太相同,但有一部分指令是相通的。
如“MOV”傳送指令,算術(shù)運算中的加、減“ADD、SUB”,邏輯運算中的與“AND”等功能基本相同,而且指令的書寫是完全相同的,但是參加運算的數(shù)據(jù)、寄存器等是不一樣的,它們基本對應(yīng)著32位字的狀態(tài)下的。
(二)從簡單入手,激發(fā)學(xué)生興趣
雖然跟學(xué)生說了多種熟記指令的方法,但是當(dāng)多條指令放在一起,即使是一段很簡單的程序代碼,學(xué)生依然很難理解讀出程序的功能。這時,就要充分利用實驗來加強鍛煉學(xué)生的程序讀寫能力。首先要讓學(xué)生多抄、多讀程序,然后在要求學(xué)生從簡單的程序設(shè)計開始。即從抄程序中學(xué)匯編,從簡單中寫匯編。那么能否一開始就能讀懂一些簡單的程序代碼,直接關(guān)系到學(xué)生對本門課程的興趣,因此,如何引導(dǎo)學(xué)生快速入門很關(guān)鍵,而ADS的多種調(diào)試功能可以為快速入門提供便捷之道。
例1:請讀出下面程序代碼的功能
本程序只有8行代碼,讓學(xué)生第一感覺就很簡單。但是本程序卻包含了很多信息。首先給學(xué)生逐行分析每條指令,分給出一些提示。
(1)匯編程序的基本格式,以AREA聲明某代碼段的開始,以END結(jié)束;
(2)第②行ENTRY是程序入口標(biāo)識,是所有匯編指令必須有的偽指令;
(3)第③行CODE聲明32為指令,因此建立工程時選擇第一項,如圖1所示;
(4)第④行START是程序段的標(biāo)號,書寫時必須頂格,否則是編譯不過去的,第四行和第五行的MOV指令在前期課程中已學(xué)過的;
(5)第六行中ADDS,ADD指令學(xué)生也已學(xué)過,加了S是帶有條件碼更新的意思,而此時和ADD功能是一樣的;
(6)第⑥行B是跳轉(zhuǎn)指令,即跳轉(zhuǎn)到標(biāo)號START處繼續(xù)運行。
然后讓學(xué)生建立工程和文件,并把該程序代碼輸入進去,進行編譯調(diào)試,先讓學(xué)生自己解決編譯調(diào)試的問題。學(xué)生主要會出現(xiàn)以下問題:
(1)編譯時出現(xiàn)錯誤很緊張,不知怎么辦,上來就叫老師;
(2)學(xué)生運行時結(jié)果一直不出來或者結(jié)果不一樣;
(3)具體功能不會表達。
可用以下方法來解決:
(1)對編譯錯誤的同學(xué)進行引導(dǎo),當(dāng)出現(xiàn)錯誤時,光標(biāo)會出現(xiàn)在源代碼的對應(yīng)行,到該行中去查看代碼找出錯誤。
(2)提問結(jié)果為什么不一樣,程序的運行過程是什么,關(guān)鍵是斷點的設(shè)置,即要在本程序的第7行設(shè)置斷點。本程序的運行是一個死循環(huán)。
(3)讓學(xué)生們以單步運行的方式,運行程序,同時打開寄存器組,查看對應(yīng)寄存器的值。
當(dāng)以單步運行時,學(xué)生可看到,R0=0x0000000F,R1=0x00000008,之后R0變?yōu)?x00000017,如圖5所示。
可以給學(xué)生一些提示,15+8=?這個答案對不對呢?0x是什么意思呢,是不是16進制數(shù)的表示,將0x00000017轉(zhuǎn)換為10進制是不是23,而15+8=23。因此結(jié)果是對的,此程序的功能就是計算15+8=?
如果采用斷點的方法,來全速運行該程序能否得到正確結(jié)果?這個斷點應(yīng)該設(shè)在哪里?讓學(xué)生自己思考嘗試。最后對于沒掌握調(diào)試方法,依然不明白程序的同學(xué)逐個給予解答。
三、結(jié)論
匯編語言本身零碎的東西特別多,對于學(xué)生提出的問題必須耐心及時的引導(dǎo),采用最簡單的方法讓學(xué)生快速掌握匯編指令以進行簡單程序的設(shè)計是嵌入式系統(tǒng)教學(xué)的基本要求。在本課程實踐教學(xué)中,通過多種方式的引導(dǎo),雖然學(xué)生在本課程中花的時間較少,對于簡單程序設(shè)計都感覺不難,對本門課程的興趣也很高。有一部分同學(xué)自己買了開發(fā)板,自己在寢室進行深入學(xué)習(xí),課堂上與大家一起探討在學(xué)習(xí)調(diào)試中遇到的問題。
參考文獻:
[1]何加銘.嵌入式32位微處理器系統(tǒng)設(shè)計與應(yīng)用[M].北京:電子工業(yè)出版社,2006.
[2]張義磊,丁濤,安吉宇.三星S3C2410在嵌入式工業(yè)控制系統(tǒng)中的應(yīng)用[J].長春理工大學(xué)學(xué)報,2004.
[3]魏洪興,胡亮,曲學(xué)樓.嵌入式系統(tǒng)設(shè)計與實例開發(fā)實驗教材Ⅱ——基于ARM9處理器與Lmux操作系統(tǒng)[M].北京:清華大學(xué)出版社,2005.
[4]劉全金,江建生.談《通信原理》課程的“口訣式”教學(xué)[J].安慶師范學(xué)院學(xué)報(自然科學(xué)版),2011,17(3):103-105.endprint
3.把前期課程學(xué)習(xí)的匯編指令搬出來
雖然嵌入式系統(tǒng)和前期課程學(xué)習(xí)的匯編指令不太相同,但有一部分指令是相通的。
如“MOV”傳送指令,算術(shù)運算中的加、減“ADD、SUB”,邏輯運算中的與“AND”等功能基本相同,而且指令的書寫是完全相同的,但是參加運算的數(shù)據(jù)、寄存器等是不一樣的,它們基本對應(yīng)著32位字的狀態(tài)下的。
(二)從簡單入手,激發(fā)學(xué)生興趣
雖然跟學(xué)生說了多種熟記指令的方法,但是當(dāng)多條指令放在一起,即使是一段很簡單的程序代碼,學(xué)生依然很難理解讀出程序的功能。這時,就要充分利用實驗來加強鍛煉學(xué)生的程序讀寫能力。首先要讓學(xué)生多抄、多讀程序,然后在要求學(xué)生從簡單的程序設(shè)計開始。即從抄程序中學(xué)匯編,從簡單中寫匯編。那么能否一開始就能讀懂一些簡單的程序代碼,直接關(guān)系到學(xué)生對本門課程的興趣,因此,如何引導(dǎo)學(xué)生快速入門很關(guān)鍵,而ADS的多種調(diào)試功能可以為快速入門提供便捷之道。
例1:請讀出下面程序代碼的功能
本程序只有8行代碼,讓學(xué)生第一感覺就很簡單。但是本程序卻包含了很多信息。首先給學(xué)生逐行分析每條指令,分給出一些提示。
(1)匯編程序的基本格式,以AREA聲明某代碼段的開始,以END結(jié)束;
(2)第②行ENTRY是程序入口標(biāo)識,是所有匯編指令必須有的偽指令;
(3)第③行CODE聲明32為指令,因此建立工程時選擇第一項,如圖1所示;
(4)第④行START是程序段的標(biāo)號,書寫時必須頂格,否則是編譯不過去的,第四行和第五行的MOV指令在前期課程中已學(xué)過的;
(5)第六行中ADDS,ADD指令學(xué)生也已學(xué)過,加了S是帶有條件碼更新的意思,而此時和ADD功能是一樣的;
(6)第⑥行B是跳轉(zhuǎn)指令,即跳轉(zhuǎn)到標(biāo)號START處繼續(xù)運行。
然后讓學(xué)生建立工程和文件,并把該程序代碼輸入進去,進行編譯調(diào)試,先讓學(xué)生自己解決編譯調(diào)試的問題。學(xué)生主要會出現(xiàn)以下問題:
(1)編譯時出現(xiàn)錯誤很緊張,不知怎么辦,上來就叫老師;
(2)學(xué)生運行時結(jié)果一直不出來或者結(jié)果不一樣;
(3)具體功能不會表達。
可用以下方法來解決:
(1)對編譯錯誤的同學(xué)進行引導(dǎo),當(dāng)出現(xiàn)錯誤時,光標(biāo)會出現(xiàn)在源代碼的對應(yīng)行,到該行中去查看代碼找出錯誤。
(2)提問結(jié)果為什么不一樣,程序的運行過程是什么,關(guān)鍵是斷點的設(shè)置,即要在本程序的第7行設(shè)置斷點。本程序的運行是一個死循環(huán)。
(3)讓學(xué)生們以單步運行的方式,運行程序,同時打開寄存器組,查看對應(yīng)寄存器的值。
當(dāng)以單步運行時,學(xué)生可看到,R0=0x0000000F,R1=0x00000008,之后R0變?yōu)?x00000017,如圖5所示。
可以給學(xué)生一些提示,15+8=?這個答案對不對呢?0x是什么意思呢,是不是16進制數(shù)的表示,將0x00000017轉(zhuǎn)換為10進制是不是23,而15+8=23。因此結(jié)果是對的,此程序的功能就是計算15+8=?
如果采用斷點的方法,來全速運行該程序能否得到正確結(jié)果?這個斷點應(yīng)該設(shè)在哪里?讓學(xué)生自己思考嘗試。最后對于沒掌握調(diào)試方法,依然不明白程序的同學(xué)逐個給予解答。
三、結(jié)論
匯編語言本身零碎的東西特別多,對于學(xué)生提出的問題必須耐心及時的引導(dǎo),采用最簡單的方法讓學(xué)生快速掌握匯編指令以進行簡單程序的設(shè)計是嵌入式系統(tǒng)教學(xué)的基本要求。在本課程實踐教學(xué)中,通過多種方式的引導(dǎo),雖然學(xué)生在本課程中花的時間較少,對于簡單程序設(shè)計都感覺不難,對本門課程的興趣也很高。有一部分同學(xué)自己買了開發(fā)板,自己在寢室進行深入學(xué)習(xí),課堂上與大家一起探討在學(xué)習(xí)調(diào)試中遇到的問題。
參考文獻:
[1]何加銘.嵌入式32位微處理器系統(tǒng)設(shè)計與應(yīng)用[M].北京:電子工業(yè)出版社,2006.
[2]張義磊,丁濤,安吉宇.三星S3C2410在嵌入式工業(yè)控制系統(tǒng)中的應(yīng)用[J].長春理工大學(xué)學(xué)報,2004.
[3]魏洪興,胡亮,曲學(xué)樓.嵌入式系統(tǒng)設(shè)計與實例開發(fā)實驗教材Ⅱ——基于ARM9處理器與Lmux操作系統(tǒng)[M].北京:清華大學(xué)出版社,2005.
[4]劉全金,江建生.談《通信原理》課程的“口訣式”教學(xué)[J].安慶師范學(xué)院學(xué)報(自然科學(xué)版),2011,17(3):103-105.endprint
3.把前期課程學(xué)習(xí)的匯編指令搬出來
雖然嵌入式系統(tǒng)和前期課程學(xué)習(xí)的匯編指令不太相同,但有一部分指令是相通的。
如“MOV”傳送指令,算術(shù)運算中的加、減“ADD、SUB”,邏輯運算中的與“AND”等功能基本相同,而且指令的書寫是完全相同的,但是參加運算的數(shù)據(jù)、寄存器等是不一樣的,它們基本對應(yīng)著32位字的狀態(tài)下的。
(二)從簡單入手,激發(fā)學(xué)生興趣
雖然跟學(xué)生說了多種熟記指令的方法,但是當(dāng)多條指令放在一起,即使是一段很簡單的程序代碼,學(xué)生依然很難理解讀出程序的功能。這時,就要充分利用實驗來加強鍛煉學(xué)生的程序讀寫能力。首先要讓學(xué)生多抄、多讀程序,然后在要求學(xué)生從簡單的程序設(shè)計開始。即從抄程序中學(xué)匯編,從簡單中寫匯編。那么能否一開始就能讀懂一些簡單的程序代碼,直接關(guān)系到學(xué)生對本門課程的興趣,因此,如何引導(dǎo)學(xué)生快速入門很關(guān)鍵,而ADS的多種調(diào)試功能可以為快速入門提供便捷之道。
例1:請讀出下面程序代碼的功能
本程序只有8行代碼,讓學(xué)生第一感覺就很簡單。但是本程序卻包含了很多信息。首先給學(xué)生逐行分析每條指令,分給出一些提示。
(1)匯編程序的基本格式,以AREA聲明某代碼段的開始,以END結(jié)束;
(2)第②行ENTRY是程序入口標(biāo)識,是所有匯編指令必須有的偽指令;
(3)第③行CODE聲明32為指令,因此建立工程時選擇第一項,如圖1所示;
(4)第④行START是程序段的標(biāo)號,書寫時必須頂格,否則是編譯不過去的,第四行和第五行的MOV指令在前期課程中已學(xué)過的;
(5)第六行中ADDS,ADD指令學(xué)生也已學(xué)過,加了S是帶有條件碼更新的意思,而此時和ADD功能是一樣的;
(6)第⑥行B是跳轉(zhuǎn)指令,即跳轉(zhuǎn)到標(biāo)號START處繼續(xù)運行。
然后讓學(xué)生建立工程和文件,并把該程序代碼輸入進去,進行編譯調(diào)試,先讓學(xué)生自己解決編譯調(diào)試的問題。學(xué)生主要會出現(xiàn)以下問題:
(1)編譯時出現(xiàn)錯誤很緊張,不知怎么辦,上來就叫老師;
(2)學(xué)生運行時結(jié)果一直不出來或者結(jié)果不一樣;
(3)具體功能不會表達。
可用以下方法來解決:
(1)對編譯錯誤的同學(xué)進行引導(dǎo),當(dāng)出現(xiàn)錯誤時,光標(biāo)會出現(xiàn)在源代碼的對應(yīng)行,到該行中去查看代碼找出錯誤。
(2)提問結(jié)果為什么不一樣,程序的運行過程是什么,關(guān)鍵是斷點的設(shè)置,即要在本程序的第7行設(shè)置斷點。本程序的運行是一個死循環(huán)。
(3)讓學(xué)生們以單步運行的方式,運行程序,同時打開寄存器組,查看對應(yīng)寄存器的值。
當(dāng)以單步運行時,學(xué)生可看到,R0=0x0000000F,R1=0x00000008,之后R0變?yōu)?x00000017,如圖5所示。
可以給學(xué)生一些提示,15+8=?這個答案對不對呢?0x是什么意思呢,是不是16進制數(shù)的表示,將0x00000017轉(zhuǎn)換為10進制是不是23,而15+8=23。因此結(jié)果是對的,此程序的功能就是計算15+8=?
如果采用斷點的方法,來全速運行該程序能否得到正確結(jié)果?這個斷點應(yīng)該設(shè)在哪里?讓學(xué)生自己思考嘗試。最后對于沒掌握調(diào)試方法,依然不明白程序的同學(xué)逐個給予解答。
三、結(jié)論
匯編語言本身零碎的東西特別多,對于學(xué)生提出的問題必須耐心及時的引導(dǎo),采用最簡單的方法讓學(xué)生快速掌握匯編指令以進行簡單程序的設(shè)計是嵌入式系統(tǒng)教學(xué)的基本要求。在本課程實踐教學(xué)中,通過多種方式的引導(dǎo),雖然學(xué)生在本課程中花的時間較少,對于簡單程序設(shè)計都感覺不難,對本門課程的興趣也很高。有一部分同學(xué)自己買了開發(fā)板,自己在寢室進行深入學(xué)習(xí),課堂上與大家一起探討在學(xué)習(xí)調(diào)試中遇到的問題。
參考文獻:
[1]何加銘.嵌入式32位微處理器系統(tǒng)設(shè)計與應(yīng)用[M].北京:電子工業(yè)出版社,2006.
[2]張義磊,丁濤,安吉宇.三星S3C2410在嵌入式工業(yè)控制系統(tǒng)中的應(yīng)用[J].長春理工大學(xué)學(xué)報,2004.
[3]魏洪興,胡亮,曲學(xué)樓.嵌入式系統(tǒng)設(shè)計與實例開發(fā)實驗教材Ⅱ——基于ARM9處理器與Lmux操作系統(tǒng)[M].北京:清華大學(xué)出版社,2005.
[4]劉全金,江建生.談《通信原理》課程的“口訣式”教學(xué)[J].安慶師范學(xué)院學(xué)報(自然科學(xué)版),2011,17(3):103-105.endprint