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