OpenEdv-开源电子网

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

求助!一读取片内FLASH存储信息,结构体初始值就会被改变

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2017-8-25
在线时间
0 小时
发表于 2017-8-25 22:12:21 | 显示全部楼层 |阅读模式
1金钱
//定义的参数
#define FLASH_SAVE_ADDR  (105*0x400+0x08000000)
sizeof(FA.Content.Buff)大于60

//定义的结构体
typedef struct
{
  INT8U                              enable;     
  INT8U                             ringing;   
  INT32U                            delayms;   
  _64bit                        end;        
  TimeCallBack*          cb;     
}timer;
static timer aTimer[50];
//用到的函数 结构体数组初始化
void TIMER_Init(void)
{
  for(INT8U i=0;i<TIMER_NUM;i++)
  {
    aTimer[i].enable=0;
    aTimer[i].ringing=0;
    aTimer[i].delayms=0;
    aTimer[i].end=0;
    aTimer[i].cb=TIMER_Dummy;
  }
}

//用到的函数 半字节读取
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)FA.Content.Buff,sizeof(FA.Content.Buff));

//出现的问题:在主函数中如果先调用TIMER_Init()初始化结构体,
//后 调用STMFLASH_Read读取数据,就会改变aTimer[0]到aTimer[5]的结构体成员初始值
//先后顺序颠倒后就不会出问题

求助各位大神能知道什么原因吗

最佳答案

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

1、使用结构体的首要原则是注意内存对齐原则,一般作配置参数时,强制转换为单字节对,防止单字节操作时出错,同时又节省内存和存储空间;不单字节对齐,所有缓存读写操作都要以该结构体为类型变量; 2、STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)FA.Content.Buff,sizeof(FA.Content.Buff));读缓存强制转为为u16(16位地址操作),sizeof计算的是字节数,明显这个不对(应该"sizeof()/2"); 3、FA.Content.Buff与那个TIMER结构体有 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-8-25 22:12:22 | 显示全部楼层
1、使用结构体的首要原则是注意内存对齐原则,一般作配置参数时,强制转换为单字节对,防止单字节操作时出错,同时又节省内存和存储空间;不单字节对齐,所有缓存读写操作都要以该结构体为类型变量;
2、STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)FA.Content.Buff,sizeof(FA.Content.Buff));读缓存强制转为为u16(16位地址操作),sizeof计算的是字节数,明显这个不对(应该"sizeof()/2");
3、FA.Content.Buff与那个TIMER结构体有无交涉?
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-8-25 23:12:24 | 显示全部楼层
你用结构体保存的,你就结构体的方式读取出来.哪能有错呢.
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-8-26
在线时间
7 小时
发表于 2017-8-26 15:08:47 | 显示全部楼层
Acuity 发表于 2017-8-25 22:12
1、使用结构体的首要原则是注意内存对齐原则,一般作配置参数时,强制转换为单字节对,防止单字节操作时出 ...

昨天发帖的账号登不了了,今天又注册了个,我描述的不够清楚,还请继续指导下啊本人还是小白,STM32研究的时间也不是很长1,结构体这里的单字节对齐没研究过,我还无法确定是不是这里会有问题,
2,FLASH读写的话,如果读和写都这这样sizeof计算,保存和读取的数据没有出现问题,
3,FA.Content.Buff和TIMER结构体是互不相干的
    timer结构体是定义的定时器,最多有50个定时器,TIMER_Init(void)对这50个定时器初始化(不一定会用这么多);
    FA.Content.Buff这里面定义的是几十个数据,从FLASH读取的时候通过这个Buff接收,写的时候直接写整个Buff
程序进入主函数后,先对硬件进行初始化,硬件准备好后就开始初始化定时器,接着开始从FLSAH里面读取数据,然后
直接跑这里了void HardFault_Handler(void);
     编译环境是IAR7.3,编译没有警告没有错误,下载运行时才出错,注意:原工程是IAR5.5编译环境下的,IAR5.5环境下编译下载不会出错
      反复的添加断点单步跟踪后发现:程序在出错前,已经初始化过的定时器前几个(aTimer[0]到aTimer[5])的初始值被更改了,
然后对出错前的语句逐条的屏蔽排查,发现STMFLASH_Read()屏蔽后就不会出错,如果先执行FLASH读取,后初始化定时器,也不会出错.
就是想知道这道其实咋回事






回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-8-26
在线时间
7 小时
发表于 2017-8-26 15:13:45 | 显示全部楼层
操作系统 发表于 2017-8-25 23:12
你用结构体保存的,你就结构体的方式读取出来.哪能有错呢.

FLASH保存和读取没有问题,读写的数据也都正确,出现的问题是,在执行FLASH读取时已经初始化的aTimer[]结构体成员的值,enable ringing ...会被更改,更改后的值好像是定值,每次都一样
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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