當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘要:提出在目標(biāo)系統(tǒng)脫離開(kāi)發(fā)系統(tǒng)運(yùn)行時(shí),如何通過(guò)串口在Windows的超級(jí)終端軟件中顯示調(diào)試信息的一個(gè)具體方法。該方法有助于改進(jìn)調(diào)試質(zhì)量、縮短調(diào)試周期。關(guān)鍵詞:脫機(jī)調(diào)試

摘要:提出在目標(biāo)系統(tǒng)脫離開(kāi)發(fā)系統(tǒng)運(yùn)行時(shí),如何通過(guò)串口在Windows的超級(jí)終端軟件中顯示調(diào)試信息的一個(gè)具體方法。該方法有助于改進(jìn)調(diào)試質(zhì)量、縮短調(diào)試周期。

關(guān)鍵詞:脫機(jī)調(diào)試 超級(jí)終端 可變參數(shù)函數(shù) 輸出函數(shù)

1 ROM版本目標(biāo)系統(tǒng)的調(diào)試問(wèn)題

一般的目標(biāo)系統(tǒng)在開(kāi)發(fā)工具環(huán)境下的調(diào)試并不困難,但最終系統(tǒng)必須脫離開(kāi)發(fā)工具獨(dú)立運(yùn)行,即使在開(kāi)發(fā)工具環(huán)境下完全正常的系統(tǒng),ROM版本也往往會(huì)出現(xiàn)各種問(wèn)題。原因有兩人:一是開(kāi)發(fā)工具硬件環(huán)境和最終的目標(biāo)硬件環(huán)境不完全相同;二是外部因素不同,實(shí)驗(yàn)室中無(wú)法模擬現(xiàn)場(chǎng)的很多外部條件。因此,在脫離開(kāi)發(fā)工具后的現(xiàn)場(chǎng)運(yùn)行中,也能進(jìn)行調(diào)試,這在產(chǎn)品開(kāi)發(fā)的初期是十分重要的。對(duì)于硬件的調(diào)試,可以使用示波器等儀器;對(duì)于軟件的調(diào)試,一般方法則是顯示軟件運(yùn)行中的各種信息(如變量)。

 

我們知道,C語(yǔ)言中的“printf()”函數(shù)是學(xué)習(xí)C語(yǔ)言的人最了解和熟悉的一個(gè)函數(shù)。很多C語(yǔ)言教材一開(kāi)始就以顯示“hello word”字符串來(lái)描述C語(yǔ)言的基本特片,其中唯一的語(yǔ)句就是調(diào)用“printf ()”函數(shù)。雖然該函數(shù)可以在屏幕上輸出信息,但一般的用戶(hù)軟件中只在調(diào)試時(shí)用它來(lái)顯示某些中間變量的結(jié)果,一旦程序調(diào)試完成,就將其刪除了,真正的應(yīng)用信息(如菜單字符等)顯示往往其他的輸出函數(shù),如puts(),cputs()等。實(shí)際上,在C語(yǔ)言編寫(xiě)的第一個(gè)軟件-UNIX操作系統(tǒng)中,該函數(shù)也是用于輸出調(diào)試信息或系統(tǒng)錯(cuò)誤提示信息的。對(duì)于使用和學(xué)習(xí)C語(yǔ)言的程序員來(lái)說(shuō),printf()由于可以同時(shí)輸出不同類(lèi)型的數(shù)據(jù),因此,它的使用是軟件調(diào)試的重要手段之一。

在TURBO C2.0編譯器中,printf()函數(shù)的實(shí)現(xiàn)依賴(lài)于操作系統(tǒng)。在嵌入式系統(tǒng)中,往往沒(méi)有操作系統(tǒng)或者操作系統(tǒng)不提供這個(gè)功能,也可能沒(méi)有顯示輸出部件,或顯示設(shè)備的空間有限,只能用于顯示應(yīng)用信息。因此,必須用其他的方法來(lái)解決調(diào)試信息的輸出問(wèn)題。最常用的方法是通過(guò)目標(biāo)系統(tǒng)的一個(gè)串口將信息發(fā)送給PC 機(jī)來(lái)顯示,PC機(jī)上可以使用Windows的“超級(jí)終端”軟件接受和顯示信息,如圖1所示。

這種系統(tǒng)的硬件很簡(jiǎn)單,我們只說(shuō)明軟件的實(shí)現(xiàn)方法。為此,我們必須設(shè)計(jì)專(zhuān)用的、可以顯示各種數(shù)據(jù)類(lèi)型的printf()函數(shù),以達(dá)到從串口或其他途徑輸出信息的目的。在一些C開(kāi)發(fā)工具(如C51)中,系統(tǒng)提供了printf()庫(kù)函數(shù),但沒(méi)有提供源代碼[1],LINUX和UNIX的源代碼中雖然也包含printf()的函數(shù)源代碼,但過(guò)于復(fù)雜[2,3]。和一般的C函數(shù)不同,printf()函數(shù)的參數(shù)數(shù)量和類(lèi)型是可變的,這是編寫(xiě)該函數(shù)的難點(diǎn)。要解決這個(gè)難是,必須先了解C函數(shù)參數(shù)傳遞的原理。

