求助!一读取片内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条回答
Acuity
2019-08-14 05:56
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结构体有无交涉?

一周热门 更多>