C 从32位地址闪存中读取双精度

C 从32位地址闪存中读取双精度,c,pointers,types,type-conversion,cortex-m3,C,Pointers,Types,Type Conversion,Cortex M3,我有一个32位微控制器,刚刚在闪存中写入了一个双精度。我现在想从内存中读取双回传,但我正在做一些非法的事情,因为微控制器进入硬故障处理程序 首先,我尝试: double Flash_Read64(uint32_t address) { return *((double *) address); } 但这并不奏效。是因为地址是32位,而(双*)需要64位吗 然后我试着: double Flash_Read64(uint32_t address) { uint64_t temp;

我有一个32位微控制器,刚刚在闪存中写入了一个双精度。我现在想从内存中读取双回传,但我正在做一些非法的事情,因为微控制器进入硬故障处理程序

首先,我尝试:

double Flash_Read64(uint32_t address)
{
    return *((double *) address);
}

但这并不奏效。是因为地址是32位,而(双*)需要64位吗

然后我试着:

double Flash_Read64(uint32_t address)
{
    uint64_t temp;
    double * tempPtr = (double *) &temp;

    //Increment address.
    address += 4;

    //Get MSB.
    temp = (*((uint32_t *) (address)));

    //Shift MSB to upper half.
    temp = (temp << 32);

    //Decrement address.
    address -= 4;

    //Get LSB.
    temp |= (*((uint32_t *) address));

    return *tempPtr;
}

简化和避免对齐问题(我认为正是对齐问题导致了悲伤。)

会导致总线故障。如果这是真的,则上述代码应处理此问题。

或者,代码可以确保
地址
具有
8字节对齐方式

也显示您的写入功能。顺便问一下:您的平台是否有
uint64\t
?系统的小端或大端?也许你可以先看看@chux:是的,它有uint64_t。这是因为地址是32位的,(双*)期望64位吗?你的系统是32位的,所有的内存寻址都是32位的。我会使用一个
联合体{double d;uint32_t uint[2]}
用于分解和重建。感谢您指出内存对齐问题。情况就是这样。从(地址%2)==0的内存位置写入/读取double时,它可以工作!文档还说,内存是以16位的形式访问的,因此这是有意义的。谢谢你,傻瓜!
bool_t Flash_Write64Address(uint32_t address, double data)
{
    uint32_t MSB, LSB;
    uint32_t * tempPtr = (uint32_t *) &data;

    //Get LSB.
    LSB = tempPtr[0];

    //Write LSB to flash.
    flashStatus = FLASH_ProgramWord(address, LSB);
    if(flashStatus != FLASH_COMPLETE)
    {
        DEBUG("Failed to write to flash at address: %u", (unsigned int) address);
        return FALSE;
    }

    //Increment address.
    address += 4;

    //Get MSB.
    MSB =  tempPtr[1];

    //Write MSB to flash.
    flashStatus = FLASH_ProgramWord(address, MSB);
    if(flashStatus != FLASH_COMPLETE)
    {
        DEBUG("Failed to write to flash at address: %u", (unsigned int) address);
        return FALSE;
    }

    return TRUE;
}
typedef union {
  double d;
  uint32_t u[2];
} Xlate;

bool_t Flash_Write64Address(uint32_t address, double data) {
   Xlate x;
   x.d = data;
   for (int i=0; i < 2; i++) {
     int flashStatus = FLASH_ProgramWord(address, x.u[i]);
     address += 4;
     if(flashStatus != FLASH_COMPLETE) {
        return FALSE;
     }
   return TRUE;
   }

double Flash_Read64(uint32_t address) {
  Xlate x;
  x.u[0] = *((uint32_t *) address);
  x.u[1] = *((uint32_t *) (address + 4));
  return x.d;
}
return *((double *) address);
// or 
return *tempPtr;