Как правильно читать данные из памяти (memcpy)
У меня есть несколько таблиц, например, одна объявлена как uint8_t keyLock[16];
и я сохранил содержимое этих таблиц во флэш-памяти моего MCU. В этой памяти это выглядит так:
Address Data
00190008 - BA98B694
0019000C - E854B6E7
00190010 - 9200B2C9
00190014 - 42F8B048
Когда я копирую данные флэш-памяти в свою таблицу через memcpy
функция (memcpy(keyLock, 0x00190008, 32);
) содержимое таблицы завершается, как будто инициализируется таким образом:
keyLock = {
0xBA, 0x98, 0xB6, 0x94, 0xE8, 0x54, 0xB6, 0xE7,
0x92, 0x00, 0xB2, 0xC9, 0x42, 0xF8, 0xB0, 0x48
}
Я хочу, чтобы содержимое было таким, как если бы таблица была инициализирована следующим образом:
keyLock = {
0x94, 0xB6, 0x98, 0xBA, 0xE7, 0xB6, 0x54, 0xE8,
0xC9, 0xB2, 0x00, 0x92, 0x48, 0xB0, 0xF8, 0x42
}
Что не так с моим memcpy()
позвоните, а как мне написать это, чтобы заполнить таблицу нужным контентом, как указано выше?
1 ответ
Когда вы храните 4 байта памяти как 32, но целое число, значение которого BA98B694
какой байт идет первым?
В своем вопросе вы подразумеваете, что BA
байт идет первым, но в вашей системе кажется, что 94
идет первым
Ваш memcpy
все делает правильно. Ваша проблема заключается в ожидании порядка байтов или раскладки вашего стола во флэш-памяти.
Вы можете исправить это, просто меняя порядок каждого 4-байтового меча.
void endian_4byte_swap( uint32_t* bytes ){
std::swap(bytes[0],bytes[3]);
std::swap(bytes[1],bytes[2]);
}
void endian_fix_table( uint32_t (&table)[16] ){
for(int i=0;i<4;++i)
endian_4byte_swap(&table[4*i]);
}
Но это исправляет симптом, а не болезнь. Реальное исправление состоит в том, чтобы исправить таблицу во флеш-памяти, если у вас есть контроль над ней.