请教u-boot中的printf()打印64位整型变量
时间:2010-04-23
来源:互联网
最近蛋疼,移植了一个u-boot,发现printf()函数的一些问题
比如我要打印一个unsigned long long变量,也就是64位的变量,如果值是0x40000,按照0x%llx打印,实际打印出来的是0x4 0000 0000 0000,按照0x%x打印得到0x0
我的结论是:
数据在内存中存储方式导致printf输出错误
依据:
1.本来应该是0x40000的,实际在后面加了四个字节的0;
2.按照32为打印得到0,只是把低4字节省略,说明数据类型转换正确
请教:
1.printf()函数是编译器提供的还是u-boot自带的,或者它是编译器提供的,最后重定向到开发板的串口?
2.如何才能通过printf正确打印64位整型变量
PS:请不要告诉我把数据左移,右移之类的,再按照32位数据打印(咱们都不是小孩子了,chinalinux论坛丢不起这个人)。我想找到原因,和彻底的解决办法
作者: OLAY玉兰油 发布时间: 2010-04-23
等过段时间拿到>4GB的flash,再具体验证一下。
uboot中的printf,去看代码,实现应该是在common/console.c中,重定向到串口中的。
目前个人以为,90%的可能,还是代码是正常的。只是使用上,不知哪里出错了。
作者: crifan 发布时间: 2010-04-23
我的版本是u-boot-2010.03的,应该是最新的了
这个问题出现在nand_erase_opts()函数中(实现nand flash的擦除)
printf("\rErasing at 0x%llx -- %3d%% complete.",erase.addr, percent);这句话输出了擦除的块首地址和已擦除百分比,代码执行过程中,擦除正常,打印错误
补充一下1.3.1中erase.addr是32位的,现在新版本的是64位的,在sourceinsght里看到printf()函数和u-boot-1.3.1的代码不一样
功底有限,还不能很好理解这个函数,继续求教
作者: OLAY玉兰油 发布时间: 2010-04-24
printf("\rErasing at 0x%x -- %3d%% complete.", erase.addr, percent);
那首先你自己确认一下,erase.addr是不是的确是定义为u_int64_t的了。
如果定义都对,那应该没啥问题的。
注:巧的是,偶对nand flash这部分相对还是比较熟悉的,呵呵。
作者: crifan 发布时间: 2010-04-25
此外,我还发现
1.如果执行printf("\rErasing at 0x%llx -- %3d%% complete.",erase.addr, percent);,erase.addr和percent都是错的;而分别打印erase.addr和percent,结果是erase.addr打印错误,percent打印正确
2.在阅读printf代码时发现一句va_arg(args,unsigned long long)代码,由于va_arg()是gcc编译器提供的,怀疑我使用的gcc版本va_arg()进行64位操作时会出错(我的arm-linux-gcc版本是4.3.2)
请教va_arg()系列的函数在什么地方定义
作者: OLAY玉兰油 发布时间: 2010-04-26
作者: looneyxp 发布时间: 2010-05-04
1。看了下代码,你说的那个
va_arg(args,unsigned long long)
是不是这个:
在lib_generic/vsprintf.c中的:
int vsprintf(char *buf, const char *fmt, va_list args)
{
..
#ifdef CONFIG_SYS_64BIT_VSPRINTF
if (qualifier == 'q') /* "quad" for 64 bit variables */
num = va_arg(args, unsigned long long);
else
#endif
...
}
是的话,那你应已经加了对应的宏,去启动64位的支持了吧?
我的是在头文件中加了:
#define CONFIG_SYS_64BIT_VSPRINTF 1
#define CONFIG_SYS_64BIT_STRTOUL 1
其中CONFIG_SYS_64BIT_STRTOUL对应着cmd_nand.c中,很多输入的字符串变量,转换成64位的数值要用到lib_generic/vsprintf.c中的simple_strtoull
2。关于编译器的版本,我的是用
buildroot v2009.08
编译的gcc 4.2.4版本的arm-linux-gcc
配置里面,加了大文件支持:
[ * ] Enable large file (files > 2 GB) support?
不知道这个参数是否对编译出来的,是否支持64位的打印的那些函数有影响。
如果有,那你的编译时候,也要加上。
3。另外,我用的OABI,如果你用的是EABI,不知道是否有可能是EABI的兼容性不够好?(个人感觉,这个可能性极小。。。)
作者: crifan 发布时间: 2010-05-07
作者: maylag 发布时间: 2010-10-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28