《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > 嵌入式自開發(fā)軟件的設(shè)計與實現(xiàn)

嵌入式自開發(fā)軟件的設(shè)計與實現(xiàn)

2008-05-16
作者:余曉建1,沈永林1,郭 超2

  摘 要: 在基于SH7709S處理器的系統(tǒng)上實現(xiàn)了自開發(fā)軟件,介紹了自開發(fā)軟件的原理、方法、組成與結(jié)構(gòu),分析了與上位機" title="上位機">上位機通信接口設(shè)計、在系統(tǒng)燒寫" title="燒寫">燒寫Flash及設(shè)置斷點等關(guān)鍵技術(shù)。
  關(guān)鍵詞: 自開發(fā) 串口" title="串口">串口 ISP 斷點 人機界面 SH7709S處理器


  嵌入式自開發(fā)軟件有兩大特點。一是嵌入,指嵌入在系統(tǒng)內(nèi)部,占用系統(tǒng)一定的RAM和ROM資源;二是自開發(fā)功能,自身具備調(diào)試和開發(fā)功能。自開發(fā)軟件也被稱為監(jiān)控程序(monitor program)。實現(xiàn)自開發(fā)軟件是一種廉價的仿真器替代方案,它讓用戶更加深入地理解處理器和底層硬件的工作實質(zhì)。更為重要的是,它嵌入于應(yīng)用系統(tǒng)內(nèi)部,提供完全在線式的調(diào)試功能。
  自開發(fā)軟件的配置如圖1所示。上位機完成程序的編輯、編譯和鏈接,由自開發(fā)軟件通過與上位機的通信接口把程序下載到應(yīng)用系統(tǒng)中,并提供基本的調(diào)試手段。自開發(fā)軟件在功能上可以劃分為上位機通信接口、內(nèi)存操作、寄存器操作、下載及執(zhí)行用戶程序和斷點調(diào)試幾大部分。


1 與上位機通信接口設(shè)計
  (1)底層設(shè)計
  系統(tǒng)狀況和用戶命令都要通過與上位機的通信接口互相交換,一般用串行通信接口實現(xiàn)。通常使用最簡單的硬件連接和通信協(xié)議:只使用發(fā)送(TXD)、接收(RXD)和地這三根線,不使用其他握手信號線。PC端可以使用通用的串口通信軟件,如超級終端、串口助手;應(yīng)用系統(tǒng)端的通信軟件需要自行編寫。
  串口接收數(shù)據(jù)時,當數(shù)據(jù)量很大、通信速度很快時,如果處理數(shù)據(jù)包的時間過長,則無論使用查詢或中斷方式,都有可能出現(xiàn)接收緩沖寄存器溢出,造成數(shù)據(jù)丟失。較好的解決方法是以中斷方式接收,在內(nèi)存中開辟一個環(huán)形隊列緩沖區(qū),把程序分成兩部分實現(xiàn)。
  如圖2所示,當接收數(shù)據(jù)中斷時,由中斷服務(wù)程序" title="中斷服務(wù)程序">中斷服務(wù)程序迅速地把數(shù)據(jù)放置到緩沖區(qū)內(nèi),再重新使接收中斷使能,準備接收下一個數(shù)據(jù),而主程序則通過查詢緩沖區(qū)是否為空從中讀取讀據(jù)。這樣做可以盡可能地減少關(guān)閉接收中斷的時間,防止數(shù)據(jù)丟失。緩沖區(qū)的大小與通信速度和處理器的處理速度有關(guān)。通信速度越快,處理速度越慢,緩沖區(qū)應(yīng)開辟得越大。反之亦然。在SH7709S系統(tǒng)中,傳輸速率為38 400bps,處理器運行在64MHz時鐘下,緩沖區(qū)設(shè)置為64B。


  發(fā)送也可以使用中斷加發(fā)送緩沖區(qū)的方式,主程序向緩沖區(qū)寫入數(shù)據(jù)的同時打開發(fā)送中斷,發(fā)送中斷服務(wù)程序從緩沖區(qū)取得數(shù)據(jù)并發(fā)送,如果緩沖區(qū)非空,則保持發(fā)送中斷使能。但發(fā)送的情況和接收很不一樣,發(fā)送時可以主動控制發(fā)送字節(jié)的時機,在高傳輸速率下發(fā)送每一個字符的時間比較短。例如,在38 400bps的傳輸速率下,傳輸一個字符的時間大約26μs。
  (2)實現(xiàn)printf()函數(shù)
  為了便于后續(xù)程序的設(shè)計,應(yīng)該實現(xiàn)自己的格式化輸出函數(shù)printf(),包含字符串輸出、字符輸出、十進制數(shù)輸出和十六進制數(shù)輸出功能。輸出十六進制數(shù)時,要有8位、4位和2位寬度方式,如果數(shù)據(jù)的寬度不夠,則在前面補0,使得數(shù)據(jù)對齊,以便于用戶觀察。printf函數(shù)的實現(xiàn)思路是,把所有數(shù)據(jù)按不同的格式先轉(zhuǎn)換成對應(yīng)的ASCII碼,然后將其串成一個有結(jié)束符的字符串,再統(tǒng)一按照字符串輸出。要注意一點:當輸出回車符\n時,要同時輸出一個換行符\r,以符合C語言中的編程習(xí)慣。
