以前搞51,用顺了printf函数,而用在ARM平台上折腾,虽有仿真器联机调试,但没这函数总是不顺手,照着老办法重定义putchar函数后,想当然应该能用printf了,哪知下载到芯片中,死气沉沉,郁闷,网上搜一搜,没有搞明白,回头翻翻Keil的安装文件夹,找到一个blinky的例程,其中正如带有Printf,大喜,遂依葫芦画瓢,可然成功,原来这MDK要重载以下函数才能实现Printf。
// Implementation of sendchar (also used by printf function to output data)
int sendchar (int ch) { // Write character to Serial Port
while (!(U0LSR & 0x20));
return (U0THR = ch);
}
int getkey (void) { // Read character from Serial Port
while (!(U0LSR & 0x01));
return (U0RBR);
}
#pragma import(__use_no_semihosting_swi)
extern int sendchar(int ch); /* Defined in Serial.c */
struct __FILE {
int handle; /* Add whatever you need here */
};
int fputc(int ch, FILE *f) {
return (sendchar(ch)); /* Retarget fputc to serial UART */
}
void _sys_exit(int return_code) {
for (;;); /* Endless loop */
}
最关键的是要能搞出个fputc函数给printf用,呵呵,搞复杂了,还不如原来的简单,原来51平台只占1K,这个printf一用,代码立即附加2K多,还好ARM程序空间大。 |