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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> STM32L0 HardFault: заморочки с выравниванием
jcxz
сообщение Feb 1 2017, 11:17
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Feb 1 2017, 13:11) *
Я руками (головой) размещаю переменные в структуре так, чтобы стояли ровно. biggrin.gif Если есть дыры, забиваю их uint8_t RESERVED_n. А саму структуру линкер знает, куда разместить. Без указаний.

Очевидно Вы не работали никогда например с протоколами передачи данных. В кадрах которых данные находятся упакованными. И объявлять такие кадры удобно структурами.
Поэтому Вам и сложно представить такое применение.
И дырок в таких кадрах нет - ну не заложили их разработчики этого протокола!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2017, 11:22
Сообщение #32


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Feb 1 2017, 14:17) *
Очевидно Вы не работали никогда например с протоколами передачи данных. В кадрах которых данные находятся упакованными. И объявлять такие кадры удобно структурами.
Поэтому Вам и сложно представить такое применение.
И дырок в таких кадрах нет - ну не заложили их разработчики этого протокола!

Очевидно, что с таким пакетом работал бы по байтам. Ибо все "красивые решения" в конечном итоге так и работают. Под маской продвинутости прячут простоту.
Go to the top of the page
 
+Quote Post
scifi
сообщение Feb 1 2017, 11:32
Сообщение #33


Гуру
******

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



Цитата(ViKo @ Feb 1 2017, 14:22) *
Очевидно, что с таким пакетом работал бы по байтам. Ибо все "красивые решения" в конечном итоге так и работают. Под маской продвинутости прячут простоту.

Это называется "сериализация и десериализация". Это кошерно, халяльно и по феншую, народ одобряет. Там ещё индейцы большие и малые.
Но, к примеру, в lwip сделано через структуры. Это действительно удобнее.
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 1 2017, 11:57
Сообщение #34


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(ViKo @ Feb 1 2017, 14:22) *
Очевидно, что с таким пакетом работал бы по байтам.

А в следующей версии добавят байтик в середину и все смещения нужно будет выискивать по-новой.
Или некоторые переменные станут невыровненными и т.п.

В gcc объявляю так:
Код
typedef struct sPACKET_RT_SET_TIME
{
    BYTE    cmd;
    BYTE    cid;
    DWORD    datetime;
} __attribute((packed)) sPACKET_RT_SET_TIME;

А все остальное - дело компилятора.
Правда, есть еще пара ключиков, относящихся к теме
Цитата
-fpack-struct -Wpadded
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 1 2017, 12:11
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ViKo @ Feb 1 2017, 13:22) *
Очевидно, что с таким пакетом работал бы по байтам. Ибо все "красивые решения" в конечном итоге так и работают. Под маской продвинутости прячут простоту.

А завтра переносим Вашу реализацию на процессор, умеющий работать с невыровненными данными и получаем неэффективность из-за кучи лишней возни с байтовым доступом и склеиванием этих байт в слова хотя на данном CPU это не нужно. И всё придётся переписывать.
А если работа идёт через члены пакованных структур, то код вообще менять не нужно - компилятор сам знает, что на данном CPU можно не разбирать {u32 x = y} на байты.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2017, 12:14
Сообщение #36


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Легким движением руки структура превращается... превращается...
Код
typedef struct sPACKET_RT_SET_TIME
{
    DWORD    datetime;
    BYTE    cmd;
    BYTE    cid;
}


Цитата(jcxz @ Feb 1 2017, 15:11) *
А если работа идёт через члены пакованных структур, то код вообще менять не нужно - компилятор сам знает, что на данном CPU можно не разбирать {u32 x = y} на байты.

Убедили! biggrin.gif беру __packed.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 1 2017, 12:36
Сообщение #37


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(jcxz @ Feb 1 2017, 15:11) *
А если работа идёт через члены пакованных структур, то код вообще менять не нужно - компилятор сам знает, что на данном CPU можно не разбирать {u32 x = y} на байты.

Как минимум для DS5 это несколько сложнее и требует внимания программиста. Для упакованной структуры нет предположений о том что её начало выравнено, поэтому такая оптимизация не произойдет в общем случае. Всегда будет рассматриваться худший случай невыравненного размещения. А невыравненный доступ на абсолютном большинстве архитектур дороже выравненного, поэтому если есть возможность привести данные в выравненное состояние то этим стоит воспользоваться.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 1 2017, 13:00
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Kabdim @ Feb 1 2017, 14:36) *
А невыравненный доступ на абсолютном большинстве архитектур дороже выравненного, поэтому если есть возможность привести данные в выравненное состояние то этим стоит воспользоваться.

