Перейти к содержанию
    

Unaligned access error has occurred, IAR

Всем привет.

Проц 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).

 

Подскажите пожалуйста, как решить проблему (или где почитать на эту тему). 

Заранее спасибо.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 minutes ago, charkin said:

Строка, на которой происходит ошибка

Ну а дизассемблер посмотреть, во что тот memcpy превратился на деле?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 hours ago, aaarrr said:

 

Ну а дизассемблер посмотреть, во что тот memcpy превратился на деле?

 

Окно Дизассемблера  :

 

2019-09-29_00-12-46.thumb.png.793d9436ba07b0797e6b0c4587ec3c57.png

 

Изменено пользователем charkin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы про адрес вы окне Fault exception (0x80033ca) и адрес, на котором стоит желтая стрелка? Они разные, но что это значит?

Если не сложно, объясните, пожалуйста, поподробнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, charkin сказал:

Вы про адрес вы окне Fault exception (0x80033ca) и адрес, на котором стоит желтая стрелка? Они разные, но что это значит?

Они значат: "С чего Вы решили что fault случается в memcpy()"? И ваше "окно дизассемблера" не имеет никакого отношения к адресу fault-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну это вроде как последняя выполнявшаяся команда? В окне Call Stack после нее стоит Exception..

2019-09-29_12-42-08.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

33 минуты назад, charkin сказал:

Ну это вроде как последняя выполнявшаяся команда? В окне Call Stack после нее стоит Exception..

А содержимое окна с регистрами Вы предлагаете нам угадать?

Вангую невыровненный адрес в SP. Либо прямой вызов __aeabi_memcpy4()/__aeabi_memcpy8() с невыровненным исходным (R1) или целевым (R0) адресом. Из-за этого и fault.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 надо покурить, если есть (а они обычно, есть).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

А содержимое окна с регистрами Вы предлагаете нам угадать?

Вангую невыровненный адрес в SP. Либо прямой вызов __aeabi_memcpy4()/__aeabi_memcpy8() с невыровненным исходным (R1) или целевым (R0) адресом. Из-за этого и fault.

 

2019-09-29_14-53-12.png

41 minutes ago, k155la3 said:

Проверьте что оно еще и выключается.

Выключается - #pragma pack (pop).

Ворнингов нет. За идею с указателями и отладчиком спасибо - попробую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

31 минуту назад, charkin сказал:

Вот еще :

В значениях регистров криминала вроде нет. Разве что 0x64000088 - это адрес чего? Уверены что по этому адресу позволен 32-битный доступ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...