реклама на сайте
подробности

 
 
> Переменная по адресу не кратному 4 байт.
maxntf
сообщение Sep 12 2018, 15:29
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008



Всем привет, наткнулся на такой баг - объявил буфер в глобальных переменных.
Передаю его адрес в аргументе функции. И когда обращаюсь в функции к этой переменной через указатель сразу вылетаю в HardFault_Handler.
Пол дня парился, и в конце концов выяснил, что линковщик расположил ее по адресу не кратному 4.
Проверил, действительно если передать в функцию указатель не кратный 4, то при чтении по этому адресу вылетаем в HardFault_Handler.
И теперь не могу добиться, чтоб этот буфер разместился по корректному адресу. Добавляю перед ним или после него новые переменные, адреса смещаются, и у него все равно адрес не корректный.
Что делать?


P.S
Keil V5.23.0.0

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Sep 12 2018, 15:35
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 13 2018, 09:03
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Сергей Борщ @ Sep 12 2018, 18:35) *
2) Показать объявление этого буфера.

+1.
Сначала надо не костылями подпирать, а разобраться, в чём первопричина проблемы.

Цитата(maxntf @ Sep 13 2018, 11:55) *
А у меня получилось, что буфер char - выравнивание у него по одному байту (без атрибута, начинаться может с любого адреса), а в качестве аргумента функции я передаю указатель на этот буфер с приведением типа до uint32.

Это ужасно. Костыль в виде aligned вылечит, но ужас никуда не денется.
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 13 2018, 10:17
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 14 2018, 06:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Forger @ Sep 13 2018, 13:17) *
Ну-ну, попробуйте объявить массив для стека какой-нить задачи RTOS, НЕ применив к нему обязательный "костыль" aligned. ...

Скажем, lwip делает это легко и непринуждённо. Нужно выравнивать по 4 байта? Прибавь к размеру массива 3 байта, а указатель отрихтуй до ровного.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 12:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016