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

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

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

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


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


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


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


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


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


  自開發(fā)軟件可以大大方便調(diào)試和開發(fā),,它提供了所有基本的調(diào)試手段,,嵌入于應(yīng)用系統(tǒng)內(nèi)部,攜帶方便,,十分靈活,,是仿真器的有益補(bǔ)充,甚至可以在一定程度上替代昂貴的仿真器,。
  筆者在基于SH7709S處理器的系統(tǒng)上成功地實(shí)現(xiàn)了自開發(fā)軟件,,在此基礎(chǔ)上闡述了自開發(fā)軟件的原理和方法,介紹了自開發(fā)軟件的組成與結(jié)構(gòu),,詳細(xì)分析了與上位機(jī)通信接口設(shè)計(jì),、在系統(tǒng)燒寫Flash和設(shè)置斷點(diǎn)等關(guān)鍵技術(shù)。這些內(nèi)容也適用于基于不同處理器或單片機(jī)的應(yīng)用及開發(fā)系統(tǒng),。
參考文獻(xiàn)
1 邵貝貝.單片機(jī)嵌入式應(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)站贊同其觀點(diǎn),。轉(zhuǎn)載的所有的文章,、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,,以便迅速采取適當(dāng)措施,,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118,;郵箱:[email protected],。