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

2019-08-14 05:40发布

//定义的参数
#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]的结构体成员初始值
//先后顺序颠倒后就不会出问题

求助各位大神能知道什么原因吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
长风228
2019-08-14 10:27
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读取,后初始化定时器,也不会出错.就是想知道这道其实咋回事





一周热门 更多>