2 下載程序及在系統(tǒng)Flash燒寫技術(shù)
  (1)S文件格式
  上位機完成編譯、鏈接,生成程序文件后,首先要通過串口把程序裝載到系統(tǒng)中,自開發(fā)軟件必須能夠識別主機傳送來ASCII碼的含義,即向哪個地址裝載、是否結(jié)束、有無誤碼,這就需要有一個通信協(xié)議。這里以SH7709S使用S格式文件為例說明。它是行結(jié)構(gòu)的ASCII碼文件,包含了所需要的協(xié)議,主要有起始記錄(S0)、正文記錄(S1、S2、S3)和結(jié)束記錄(S7、S8、S9)三種。三種記錄如下:
  S00E00004D6F6E56657232206D6F74F8
  S113000000090009000900090009DF0B0002D10BF7
  S9030000FC
  圖3是S1類型的記錄格式,以S1開頭;接下來是一個記錄長度的字節(jié),長度從該字節(jié)后面開始算起,一直到該行結(jié)尾;再下來是程序的裝載地址,S1、S2和S3的裝載地址長度分別是2B、3B、4B,裝載程序的地址范圍分別是0~64KB、64KB~16MB和16MB~4GB;裝載地址后面是ASCII碼表示的十六進制機器碼,最后一個字節(jié)是校驗碼,等于該記錄中的所有內(nèi)容之和的反碼。S格式文件一般以S0記錄開始,S0與S1記錄類似,所不同的是機器碼部分是S格式文件的文件名。S7、S8和S9也與S1記錄類似,但沒有機器碼部分,裝載地址表示程序的起始地址,分別為3B、2B、1B。


  通過串口,可以把程序下載到RAM或Flash中。RAM的讀寫速度較快,可以邊從串口下載邊裝載;Flash的操作相對較復(fù)雜,在寫入Flash時,一般是先把程序全部下載到RAM中,再集中燒寫。
  (2)在系統(tǒng)Flash燒寫技術(shù)
  Flash存儲器由于容量大、價格低、編程方便等優(yōu)勢在嵌入式系統(tǒng)中得到了廣泛應(yīng)用。出于價格、體積等方面的考慮,多數(shù)系統(tǒng)只配備單片普通的NAND Flash。由于同一片F(xiàn)lash在寫操作時一般不能讀,因而很多采用Flash作為程序存儲器的系統(tǒng)無法直接實現(xiàn)在系統(tǒng)燒寫(ISP)。通過編寫程序?qū)崿F(xiàn)在線燒寫Flash,達到“程序燒寫程序”目的,這簡化了電路設(shè)計,降低了開發(fā)成本,是目前常用的開發(fā)模式。它把燒寫Flash的程序與其他程序分開,使用時把它拷貝到RAM中執(zhí)行。由于大多數(shù)嵌入式系統(tǒng)只能執(zhí)行非可重定位的程序,即只能在鏈接時指定的地址執(zhí)行程序,所以這種方法遇到的最大難點就是程序的存儲地址和執(zhí)行地址不一致。這里給出一種非常有效且通行的解決方法。首先,編寫?yīng)毩⒌臒龑慒lash程序,使這部分程序不能調(diào)用其他程序,避免在寫Flash的同時讀取Flash;然后把這部分程序編譯,并鏈接到RAM中的指定地址,生成程序文件(如前文中提到的S格式文件);最后用一個在用戶主機上運行的小程序把程序文件轉(zhuǎn)換成C語言格式的數(shù)組,再在主程序中拷貝或調(diào)用。數(shù)組定義如下:
  struct rom_data {
  unsigned long start_address;
  unsigned long data_length;
  unsigned char data[4708];
  };
  start address是程序在RAM中執(zhí)行的入口地址,data length是機器碼的字節(jié)數(shù),在data中存儲程序的機器碼。以一個轉(zhuǎn)換后的數(shù)組為例:
  const struct rom_data datastruct={
  0x0dff0000,
  0x0000084b,
  0x2f,0x86,0x2f,0x96,0x2f,0xa6,0x2f,0xb6,0x2f,0xc6,
  0x2f,0xd6,0x2f,0xe6,0x4f,0x22,
  ……
  };
  程序從地址0xdff0000開始執(zhí)行,由0x84b個字節(jié)組成。燒寫Flash時,由自開發(fā)軟件把這部分程序搬運到RAM中的對應(yīng)地址,再跳轉(zhuǎn)到該地址開始執(zhí)行。只要了解程序文件的結(jié)構(gòu),程序文件到數(shù)組的轉(zhuǎn)換將很容易實現(xiàn)。Renesas公司提供了S文件格式的程序文件到數(shù)組轉(zhuǎn)換工具motice_cl,把它設(shè)定為IDE的最后一個編譯階段即可方便地生成數(shù)組。
