Atmelstudio UC3C AVR32 - каркасные объекты в неправильном месте в памяти?

Во время настройки передачи CAN указатель поврежден (он переходит от действительного 0x00000bd0 к 0x84520000, который находится за пределами моей оперативной памяти). Указатель также не связан с активностью CAN. Причиной повреждения является то, что union64 записывается поверх адреса указателя. Этот union64 принадлежит объекту CANIF (из ASF), в исходном коде повреждение происходит здесь:

void CAN_SendMsg_KMS(uint64_t msg)
{
    CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg;
    AVR32_CANIF.channel[ACTIVECHANNEL].mober = 1<<0;
}

У меня вопрос, почему память для "данных" выделяется по тому же адресу, что и мой указатель? Или это неправильный вывод?

На следующих снимках экрана первый - непосредственно перед выполнением функции, последний - сразу после выполнения. Содержимое "сообщения" 0x8452000000000000. Поврежденное содержимое указателя A должно быть 0x00000bd0, как это было до повреждения. 32-битное целое число после указателя A является указателем B, указатель B указывает на указатель A, поэтому его нетронутое содержимое составляет 0x00000004 (как видно на снимке экрана).

Память до порчи

Память после порчи

Я не знаю, является ли это полезной информацией: согласно Datasheet, регистры CANIF находятся по адресу памяти 0xFFFD1C00.

обновление: это код уровня сборки, который портит указатель:

// CANIF_mob_get_ptr_data (ACTIVECHANNEL, 0) -> data = (Union64) msg;

80006AC8  mov R8, -189440        
80006ACC  ld.w R9, R8[8]         
80006ACE  st.d R9[8], R5

1 ответ

В соответствии:

CANIF_mob_get_ptr_data(ACTIVECHANNEL,0)->data = (Union64)msg;

CANIF_mob_get_ptr_data является макросом, дающим структурный указатель, определенный в соответствии с документацией как:

#define CANIF_mob_get_ptr_data( ch, mob ) ((can_msg_t *)(CANIF_SIZE_OF_CANIF_MSG*mob+CANIF_get_ram_add(ch)))

В свою очередь макрос CANIF_get_ram_add макрос, возвращающий адрес, содержащийся в регистре интерфейса CAN CANRAMB:

#define CANIF_get_ram_add(ch) ( AVR32_CANIF.channel[ch].canramb )

Так что если AVR32_CANIF_CANRAMB ранее не инициализирован или неправильно инициализирован, указатель, возвращаемый CANIF_mob_get_ptr_data не будет действительным, и последующее назначение завершится ошибкой.

Даже если разрешенный адрес недействителен, типичный эффект такого доступа при отсутствии какой-либо защиты аппаратной памяти состоит в том, чтобы "обернуть" адрес таким образом, чтобы он преобразовывался в недетерминированный реальный адрес, что приводит к повреждению несвязанной памяти.

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