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

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

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

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


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


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


  發(fā)送也可以使用中斷加發(fā)送緩沖區(qū)的方式,主程序向緩沖區(qū)寫(xiě)入數(shù)據(jù)的同時(shí)打開(kāi)發(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)輸出回車(chē)符\n時(shí),要同時(shí)輸出一個(gè)換行符\r,以符合C語(yǔ)言中的編程習(xí)慣。
2 下載程序及在系統(tǒng)Flash燒寫(xiě)技術(shù)
  (1)S文件格式
  上位機(jī)完成編譯、鏈接,生成程序文件后,首先要通過(guò)串口把程序裝載到系統(tǒng)中,自開(kāi)發(fā)軟件必須能夠識(shí)別主機(jī)傳送來(lái)ASCII碼的含義,即向哪個(gè)地址裝載、是否結(jié)束、有無(wú)誤碼,這就需要有一個(gè)通信協(xié)議。這里以SH7709S使用S格式文件為例說(shuō)明。它是行結(jié)構(gòu)的ASCII碼文件,包含了所需要的協(xié)議,主要有起始記錄(S0)、正文記錄(S1、S2、S3)和結(jié)束記錄(S7、S8、S9)三種。三種記錄如下:
  S00E00004D6F6E56657232206D6F74F8
  S113000000090009000900090009DF0B0002D10BF7
  S9030000FC
  圖3是S1類(lèi)型的記錄格式,以S1開(kāi)頭;接下來(lái)是一個(gè)記錄長(zhǎng)度的字節(jié),長(zhǎng)度從該字節(jié)后面開(kāi)始算起,一直到該行結(jié)尾;再下來(lái)是程序的裝載地址,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記錄開(kāi)始,S0與S1記錄類(lèi)似,所不同的是機(jī)器碼部分是S格式文件的文件名。S7、S8和S9也與S1記錄類(lèi)似,但沒(méi)有機(jī)器碼部分,裝載地址表示程序的起始地址,分別為3B、2B、1B。


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


  反匯編是將內(nèi)存的內(nèi)容以指令形式顯示出來(lá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等類(lèi)型,找出規(guī)律可大大簡(jiǎn)化程序設(shè)計(jì)。
5 人機(jī)對(duì)話界面設(shè)計(jì)
  用戶主機(jī)上的串口通信軟件,如Hypertrm,只顯示接收的字符。為了在用戶輸入命令的同時(shí)把命令字符顯示到屏幕上,自開(kāi)發(fā)軟件需要把接收到的字符再發(fā)送一遍。有些特殊字符要特別處理,如用戶鍵入backspace后,軟件應(yīng)發(fā)送退格、空格、退格三個(gè)字符才能得到backspace鍵效果。
  圖5是實(shí)現(xiàn)人機(jī)界面的流程圖,當(dāng)用戶輸入回車(chē)符后,認(rèn)為一個(gè)命令輸入完畢。命令中可能會(huì)含有一些多余的空格,要先把這些空格剔除并整定成要求的格式。有些命令需要經(jīng)常執(zhí)行,如單步、查看內(nèi)容等。把這些命令設(shè)定為需要標(biāo)記的命令,輸入一次后,再輸入回車(chē)即可重復(fù)執(zhí)行。


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