Ну так на M3/M4 код генерируемый компилятором от этого не меняется. Меняется только время доступа к таким данным. Работать будет всё равно пусть медленнее немного.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2017, 13:05
Сообщение #39


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



ВЫРОВНЯТЬ, -яю, -яешь; св. (нсв. также ровнять). кого-что. 1. Сделать ровным, прямым без изгибов. В. поверхность. В. дорогу. В. шеренгу, строй. 2. что. Расположить, направить по прямой линии в вертикальной или горизонтальной плоскости. В. самолёт. 3. Сделать размеренным, равномерным. В. дыхание. В. шаг.
<Выравнивать, -аю, -аешь; нсв. Выравниваться, -ается; страд. Выравнивание (см.).
http://www.gramota.ru/slovari/dic/?lop=x&a...%8F%D1%82%D1%8C
Прикрепленное изображение

выравнять(ся), -яю(сь), -яет(ся) (к равный)
http://www.gramota.ru/slovari/dic/?word=%D...D1%8C&all=x
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 1 2017, 13:10
Сообщение #40


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата
выра́внивать

Глагол, несовершенный вид, переходный, тип спряжения по классификации А. Зализняка — 1a. Соответствующий глагол совершенного вида — выровнять.

Приставка: вы-; корень: -равн-; суффикс: -ива; глагольное окончание: -ть [Тихонов, 1996].

rolleyes.gif

Цитата(ViKo @ Feb 1 2017, 16:05) *
ВЫРОВНЯТЬ, -яю, -яешь; св. (нсв. также ровнять). кого-что. 1. Сделать ровным, прямым без изгибов. В. поверхность. В. дорогу. В. шеренгу, строй. 2. что. Расположить, направить по прямой линии в вертикальной или горизонтальной плоскости. В. самолёт. 3. Сделать размеренным, равномерным. В. дыхание. В. шаг.
<Выравнивать, -аю, -аешь; нсв. Выравниваться, -ается; страд. Выравнивание (см.).
Прикрепленное изображение
http://www.gramota.ru/slovari/dic/?lop=x&a...%8F%D1%82%D1%8C
выравнять(ся), -яю(сь), -яет(ся) (к равный)
http://www.gramota.ru/slovari/dic/?word=%D...D1%8C&all=x
Прикрепленное изображение

см. выделенное жирным rolleyes.gif
Последние два поста (начиная с этого) они конечно очень к тебе относятся.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2017, 13:18
Сообщение #41


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Kabdim @ Feb 1 2017, 16:10) *
Последние два поста (начиная с этого) они конечно очень к тебе относятся.

Со вчерашнего дня думал, как писать. laughing.gif Пропустишь раз, потом наверстывай.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 1 2017, 13:54
Сообщение #42


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Я там видимо опечатался blush.gif "к теме" имел ввиду.
Цитата(jcxz @ Feb 1 2017, 16:00) *
Ну так на M3/M4 код генерируемый компилятором от этого не меняется. Меняется только время доступа к таким данным. Работать будет всё равно пусть медленнее немного.

Внутренний перфекционист негодует когда работает медленней, наверное его пора топить. sm.gif
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 1 2017, 15:56
Сообщение #43


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(ViKo @ Feb 1 2017, 15:14) *
Легким движением руки структура превращается... превращается...
Код
typedef struct sPACKET_RT_SET_TIME
{
    DWORD    datetime;
    BYTE    cmd;
    BYTE    cid;
}

Я при разработке протоколов стараюсь выравнивать данные, но не всегда есть такая возможность.
В данном случае менять порядок нельзя, т.к. первые два байта нужны для адресации контроллера
и указания номера команды, а уже за ними следуют различные данные.
Я бы проголосавал за такой вариант, будь моя воля.
Код
typedef struct sPACKET_RT_SET_TIME
{
    BYTE    cmd;
    BYTE    cid;
    WORD    none;
    DWORD    datetime;
}

Go to the top of the page
 
+Quote Post
Axel
сообщение Feb 1 2017, 16:17
Сообщение #44


Местный
***

Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188



Цитата
Внутренний перфекционист негодует... sm.gif

Так похоже поводов нет: если предположить, что реализация (в IAR) __aeabi_uread4 аналогична __aeabi_memcpy, то оба варианта идентичны по затратам.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 13th August 2025 - 14:21
Рейтинг@Mail.ru


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