野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14623|回复: 4

C语言函数里指针的问题,求解

[复制链接]
发表于 2016-10-31 10:40:03 | 显示全部楼层 |阅读模式
本帖最后由 huaidan 于 2016-10-31 11:19 编辑

原代码如下,但一运行到
EEPROM_BufferRead(para, TYJ0_USART_BaudRate_Addr, 4);
就I2C等待忙死循环,
  1. uint8_t TYJ_ReadUsartPara(uint8_t tyj_num , uint8_t *para)
  2. {
  3.         if(tyj_num >= TYJ_NUM)
  4.         return 0;

  5.     if(tyj_num == 0)
  6.     {
  7.         EEPROM_BufferRead(para, TYJ0_USART_BaudRate_Addr, 4);
  8.     }
  9.     else if(tyj_num == 1)
  10.     {
  11.         EEPROM_BufferRead(para, TYJ1_USART_BaudRate_Addr, 4);
  12.     }

  13.     return 1;
  14. }
复制代码



如果改成如下代码,则I2C不会在忙标志那里死循环,整个工程可以正常运行,但是这个函数返回的*para数据不正确
  1. uint8_t TYJ_ReadUsartPara(uint8_t tyj_num , uint8_t *para)
  2. {
  3.     uint8_t dat[4];
  4.         
  5.         para = dat;
  6.         
  7.         if(tyj_num >= TYJ_NUM)
  8.         return 0;

  9.     if(tyj_num == 0)
  10.     {
  11.         EEPROM_BufferRead(para, TYJ0_USART_BaudRate_Addr, 4);
  12.     }
  13.     else if(tyj_num == 1)
  14.     {
  15.         EEPROM_BufferRead(para, TYJ1_USART_BaudRate_Addr, 4);
  16.     }

  17.     return 1;
  18. }
复制代码


整个工程当用有很多个类似这样读EEPROM并通过指针返回数据的函数其他都正常运行并且返回数值正确。
求解!
主要是我想问的是:为什么最上面的函数会卡死在I2C等忙标志哪里,下面的函数就不会卡死在I2C


回复

使用道具 举报

 楼主| 发表于 2016-10-31 16:04:00 | 显示全部楼层
谢各位,问题解决了,错误原因是因为,调用这个函数时定义了一个uint8_t *p直接作为实参输入了*para的位置,后来把*p改成了p[];就可以了,最上面的那段代码是正确的,只是引入的实参错误了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-31 11:11:21 | 显示全部楼层
求火哥给解答
回复 支持 反对

使用道具 举报

发表于 2016-10-31 11:33:56 | 显示全部楼层
iic卡死的话,直接改成软件iic,不要考虑其它了
回复 支持 反对

使用道具 举报

发表于 2016-10-31 12:24:49 | 显示全部楼层
第一段代码中, *para分配的空间是一个字节,你用来放EEPROM读出来的4个字节,我猜你的 EEPROM_BufferRead函数里应该由类似para++的语句,所以内存溢出,第二段中的para赋了数组的首地址,也就是para有4个字节的空间,所以内存不会溢出
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-13 10:36 , Processed in 0.031334 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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