charkin 0 28 сентября, 2019 Опубликовано 28 сентября, 2019 · Жалоба Всем привет. Проц STM32H743, периодически происходит падение в HardFault, сообщение в окне Fault exception viewer - An unaligned access error has occurred. Строка, на которой происходит ошибка - memcpy((uint8_t*)&exch_main_receive_pack+DATA_P_HEAD_SIZE,(void*)(SRAM_BANK_ADDR + DATA_P_HEAD_SIZE),size-DATA_P_HEAD_SIZE); Тип exch_main_receive_pack - структура, объявлена с директивой #pragma pack(push,1). Подскажите пожалуйста, как решить проблему (или где почитать на эту тему). Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 сентября, 2019 Опубликовано 28 сентября, 2019 · Жалоба 18 minutes ago, charkin said: Строка, на которой происходит ошибка Ну а дизассемблер посмотреть, во что тот memcpy превратился на деле? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 31 28 сентября, 2019 Опубликовано 28 сентября, 2019 · Жалоба Мне тут как-то (void *) глаз режет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 28 сентября, 2019 Опубликовано 28 сентября, 2019 (изменено) · Жалоба 5 hours ago, aaarrr said: Ну а дизассемблер посмотреть, во что тот memcpy превратился на деле? Окно Дизассемблера : Изменено 28 сентября, 2019 пользователем charkin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 28 сентября, 2019 Опубликовано 28 сентября, 2019 · Жалоба Попробуйте сопоставить адреса в левой и правой части картинки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба Вы про адрес вы окне Fault exception (0x80033ca) и адрес, на котором стоит желтая стрелка? Они разные, но что это значит? Если не сложно, объясните, пожалуйста, поподробнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба 42 минуты назад, charkin сказал: Вы про адрес вы окне Fault exception (0x80033ca) и адрес, на котором стоит желтая стрелка? Они разные, но что это значит? Они значат: "С чего Вы решили что fault случается в memcpy()"? И ваше "окно дизассемблера" не имеет никакого отношения к адресу fault-а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба Ну это вроде как последняя выполнявшаяся команда? В окне Call Stack после нее стоит Exception.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба 33 минуты назад, charkin сказал: Ну это вроде как последняя выполнявшаяся команда? В окне Call Stack после нее стоит Exception.. А содержимое окна с регистрами Вы предлагаете нам угадать? Вангую невыровненный адрес в SP. Либо прямой вызов __aeabi_memcpy4()/__aeabi_memcpy8() с невыровненным исходным (R1) или целевым (R0) адресом. Из-за этого и fault. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба 19 hours ago, charkin said: . . . Тип exch_main_receive_pack - структура, объявлена с директивой #pragma pack(push,1). Проверьте что оно еще и выключается. Организуйте 2 static переменных-указателя char* (потомукак pack-1), и им присвойте значения адресов, которые идут в memcpy. Отладчиком (до вызова memcpy) проверьте, что они инициализированы правильно. Опятьже отладчиком в окне Memory посмотрите дамп "откуда" и "куда". У memcpy может быть несколько вариантов исполнения (смотря что копируем), в зависимости от типов. Может действительно, как выше замечали VladislavS , void * сбивает компилятор. Warning надо покурить, если есть (а они обычно, есть). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба 1 hour ago, jcxz said: А содержимое окна с регистрами Вы предлагаете нам угадать? Вангую невыровненный адрес в SP. Либо прямой вызов __aeabi_memcpy4()/__aeabi_memcpy8() с невыровненным исходным (R1) или целевым (R0) адресом. Из-за этого и fault. 41 minutes ago, k155la3 said: Проверьте что оно еще и выключается. Выключается - #pragma pack (pop). Ворнингов нет. За идею с указателями и отладчиком спасибо - попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба Вот еще : Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 199 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба 31 минуту назад, charkin сказал: Вот еще : В значениях регистров криминала вроде нет. Разве что 0x64000088 - это адрес чего? Уверены что по этому адресу позволен 32-битный доступ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
charkin 0 29 сентября, 2019 Опубликовано 29 сентября, 2019 · Жалоба 2 minutes ago, jcxz said: В значениях регистров криминала вроде нет. Разве что 0x64000088 - это адрес чего? Уверены что по этому адресу позволен 32-битный доступ? Вот тут - memcpy((uint8_t*)&exch_main_receive_pack+DATA_P_HEAD_SIZE,(uint32_t*)(SRAM_BANK_ADDR + DATA_P_HEAD_SIZE),size-DATA_P_HEAD_SIZE); - копируется 512 байт, SRAM_BANK_ADDR - адрес на шине FMC (#define SRAM_BANK_ADDR ((uint32_t)0x64000000)). DATA_P_HEAD_SIZE - 24 байта : #pragma pack(push,1) typedef struct { uint8_t p_type; uint8_t cmd; uint16_t len; uint32_t addr; //N_sector uint32_t req_cntr; uint32_t len_req; uint32_t len_ans; uint32_t offset; // uint16_t len_part; uint8_t data[BLOCK_SIZE]; }data_packet_t; #pragma pack (pop) #define DATA_P_SIZE sizeof(data_packet_t) #define DATA_P_HEAD_SIZE (DATA_P_SIZE-BLOCK_SIZE) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться