http://blog.udn.com/cchahacaptain/2238613
大家在C語言裡面,一定會碰到一個寫法:
printf("%d, %x", var1, var2);
後面的引數數量可以任意增減,pc上沒問題,因為程式都寫好了,可是在embedded system上面怎麼辦?甚至是想寫個【I2C_printf】、【flash_printf】,甚至只是覺得原來的printf太爛,想改寫RS232的輸出輸入等等,要怎麼寫呢?很奇怪,這個很多課本也不教!工作了這麼久,看過太多被這個問題困擾的人,導致最後寫出各種古里古怪的程式來達到這個功能。
其實答案很簡單,C語言就有這個功能:"stdarg",範例程式如下:
#include <stdarg.h>
// ** over here! **
#include <stdlib.h>
#include <stdio.h>
char PrintBuf[50];
//
void PRINT(char *ptr, ...);
void PRINT(char *ptr, ...)
{
va_list ap;
va_start(ap, ptr);
vsprintf(PrintfBuf, ptr, ap);
va_end(ap);
.....ooxx
RS232_OUT(PrintfBuf);
}
var1 = 5;
var2 = 6;
PRINT("val1=%d,val2=%d" var1, var2);
上述範例在"va_end(ap)"後,就可以直接使用"PrintBuf"內的字串了,此例中PrintBuf內的字串便會是:
"val=5,val2=6"
把這個字串輸出直接即可,注意那個"PrintfBuf"的大小,自己該知道PRINT的極限,預留太大也沒用,只是浪費而已,千萬要注意,無論是ARM,PPC,或是如8051,PIC,msp340等的小型CPU,甚至是H8這種工控型CPU,絕對會有【預設記憶體型態】的問題,上述的寫法會把PrintBuf放在預設區域,所以要知道如何調整memory map才好,否則就準備面臨記憶體爆炸的問題吧,例如8051就直接寫成
char xdata PrintfBuf[50];
另外一個極其重要的觀念,只要使用到"sprintf"類相關的標準函式,就要有心理準備,就是程式碼會大幅增加,如果flash只有8k的,如TI MSP340,要小心大概要不夠用了,就要立刻捨棄掉這種標準方式,所以很多程式,就準備自己寫吧!
另外vsprintf(),到底是放在"stdio.h",還是"string.h",甚至是其他地方,每種compiler都不一樣,我的方法是,有精神,就把該.h檔查出來,沒精神,就全部一起加吧!換compiler時,再重新查起吧!
/2238613#ixzz2G1Knw7Nh
|