s3c2440上实现printf(printf自动确定可变参数)

本文介绍了如何在s3c2440嵌入式平台上实现printf函数,用于裸机调试。重点在于解决printf函数处理变参列表的难点,包括从格式字符串中识别替换位置、获取变量地址以及将数值转换为字符串。文章讨论了参数在堆栈中的布局,使用中的头文件的部分功能,并探讨了结构体在不同平台和编译器下的内存对齐策略。最后,作者提供了代码资源以供参考。
摘要由CSDN通过智能技术生成

这一篇是对韦东山2440的uart的printf课程的总结。printf是c标准库stdio.h的函数,本来想要把它移植在裸板上,存储是不够的。但是,作为一个能直接打印信息的函数,对调试很有用。所以,就对它进行一些操作。

仿照printf的几个难点在于:
1-printf函数的参数,是有一个char *的常量字符串和若干变参变量构成。怎么从char *这一个常量里,读取出哪里是要替换为那些参数的。(这个在代码里解决)
2-这些参数,怎么确定是什么变量类型,特别是对于结构体,怎么知道结构体里有什么变量类型。(这个并没有解决,所以要避开)
3-这些变量的地址在哪里,然后才能去获得它们的值。(这个在下面文字里解决)
4-像int这种类型,打印出来本质上是打印的是形式上是数据的字符串,这一步的转换也要考虑到。(这个在代码里解决)

以下就是从这些问题解决。
printf函数的参数,是有一个char *的常量字符串和若干变参变量构成。对于函数来说,背后的机制是,函数传入的参数是进入了堆栈,先进后出。而且这些参数的地址是连续的(大小就同sizeof(变量类型))。
所以,对于变参变量来说,只要知道它们的首地址,就可以知道所有的变量的地址,并读取出对应的值。
首地址,本质的做法,就是取 那个char *的常量字符串(一般称为,format)的地址。对于后面的变量参数地址,就是,char *的地址,加上sizeof(变量类型),如此反复叠加则可。

<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值