簡體   English   中英

從32位地址閃存中讀取一個double

[英]Read a double from 32-bit address flash memory

我有一個32位微控制器,並且剛剛向閃存中寫入了兩倍。 現在,我想從內存中讀取double,但是當微控制器進入硬故障處理程序時,我在做非法的事情。

首先,我嘗試了:

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

但這沒有用。 是因為地址是32位並且(double *)期望是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;
}

但仍然無法正常工作。

有什么建議么?

編輯:

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;
}

[編輯]
我假設該address表示一個四字節對齊的地址(至少2位為0)。 如果address沒有8-byte alignment (至少3位為0),並且需要double訪問,則

return *((double *) address);
// or 
return *tempPtr;

會導致總線故障。 如果是這樣,則上面的代碼應處理此問題。
或者,代碼可以確保address具有8-byte alignment

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM