新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 系統調試信息的顯示方法

        系統調試信息的顯示方法

        作者: 時間:2012-03-07 來源:網絡 收藏

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

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

          }

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

        現在,可以編寫自己的printf()函數了。以下給出TC20編譯環境下的具體實現代碼,在其他環境下,可以根據該原理進行移植。也可以按位二進制數。對于其他類型,讀者可以根據需要增刪。

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

          /*printf()函數的實現代碼,為和庫函數區別,特在各函數前增加前綴“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++;

          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;

          };

          }

          }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乌兰浩特市| 永春县| 东丽区| 菏泽市| 湟源县| 黑龙江省| 桃江县| 正宁县| 宜川县| 龙胜| 同德县| 青海省| 灵川县| 南阳市| 高青县| 中宁县| 普安县| 盘锦市| 哈巴河县| 清苑县| 自贡市| 佳木斯市| 保德县| 城口县| 平阳县| 息烽县| 阜阳市| 云梦县| 教育| 邹平县| 永善县| 根河市| 辽宁省| 德惠市| 玉环县| 辽阳县| 淳安县| 西丰县| 岳普湖县| 施甸县| 衡东县|