|
Переменная по адресу не кратному 4 байт. |
|
|
|
Sep 12 2018, 15:29
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Всем привет, наткнулся на такой баг - объявил буфер в глобальных переменных. Передаю его адрес в аргументе функции. И когда обращаюсь в функции к этой переменной через указатель сразу вылетаю в HardFault_Handler. Пол дня парился, и в конце концов выяснил, что линковщик расположил ее по адресу не кратному 4. Проверил, действительно если передать в функцию указатель не кратный 4, то при чтении по этому адресу вылетаем в HardFault_Handler. И теперь не могу добиться, чтоб этот буфер разместился по корректному адресу. Добавляю перед ним или после него новые переменные, адреса смещаются, и у него все равно адрес не корректный. Что делать?  P.S Keil V5.23.0.0
|
|
|
|
|
 |
Ответов
|
Sep 12 2018, 15:35
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (maxntf @ Sep 12 2018, 18:29)  Что делать? 1) Уменьшить картинку, чтобы страница форума не расползалась. 2) Показать объявление этого буфера.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 13 2018, 09:03
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Сергей Борщ @ Sep 12 2018, 18:35)  2) Показать объявление этого буфера. +1. Сначала надо не костылями подпирать, а разобраться, в чём первопричина проблемы. Цитата(maxntf @ Sep 13 2018, 11:55)  А у меня получилось, что буфер char - выравнивание у него по одному байту (без атрибута, начинаться может с любого адреса), а в качестве аргумента функции я передаю указатель на этот буфер с приведением типа до uint32. Это ужасно. Костыль в виде aligned вылечит, но ужас никуда не денется.
|
|
|
|
|
Sep 13 2018, 10:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(scifi @ Sep 13 2018, 12:03)  Костыль в виде aligned вылечит, но ужас никуда не денется. Ну-ну, попробуйте объявить массив для стека какой-нить задачи RTOS, НЕ применив к нему обязательный "костыль" aligned. ... "Ужас" убирается объявлением вместо банальных байтовых массивов с разношерстными данными ("протокольные" дела) объявлением полноценных структур с полями нужных размеров и названий, даже с применением union, где это нужно. Чтобы структура была одинакового размера на любых компиляторах, нужен атрибут packed. Это - норма. После чего в соотв. функцию передается ссылка (&) на структуру (или указатель, если нельзя писать на плюсах). В этом случае правильный доступ к полям структуры станет головной болью компилятора, а не кодера. Вот пример обяявления такой структуры (не самый лучший пример, но тем не менее): Код struct __PACKED Frame { uint8_t start; uint8_t command; uint8_t dataSize; union { uint8_t payload[COMMUNICATION_MAX_FRAME_DATA_SIZE_IN_BYTES]; MasterToSlave masterToSlave; SlaveToMaster slaveToMaster; } data; struct { union { struct { uint8_t low; uint8_t high; }; uint16_t value; }; } crc16; };
// SlaveToMaster и SlaveToMaster - структуры одинакового размера, но с разными полями ps. из-за необходимости применения телепатии к стартовому посту эта тема рискует перейти в очередной холивар :D
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
Сообщений в этой теме
maxntf Переменная по адресу не кратному 4 байт. Sep 12 2018, 15:29 Forger Цитата(maxntf @ Sep 12 2018, 18:29) линко... Sep 12 2018, 15:33 maxntf Цитата(Forger @ Sep 12 2018, 18:33) Сейча... Sep 13 2018, 08:55    Forger Цитата(scifi @ Sep 14 2018, 09:40) Скажем... Sep 14 2018, 07:47 Kabdim Скопировать значение в выравненную переменную с по... Sep 13 2018, 08:10 Forger Цитата(Kabdim @ Sep 13 2018, 11:10) Скопи... Sep 13 2018, 08:21  Kabdim Цитата(Forger @ Sep 13 2018, 11:21) Ваш с... Sep 13 2018, 14:55   Forger Цитата(Kabdim @ Sep 13 2018, 17:55) Пруфо... Sep 13 2018, 15:15    Kabdim Цитата(Forger @ Sep 13 2018, 18:15) Вы пр... Sep 14 2018, 08:56     aaarrr Цитата(Kabdim @ Sep 14 2018, 11:56) Потом... Sep 14 2018, 09:04      Kabdim Цитата(aaarrr @ Sep 14 2018, 12:04) Пруф.... Sep 14 2018, 09:59       Forger Цитата(Kabdim @ Sep 14 2018, 12:59) Ох уж... Sep 14 2018, 10:14       aaarrr Цитата(Kabdim @ Sep 14 2018, 12:59) Ну во... Sep 14 2018, 10:20        Kabdim Цитата(aaarrr @ Sep 14 2018, 13:20) Где ж... Sep 14 2018, 10:27         aaarrr Цитата(Kabdim @ Sep 14 2018, 13:27) Распи... Sep 14 2018, 10:32     Forger Цитата(Kabdim @ Sep 14 2018, 11:56) Не пе... Sep 14 2018, 09:15 ViKo union спасает выравнивание при любых компиляторах. Sep 13 2018, 09:01 Kabdim Цитата(aaarrr @ Sep 14 2018, 13:32) В дан... Sep 14 2018, 11:27 aaarrr Цитата(Kabdim @ Sep 14 2018, 14:27) Нет т... Sep 14 2018, 11:35  Kabdim Цитата(aaarrr @ Sep 14 2018, 14:35) Каким... Sep 14 2018, 11:40   aaarrr Цитата(Kabdim @ Sep 14 2018, 14:40) В дан... Sep 14 2018, 11:51  scifi Цитата(aaarrr @ Sep 14 2018, 14:35) Каким... Sep 14 2018, 12:03   aaarrr Цитата(scifi @ Sep 14 2018, 15:03) Так не... Sep 14 2018, 12:08    scifi Цитата(aaarrr @ Sep 14 2018, 15:08) Пожал... Sep 14 2018, 12:17     aaarrr del - Извиняюсь, кривой пример получился
Нет, все ... Sep 14 2018, 13:00 Kabdim Всё тоже самое нарушено, но на А8 оно по идее рабо... Sep 14 2018, 13:18 aaarrr Цитата(Kabdim @ Sep 14 2018, 16:18) Всё т... Sep 14 2018, 13:23 Kabdim С А8 может выйти гадание на кисиле, сложный чип, м... Sep 14 2018, 13:36 aaarrr Нет, все же плохой пример. Но и за компилятором ес... Sep 14 2018, 13:59 Kabdim И как падает или нет? Sep 14 2018, 14:02 aaarrr Цитата(Kabdim @ Sep 14 2018, 17:02) И как... Sep 14 2018, 15:10 Kabdim Получается вы без линукса А8 готовите? Довольно ре... Sep 16 2018, 09:27 aaarrr Цитата(Kabdim @ Sep 16 2018, 12:27) Получ... Sep 16 2018, 11:03 Kabdim Я бы скорее странным назвал решение АРМ сделавшей ... Sep 16 2018, 13:34 aaarrr Цитата(Kabdim @ Sep 16 2018, 16:34) Я бы ... Sep 16 2018, 13:35 Kabdim Afaik там clang и если много приходится писать без... Sep 16 2018, 13:41 aaarrr Цитата(Kabdim @ Sep 16 2018, 16:41) Afaik... Sep 16 2018, 13:51 Kabdim Они ж его вроде бросили, с 5 что ли версии, если м... Sep 16 2018, 14:01 aaarrr Тут не скажу - это четвертый, а дальше я его судьб... Sep 16 2018, 14:10 Forger Цитата(aaarrr @ Sep 16 2018, 17:10) Жаль,... Sep 16 2018, 14:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|