OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9058|回复: 14

keil STM32 函数返回64位数貌似不行

[复制链接]

14

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-12
在线时间
13 小时
发表于 2016-8-19 14:03:14 | 显示全部楼层 |阅读模式
本帖最后由 yzk 于 2016-8-20 14:26 编辑

    printf("\r\nunsigned long= %d", sizeof(unsigned  long));
    printf("\r\nlong long= %d", sizeof(long long));
    printf("\r\nlong = %d", sizeof(long));
    printf("\r\nint = %d", sizeof(int));
    printf("\r\nunsigned int = %d", sizeof(unsigned int));
    printf("\r\nshort = %d", sizeof(short));
    printf("\r\nunsigned short = %d", sizeof(unsigned short));
    printf("\r\nfloat = %d", sizeof(float));
    printf("\r\ndouble = %d", sizeof(double));


unsigned long= 4
long long= 8
long = 4
int = 4
unsigned int = 4
short = 2
unsigned short = 2
float = 4
double = 8

keil STM32 函数返回64位数貌似不行,32位没问题,不知是否我错了还是真不支持

结果出来了,是printf(%d)不支持.函数返回无问题.
结贴.

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-8-19 14:30:48 | 显示全部楼层
STM32就是32位处理器,是不是对64位数据应该特殊处理?纯属瞎猜
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-8-19 17:17:36 | 显示全部楼层
我从底层上讲,是可以的
一般当我们返回32位数的话,就是用R0寄存器返回的
如果是返回64位的,就是用R0,R1返回
电子爱好者
回复 支持 反对

使用道具 举报

14

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-12
在线时间
13 小时
 楼主| 发表于 2016-8-19 22:56:03 | 显示全部楼层
liuchang 发表于 2016-8-19 17:17
我从底层上讲,是可以的
一般当我们返回32位数的话,就是用R0寄存器返回的
如果是返回64位的,就是用R0,R1返 ...

本来想用64位数来表示年月日时分秒星期,201608192253015(0xB75C90AEDC57),但函数返回这个根本不对,只保留时间改为32位则正常.用的时keill环境.
回复 支持 反对

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-8-20 00:47:01 | 显示全部楼层
帮顶!!
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2016-1-3
在线时间
62 小时
发表于 2016-8-20 11:41:33 | 显示全部楼层
ull不就返回64位了?
回复 支持 反对

使用道具 举报

14

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-12
在线时间
13 小时
 楼主| 发表于 2016-8-20 13:06:44 | 显示全部楼层

unsigned long long不行,要么编译器配置问题,要么编译器有问题,作为函数返回值反正是不行,32位就没问题.
回复 支持 反对

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
发表于 2016-8-20 14:28:31 | 显示全部楼层
用结构体
回复 支持 反对

使用道具 举报

14

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2012-7-12
在线时间
13 小时
 楼主| 发表于 2016-8-20 17:52:47 | 显示全部楼层

对结构体也行,指针多少个参数都能返回,
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-8-22 09:08:27 | 显示全部楼层
我试了一下,的确运算结果不正确,我把程序贴上(使用的探索者stm32f407zgt6,MDK5)[mw_shl_code=c,true]uint64_t add(uint64_t a, uint64_t b)
{
        uint64_t k;
        k = a + b;
        return k;
}

int main()
{
        uint64_t temp;
        temp = add(0x000000000000001, 0x000000000000010);
        temp = temp+1-1;
}
如下是add()函数的反汇编
[mw_shl_code=asm,true]    41: {
    42:         uint64_t k;
0x08000226 B5F0      PUSH          {r4-r7,lr} ;lr不是链接寄存器嘛,这里为什么要保存lr,而且lr是32位的,为什么需要使用r4~r7???这里请大神指教下
0x08000228 4604      MOV           r4,r0         ;r4保存的是第一个形参的低32位(因为r0和r1需要保存和返回函数的运算结果,所以需要将第一个形参部分放入堆栈)
0x0800022A 460D      MOV           r5,r1         ;r5保存的是第一个形参的高32位
    43:         k = a + b;
0x0800022C 18A6      ADDS          r6,r4,r2      ;将两个形参的低32位相加
0x0800022E EB450703  ADC           r7,r5,r3 ;将两个形参的高32位相加(注意,这里使用ADC,也就是带进位的加法)
    44:         return k;
0x08000232 4630      MOV           r0,r6           ;将结果通过r0和r1返回,按道理,这里刚好可以返回64位的整数
0x08000234 4639      MOV           r1,r7           ;我认为汇编的实现部分没有问题,不知道为什么结果不正确,请大神指教下~~~
    45: } [/mw_shl_code]
电子爱好者
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-8-22 09:11:03 | 显示全部楼层
这里是运算结果
0000.jpg
电子爱好者
回复 支持 反对

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-8-22 09:38:20 | 显示全部楼层
本帖最后由 aozima 于 2016-8-22 09:40 编辑

[mw_shl_code=c,true]printf("%lld", ll);[/mw_shl_code]
http://www.cplusplus.com/reference/cstdio/printf/
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2017-7-1
在线时间
81 小时
发表于 2019-8-8 12:34:30 | 显示全部楼层
过来学习一下
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-6-13
在线时间
0 小时
发表于 2020-6-13 11:32:30 | 显示全部楼层
编译器优化了,没有把寄存器里面的值回写到临时变量地址里面,最终逻辑是正确的;只需要加一个volatile关键字就可以了
回复 支持 反对

使用道具 举报

32

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2013-1-16
在线时间
131 小时
发表于 2020-6-13 16:14:32 | 显示全部楼层
长知识了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 23:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表