У меня есть 32-разрядный микроконтроллер и только что записал двойной флеш-память. Теперь я хочу прочитать двойную память из памяти, но я делаю что-то незаконное, так как микроконтроллер идет на жесткий обработчик ошибок.Прочтите двойной файл с 32-разрядной флеш-памятью
Сначала я попробовал:
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;
}
, но до сих пор не работает.
Любые предложения?
EDIT: (., Который я думаю, что это проблема выравнивания, которая вызывает печаль)
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'? – chux
Маленький Endian или Big Endian вашей системы? Возможно, вы можете сначала взглянуть на [это] (http://stackoverflow.com/questions/20451688/c-serialize-double-to-binary-file-in-little-endian) –
@chux: Да, он имеет uint64_t , – Phat