最近碰见一个比较怪异的问题,mcu是英飞凌的tc39x系列的,函数返回一个uint64类型的数据时,高32位数据要么全是F要么全是0,有知道为什么的吗?
uint64定义是long long
例:
uint64 a_fun(void)
{
.......
...
return a_value;
}
main(void)
{
b_value=a_fun();
}
a_value的值是正确的,b_value的值高32不对
我抓了几次问题的现象是:
a_value=0x00000016 83B2A81F
b_value=0xFFFFFFFF 83B2A81F
a_value=0x0000001B 628DFBC8
b_value=0x00000000 628DFBC8
我也遇到了同样的问题,且找到了规律和原因
低32位最高位为1,
a :0x00000000 80000000
b :0xFFFFFFFF 80000000
低32位最高位为0
a :0x00000000 70000000
b :0x00000000 70000000
uint64_t tmp = strtoul(0xA80000000);
因为他store变量tmp是这么存的
----------------------------------------------------------
bl strtoul
----------------------------------------------------------
mov r3,r0
mov r2,r3
asr r3,r2,#31
strd r2,r3,[r11,#-20]
解决方案
我不管怎么 倒腾,都改变不了这段反汇编代码,我认为是现在用的编译器的问题,但是我不能换编译器
所以我决定用指针传参,已经解决
这是编译器的问题,不是说32位处理器不能处理64位返回值.
有的arm32编译器就能够很好地处理这个问题,已经验证