3 實現(xiàn)斷點
  在程序中設(shè)置斷點是調(diào)試程序的有效方法。通常,斷點只能在RAM中實現(xiàn)。SH7709S由于內(nèi)嵌有UBC(用戶斷點控制器)單元,所以也可以在ROM中設(shè)置斷點。
  (1)在RAM中設(shè)置斷點
  RAM中設(shè)置斷點的思路是:在斷點處用一條軟中斷指令替換原有指令,當軟中斷發(fā)生時,將所有寄存器的值推入堆棧中。只要在軟中斷的服務(wù)程序顯示棧中對應(yīng)CPU有關(guān)寄存器的內(nèi)容,回到主程序,并允許修改寄存器和內(nèi)存,就實現(xiàn)了在RAM中設(shè)置斷點。
  用戶設(shè)置完斷點后,在自開發(fā)軟件中不要直接替換對應(yīng)地址的指令,否則觀察寄存器或反匯編" title="反匯編">反匯編時,這段程序就被改變了。應(yīng)該在用戶輸入運行程序命令后再去替代指令,在軟中斷服務(wù)程序返回前,還要遍歷每個斷點,將已經(jīng)替換后的指令恢復(fù),使用戶看不到被替換過的痕跡。
  (2)使用UBC單元設(shè)置斷點
  SH7709S內(nèi)置兩個UBC單元,以方便在ROM或RAM設(shè)置斷點,協(xié)助用戶實現(xiàn)自調(diào)試功能。它實際上是一個比較中斷發(fā)生器,在程序運行時,斷點寄存器中的地址不停地與程序計數(shù)器PC比較,中斷發(fā)生的條件可以是地址相同,也可以是某一數(shù)據(jù)的讀或?qū)懙取0l(fā)生中斷后在中斷服務(wù)程序中顯示寄存器,同時把這個斷點清除,屏蔽UBC中斷,并返回到主程序,從而實現(xiàn)斷點功能。
  實現(xiàn)斷點功能后就可以輕松地實現(xiàn)單步調(diào)試功能,實際上是在下一條指令前設(shè)置斷點。
