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