OpenEdv-开源电子网

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

keil5函数返回值问题

[复制链接]

11

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-12-24
在线时间
8 小时
发表于 2015-11-10 10:10:56 | 显示全部楼层 |阅读模式
5金钱
在keil5中,我用JTAG仿真无线通信实验,有这么一个函数,u8 NRF24L01_Check(void),定义的是U8类型的,返回值是0和1,但仿真的返回值是0x08005522,应该是我哪个地方的基础没搞清楚,问下这是什么原因呢?

最佳答案

查看完整内容[请看2#楼]

t是个变量,值为0x0000,类型为unsigned short 就是你说的u16; NRF24L01_Check函数指针变量,其值就是函数在flash里的地址,所以值为0x08005522,你可以看到后面的的type就是返回值为unsigned char f()类型的函数指针。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-10 10:10:57 | 显示全部楼层
t是个变量,值为0x0000,类型为unsigned short 就是你说的u16;
NRF24L01_Check函数指针变量,其值就是函数在flash里的地址,所以值为0x08005522,你可以看到后面的的type就是返回值为unsigned char f()类型的函数指针。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-10 10:14:02 | 显示全部楼层
你确定这个0x08005522是返回值吗?感觉这个是NRF24L01_Check(void)函数在flash中的地址。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

24

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2014-1-7
在线时间
16 小时
发表于 2015-11-10 10:23:30 | 显示全部楼层
这是flash里面的地址
回复

使用道具 举报

11

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-12-24
在线时间
8 小时
 楼主| 发表于 2015-11-10 10:44:19 | 显示全部楼层
上图里面的watch窗口里面的变量t是个正常值(按照程序也确如此),这个怎么解释呢?
回复

使用道具 举报

11

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-12-24
在线时间
8 小时
 楼主| 发表于 2015-11-10 10:46:13 | 显示全部楼层
t定义的是u16
回复

使用道具 举报

11

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-12-24
在线时间
8 小时
 楼主| 发表于 2015-11-10 15:00:27 | 显示全部楼层
回复【6楼】ianhom:
---------------------------------
哦,知道了,thank you,那怎么看这个函数的返回值呢?
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-10 15:18:23 | 显示全部楼层
回复【7楼】龙井:
---------------------------------
keil中不知道有没有专门的方法看,你可以进入这个函数单步运行看看最后返回什么值,或者你static int temp; temp = NRF24L01_Check(); printf("%d", &temp);来看返回值。
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

11

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2014-12-24
在线时间
8 小时
 楼主| 发表于 2015-11-10 16:17:19 | 显示全部楼层
回复【8楼】ianhom:
---------------------------------
这种方法可以测试出刚才的返回值(0x00),但同样的方法,对这个函数u8 NRF24L01_TxPacket(u8 *txbuf)经行函数返回值的测试,定义的temp也是u8,但仿真结果是temp not in scope temp 变量不在范围,这个函数u8 NRF24L01_TxPacket(u8 *txbuf)只有0x10,0x20,和0xff三个返回值,感觉很奇怪。
回复

使用道具 举报

26

主题

201

帖子

0

精华

高级会员

Rank: 4

积分
606
金钱
606
注册时间
2013-12-14
在线时间
125 小时
发表于 2015-11-10 16:23:41 | 显示全部楼层
从值来看应该是flash的地址
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-11-10 16:25:35 | 显示全部楼层
你这个temp可能被编译器优化了,你试试把这个temp用volatile修饰一下,或在后面的程序中使用这个值,让编译器不要优化temp
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 20:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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