www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

摘要:提出在目標系統(tǒng)脫離開發(fā)系統(tǒng)運行時,如何通過串口在Windows的超級終端軟件中顯示調試信息的一個具體方法。該方法有助于改進調試質量、縮短調試周期。

關鍵詞:脫機調試 超級終端 可變參數函數 輸出函數

1 ROM版本目標系統(tǒng)的調試問題

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

 

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

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

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

2 C函數的參數傳遞原理

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

表1

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

char str[10]=“welcome”;

int i=100; float a=1.14;

……

fun(str,i,&a);

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

表2 函數調用時的參數在堆棧中的存儲情況(X86環(huán)境)

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

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));

}

上面語句定義了一個無法型指針p來指向堆棧地址,這樣,就可以得到堆棧中的各個參數。p被初始化為指向第一個參數str。因為str也是一個指針,所以需要將p轉換為一個二重指針后再加1,以使指針移向下一個參數i。這樣,沒有使用參數i和a,也可以顯示這兩個變量的數值。

3 PC機上的printf()函數的設計實現

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

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

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

void myprintf(char *fmt,…)

{

void *p;

char ch;

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

while(1){

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

if(ch= =‘0‘)return;

putchar(ch);

};

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

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

/*因為字符參數傳遞時也轉換成整形參數傳遞,故同樣處理*/

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; /*指針移動*/

break;

case‘s‘:

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

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

break;

default;

};

}

}

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

{

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

}

/*顯示任意進制的數值,b為二、八、十、十六等進制數*/

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) /*以十六進制顯示1個數字*/

{

signed char i;

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

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

/*當10,11…時,顯示‘a‘,‘b‘,…‘f‘,*/

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

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

}

/*

*在很多嵌入式系統(tǒng)中,并不存在PC一樣的標準顯示設備,

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

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

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

*件或硬件。

*/

void myputchar(int ch)

{

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

}

4 超級終端軟件的使用

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

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

當然,在不方便使用PC機的情況下(如某些工業(yè)現場),可以自制一個簡單帶串口的LED或LCD的ASCII顯示終端來專門顯示的調試信息。

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

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

關鍵字: 汽車 人工智能 智能驅動 BSP

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

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

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

關鍵字: 華為 12nm 手機 衛(wèi)星通信

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

關鍵字: 通信 BSP 電信運營商 數字經濟

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

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

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

關鍵字: BSP 信息技術
關閉
關閉