2 C函數(shù)的參數(shù)傳遞原理

在大部分情況下,C語(yǔ)言是通過(guò)堆棧存儲(chǔ)器來(lái)傳遞參數(shù)(也有例外,C51的小模式則通過(guò)寄存器傳遞參數(shù))。對(duì)于非指針類(lèi)型,傳遞的不是原來(lái)類(lèi)型的數(shù)據(jù),而是對(duì)參數(shù)進(jìn)行了類(lèi)型轉(zhuǎn)換,如字符類(lèi)型(char)變成整型(int)拷貝到堆棧中、浮點(diǎn)類(lèi)型(float)變成雙精度類(lèi)型(double),如表1所列。表1中未列出的,則沒(méi)有轉(zhuǎn)換[4]。

表1

對(duì)于像字符數(shù)組之類(lèi)的指針參數(shù),是將指針拷貝到堆棧中,而不是將數(shù)組中的所有內(nèi)容傳送到堆棧中。比如,對(duì)函數(shù)fun(char *str,int i,float &a)的調(diào)用:

char str[10]=“welcome”;

int i=100; float a=1.14;

……

fun(str,i,&a);

各個(gè)參烽str,i在堆棧中按先右后左的次序存放,表2所列為調(diào)用函數(shù)fun( )開(kāi)始時(shí)堆棧中的參數(shù)存放情況。此時(shí)函數(shù)fun()的代碼上尚未執(zhí)行,函數(shù)中的局部變量也是在堆棧中,所以在函數(shù)執(zhí)行結(jié)束后,局部變量將消失。

表2 函數(shù)調(diào)用時(shí)的參數(shù)在堆棧中的存儲(chǔ)情況(X86環(huán)境)

表2說(shuō)明了兩個(gè)問(wèn)題:第一個(gè)問(wèn)題是,每個(gè)參數(shù)在堆棧中的存儲(chǔ)長(zhǎng)度和參數(shù)的類(lèi)型有關(guān)。對(duì)于指針類(lèi)型參數(shù),參數(shù)長(zhǎng)度和編譯模式有關(guān):大模式下,地址包括段地址和偏移地址,共4字節(jié);而小模式下,地址只有段內(nèi)偏移,占2字節(jié)。第二個(gè)問(wèn)題是,如果知道其中的一個(gè)參數(shù)地址和參數(shù)的類(lèi)型,則可以得到任意參數(shù)的數(shù)值,并不需要知道參數(shù)的名稱(chēng)。比如在函數(shù)fun()中,可用以下代碼顯示各個(gè)參數(shù)的內(nèi)容:

void fun(char *str,int i,float *a)

{

void *p

p=&str;

printf("str=%s",str); p=(char **)p+1;

printf("i=%d" ((int*)p));p=(int *)p+1;

printf("i=%d" *((float *)p));

}

上面語(yǔ)句定義了一個(gè)無(wú)法型指針p來(lái)指向堆棧地址,這樣,就可以得到堆棧中的各個(gè)參數(shù)。p被初始化為指向第一個(gè)參數(shù)str。因?yàn)閟tr也是一個(gè)指針,所以需要將p轉(zhuǎn)換為一個(gè)二重指針后再加1,以使指針移向下一個(gè)參數(shù)i。這樣,沒(méi)有使用參數(shù)i和a,也可以顯示這兩個(gè)變量的數(shù)值。

3 PC機(jī)上的printf()函數(shù)的設(shè)計(jì)實(shí)現(xiàn)

現(xiàn)在,可以編寫(xiě)自己的printf()函數(shù)了。以下給出TC20編譯環(huán)境下的具體實(shí)現(xiàn)代碼,在其他環(huán)境下,可以根據(jù)該原理進(jìn)行移植。該函數(shù)除了可以顯示十進(jìn)制、字符串、十六進(jìn)制等格式數(shù)值外,也可以按位顯示二進(jìn)制數(shù)。對(duì)于其他類(lèi)型,讀者可以根據(jù)需要增刪。

在實(shí)際應(yīng)用中,可以修改其中的putchar()函數(shù),將字符發(fā)到串口,就可以達(dá)到上述目的了。這里我們編寫(xiě)的函數(shù)還增加了數(shù)字的二進(jìn)制顯示,這對(duì)于很多位域應(yīng)用是很有用處的。

/*printf()函數(shù)的實(shí)現(xiàn)代碼,為和庫(kù)函數(shù)區(qū)別,特在各函數(shù)前增加前綴“my”*/

void myprintf(char *fmt,…)

{

void *p;

char ch;

p=&fmt;p=(char**)p+1;/*指向堆棧中的下一個(gè)參數(shù)*/

while(1){

while((ch=*fmt++)!=‘%‘{/*讀入格式字符串*/

if(ch= =‘0‘)return;

putchar(ch);

};

ch=*fmt++;[!--empirenews.page--]

switch(ch){ /*格式字符分析*/

/*因?yàn)樽址麉?shù)傳遞時(shí)也轉(zhuǎn)換成整形參數(shù)傳遞,故同樣處理*/

case ‘c‘:

case‘d‘:

case‘x‘:

case‘0‘:

case‘b‘:

if(ch= =‘c‘)myputchar(*(int *)p));

if(ch= =‘d‘)myprintn(*((int *)p),10);

if(ch= =‘x‘)myprintn(*((int *)p),16);

if(ch= =‘o‘)myprintn(*((int *)p),8);

if(ch= =‘b‘)myprintn(*((int *)p),2);

p=(int)p+1; /*指針移動(dòng)*/

break;

case‘s‘:

myputs(*((char **)p));

p=(char **)p+1; /*指針移動(dòng)*/

break;

default;

};

}

}

void myputs(char str) /*顯示一個(gè)字符*/

{

while((*str)!=‘0‘)myputchar(‘str++);

}

/*顯示任意進(jìn)制的數(shù)值,b為二、八、十、十六等進(jìn)制數(shù)*/

void myprintn(int,n,int b)

{

if(b= =16){ myprintx(n); return; }

if(n<0){ myputchar(‘-‘); n=-n; };

if(n/b)

myprintn(n/b,b);

myputchar(n%b+‘0‘);

}

void myprintx(int n) /*以十六進(jìn)制顯示1個(gè)數(shù)字*/

{

signed char i;

for(i=3;i>=0;i--)

if(((n>>i*4)&0x0f)>=10)

/*當(dāng)10,11…時(shí),顯示‘a(chǎn)‘,‘b‘,…‘f‘,*/

myputchar(((n>>i*4)&0x0f)-10+‘a(chǎn)‘);

else myputchar(((n>>i*4)&0x0f)+‘0‘);

}

/*

*在很多嵌入式系統(tǒng)中,并不存在PC一樣的標(biāo)準(zhǔn)顯示設(shè)備,

*通過(guò)修改該函數(shù),可以將字符“ch”發(fā)送到串口,或者目

*標(biāo)系統(tǒng)中的LED、LCD等顯示器件。這樣,就可以在脫

*離開(kāi)發(fā)系統(tǒng)情況下顯示調(diào)試信息,從而調(diào)試目標(biāo)系統(tǒng)的軟

*件或硬件。

*/

void myputchar(int ch)

{

……;/*此函數(shù)可供修改,將字符“ch”送到SBUF或其他顯示器件就可以了*/

}

4 超級(jí)終端軟件的使用

打開(kāi)Windows的“超級(jí)終端”軟件,再打開(kāi)“hypertrm”,新建一個(gè)終端會(huì)話(huà)。在該會(huì)話(huà)的“屬性u(píng)35774設(shè)置u32456終端仿真”菜單下,將終端仿真類(lèi)型設(shè)置為VT100[5];在“屬性u(píng)35774設(shè)置 u32456終端設(shè)置u23383字符集”菜單下設(shè)置字符集為“ASCII”;在“屬性u(píng)36830連接到u37197配置u24120常規(guī) u26368最快速度”下設(shè)置通信波特率和目錄系統(tǒng)一致,并將該對(duì)話(huà)框下“僅以該速度連接打開(kāi)”設(shè)置選中;在“屬性u(píng)36830連接到u37197 配置u36830連接u36830連接首選項(xiàng)”下設(shè)置傳送數(shù)據(jù)位數(shù)、校驗(yàn)方式。完成后,連接好RS-232串口線(xiàn),就可以在超級(jí)終端窗口顯示目標(biāo)系統(tǒng)的調(diào)試信息了。

在用超級(jí)終端顯示時(shí),唯一要求發(fā)送的數(shù)據(jù)必須以ASCII碼形式發(fā)送(上述printf()函數(shù)就是如此)。如果要求交互式雙向數(shù)據(jù)傳送,請(qǐng)參考VT100文檔[5]。對(duì)于字符和控制的說(shuō)明,這里不再描述。

當(dāng)然,在不方便使用PC機(jī)的情況下(如某些工業(yè)現(xiàn)場(chǎng)),可以自制一個(gè)簡(jiǎn)單帶串口的LED或LCD的ASCII顯示終端來(lái)專(zhuān)門(mén)顯示的調(diào)試信息。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