Как правильно читать данные из памяти (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]);
}

Но это исправляет симптом, а не болезнь. Реальное исправление состоит в том, чтобы исправить таблицу во флеш-памяти, если у вас есть контроль над ней.

Другие вопросы по тегам