【发布时间】:2014-02-03 15:45:01
【问题描述】:
我有一个 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;
}
【问题讨论】:
-
也显示你的写功能。 BTW:你的平台有
uint64_t吗? -
您系统的小端还是大端?或许你可以先看看this
-
@chux:是的,它有 uint64_t。
-
是不是因为地址是 32 位而 (double *) 期望是 64 位?,你的系统是 32 位的,你所有的内存寻址都是在 32 位中完成的
-
我会使用
union { double d; uint32_t uint[2] }进行分解和重建。
标签: c pointers types type-conversion cortex-m3