4 編輯寄存器或內(nèi)存
  (1)編輯寄存器
  編輯寄存器包括讀、寫和清零操作。讀寄存器并不需要每次都顯示當前寄存器的真實值(因為系統(tǒng)被自開發(fā)軟件控制時,這種顯示對用戶并無意義),而只需在用戶程序被打斷后顯示打斷前的真實寄存器值;寫和清零操作也不需要在用戶改變寄存器后立即改變CPU的寄存器,否則自開發(fā)軟件無法正常運行,而只需在用戶程序執(zhí)行前改變。自開發(fā)軟件應(yīng)該在內(nèi)存中建立一個CPU寄存器的映像,用戶對寄存器的操作實際上是操作內(nèi)存中的映像單元。發(fā)生斷點中斷后,在中斷服務(wù)程序里把入棧的中斷前寄存器值寫入到對應(yīng)的內(nèi)存映像單元,在用戶輸入運行程序命令后,先把內(nèi)存映像單元的值寫入到CPU的寄存器中再運行程序。
  (2)編輯內(nèi)存
  編輯內(nèi)存包括顯示、修改和反匯編操作。一般按單字節(jié)使用十六進制顯示內(nèi)存的內(nèi)容,每一行顯示16個內(nèi)存單元,左邊要有該段內(nèi)存的起始地址,在最右邊,將這些數(shù)據(jù)對應(yīng)的ASCII碼顯示出來,數(shù)值小于0x20的ASCII碼控制字符及大于0x7F的非ASCII碼字符用“.”表示,如圖4所示。
  修改內(nèi)存應(yīng)提供按逐個內(nèi)存單元和按塊填充功能。對于總線寬度為32位的系統(tǒng),內(nèi)存單元可以是字節(jié)、雙字和長字,修改過一個單元后,提示符應(yīng)指向下一個單元,最好能設(shè)置一個鍵碼,當發(fā)現(xiàn)輸入值不當時,可以回退一個單元,如果輸入字符不是0~F,則自動退出,此單元無須修改時按回車繼續(xù)下一單元。填充內(nèi)存是把一塊內(nèi)存單元修改為同一個值,在觀察內(nèi)存變化時很有用。


  反匯編是將內(nèi)存的內(nèi)容以指令形式顯示出來。在RISC和CISC機上實現(xiàn)反匯編的難度不同,RISC架構(gòu)的處理器指令是定長的,如SH7709S每條指令占用兩個字節(jié),而CISC架構(gòu)的處理器上指令占用的字節(jié)數(shù)從一個到四個不等,讀取時還要判斷是否讀到了正確的指令。反匯編功能需占用較多的存儲空間,因為它要建立一個對應(yīng)關(guān)系,在內(nèi)存中存儲一個指令表。一般情況下,指令的設(shè)計都有一定規(guī)律,設(shè)計時要仔細觀察,SH7709S的指令集可以分為n、nm和md等類型,找出規(guī)律可大大簡化程序設(shè)計。
5 人機對話界面設(shè)計
  用戶主機上的串口通信軟件,如Hypertrm,只顯示接收的字符。為了在用戶輸入命令的同時把命令字符顯示到屏幕上,自開發(fā)軟件需要把接收到的字符再發(fā)送一遍。有些特殊字符要特別處理,如用戶鍵入backspace后,軟件應(yīng)發(fā)送退格、空格、退格三個字符才能得到backspace鍵效果。
  圖5是實現(xiàn)人機界面的流程圖,當用戶輸入回車符后,認為一個命令輸入完畢。命令中可能會含有一些多余的空格,要先把這些空格剔除并整定成要求的格式。有些命令需要經(jīng)常執(zhí)行,如單步、查看內(nèi)容等。把這些命令設(shè)定為需要標記的命令,輸入一次后,再輸入回車即可重復(fù)執(zhí)行。


  自開發(fā)軟件可以大大方便調(diào)試和開發(fā),它提供了所有基本的調(diào)試手段,嵌入于應(yīng)用系統(tǒng)內(nèi)部,攜帶方便,十分靈活,是仿真器的有益補充,甚至可以在一定程度上替代昂貴的仿真器。
  筆者在基于SH7709S處理器的系統(tǒng)上成功地實現(xiàn)了自開發(fā)軟件,在此基礎(chǔ)上闡述了自開發(fā)軟件的原理和方法,介紹了自開發(fā)軟件的組成與結(jié)構(gòu),詳細分析了與上位機通信接口設(shè)計、在系統(tǒng)燒寫Flash和設(shè)置斷點等關(guān)鍵技術(shù)。這些內(nèi)容也適用于基于不同處理器或單片機的應(yīng)用及開發(fā)系統(tǒng)。
參考文獻
1 邵貝貝.單片機嵌入式應(yīng)用的在線開發(fā)方法.北京:清華大學(xué)出版社,2004
2 Renesas Co,Ltd.SH7709s hardware manual.2003,9
3 Renesas Co,Ltd.SuperH RISC engine C/C++ Compiler,Assembler,Optimizing Linkage Editor User′s Manual.2003
4 Hitachi Europe LTD.Utility To Convert S-Record DataTo A C Structure.2003

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。