处理中...

首页 > 资料大全 > 解决方案 >

再来一版简易的printf函数实现

再来一版简易的printf函数实现
来源: 时间:2015-04-21

以前发过两版简易的串口printf函数实现,近搞了一段时间Linux的库文件,回过头又有不同的理解。

这一版函数基于MSP430F169,%d %x %o %b的实现不再由自己编写函数,

而是调用MSP430-GCC的标准库函数: #include <stdlib.h> char *itoa(int num, char *str, int radix);

send_fun函数指针,指向调用的UARTx的字节发送函数: void uart_printf(send_fun fun, char *fmt, ...)

{ char *pnt = (char *)&fmt + sizeof(fmt); char *str, buf[9]; int radix; while (*fmt != '\0')

{ if (*fmt != '%') { fun(*fmt); fmt += 1; continue; } switch (*(fmt + 1)) { case 'c': fun(*((int *)pnt)); pnt += sizeof(int);

fmt += 2; continue; case 's': str = (char *)*((int *)pnt);

while (*str != '\0') fun(*str++); pnt += sizeof(int);

fmt += 2; continue; case 'd': radix = 10; goto SEND_NUM; case 'x':             radix = 16;             goto SEND_NUM;

case 'o': radix = 8; goto SEND_NUM; case 'b': radix = 2;

goto SEND_NUM; SEND_NUM: str = itoa(*(int *)pnt, buf, radix);

while (*str != '\0') fun(*str++); pnt += sizeof(int); fmt += 2;

continue; default: break; } } } 实际上,库stdio.h中也提供了printf的实现,直接调用它们就可以了: int __attribute__((format (printf, 2, 3))) uprintf(int (*func)(int c), const char *fmt, ...);

热门推荐

更多 >
ESP32-S3 2022-03-16
RG200U 2022-03-16
USR-C322 2022-03-16

资料浏览排行榜

更多 >
商品名称 大小 浏览量
1 EPCS128SI16N 0.94MB 22000次
2 1N4001 0.19MB 17867次
3 DAC1220E 0.95MB 15865次
4 EP1C6Q240I7N 2.47MB 15822次
5 GRM32RR71H105... 0.10MB 14004次
6 DR127-3R3-R 0.72MB 11679次
7 DMG2305UX-7 0.40MB 9279次
8 DMP2008UFG-7 0.24MB 9066次
9 DS1337U+ 0.28MB 9063次
10 DX4R105JJCR18... 0.26MB 8981次