OpenEdv-开源电子网

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

请教一个很low的关于函数返回值的问题

[复制链接]

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2017-12-13 10:17:45 | 显示全部楼层 |阅读模式
1金钱
在 19264.c文件中有个函数是获取DDRAM中某个地址的数值,返回d
u8 Read_test_L(void)  //读左屏测试
{
        u8 d;
        
        Lcm19264A_Wr_Command_L(START_LINE);         
        
        Lcm19264A_Wr_Command_L(0x01 + X_ADDRESS);     //页地址设置
        Lcm19264A_Wr_Command_L(0x00 + Y_ADDRESS);     //列地址设置
        
        d = (u8)Lcm19264A_Rd_Data_L();
        
        d = (u8)Lcm19264A_Rd_Data_L();
        
        return d;
}


在main.c文件中调用这个上面那个函数
i = Read_test_L();

问题是在u8 Read_test_L()函数中返回值d数值是正确的,但好像没有返回给main函数中的i,不知道什么原因。请指教一下,谢谢!

最佳答案

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

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2017-12-13 10:17:46 | 显示全部楼层
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2017-12-13 10:27:03 | 显示全部楼层
你I 是否在别的地方使用了。导致被覆盖了。
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2017-12-13 10:34:52 | 显示全部楼层
sodermalm 发表于 2017-12-13 10:27
你I 是否在别的地方使用了。导致被覆盖了。

没有啊,主函数很简单,就是测试一下数据传递
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "19264.h"
#include "beep.h"
#include "wdg.h"

int main(void)
{
        u8 i;
       
        delay_init();                         //延时函数初始化

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //开启AFIO时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭JTAG口,使PB3,PB4,PA15这几个IO作为普通IO使用

       
        LCD19264_InitPort();         //初始化液晶屏端口
        Lcm19264A_Init();                 //液晶屏初始化

        BEEP_Init();                         //蜂鸣器初始化
        IWDG_Init(4,3125);    //与分频数为64,重载值为3125,溢出时间为5s

        Start_voice();
       
        IWDG_Feed();
       
        Write_test_L(0x48);
       
        i = Read_test_L();
       
        /****************************************************************************/

        while(1)
        {
                IWDG_Feed();
               
        }
}
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-13 10:39:23 | 显示全部楼层
main 函数的代码贴一下
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2017-12-13 10:40:22 | 显示全部楼层
这个内存中的数据被调用函数Read_test_L()中设断点,返回值d数据是正确的。

Snap2.jpg

当时执行完i = Read_test_L();后
Snap3.jpg
i中没有得到返回值。


回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-11-25
在线时间
3 小时
发表于 2017-12-13 10:55:13 | 显示全部楼层
学习了
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2017-12-13 10:58:35 | 显示全部楼层

多谢指教,确实是因为变量 i 被优化掉了,定义成 volatile u8 i; 就好了。再次感谢!
回复

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2017-12-13 12:18:27 | 显示全部楼层
i读取了,没有实际用处,所有编译器给优化了,可以把i再赋给别的变量试试一下
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2017-12-14
在线时间
17 小时
发表于 2017-12-14 18:18:45 | 显示全部楼层
如果i被使用的话,可以设置成全局变量,这个应该跟设置成volitale 内部变量一个效果;还有 你最后几行在一个while(1)中执行喂狗 这就跳不出来了,只能Read_test_L(); 返回初始化时的一个数据,不能更新吧;
回复

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
 楼主| 发表于 2017-12-16 20:59:11 | 显示全部楼层
nideyangzi2046 发表于 2017-12-14 18:18
如果i被使用的话,可以设置成全局变量,这个应该跟设置成volitale 内部变量一个效果;还有 你最后几行在一 ...

多谢恢复,就是为了测试Read_test_L();函数能不能读出液晶屏DDRAM中的数据,整个程序没什么意义。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 21:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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