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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

不过c语言提供了包装了上面取地址,移动指针的几个函数。

va_list p; 定义一个变参变量p,相当于char *
va_start(p,fmt ); format是固定参数,经过va_start(p,format),p移动到第一个变参变量
va_arg( p, 变量类型); 在已知变量类型前提下,通过这个函数,将目前地址的所指向的值以这个变量类型返回,并自动加上siz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值