|
STM32L0 HardFault: заморочки с выравниванием |
|
|
|
Feb 1 2017, 11:17
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 1 2017, 13:11)  Я руками (головой) размещаю переменные в структуре так, чтобы стояли ровно.  Если есть дыры, забиваю их uint8_t RESERVED_n. А саму структуру линкер знает, куда разместить. Без указаний. Очевидно Вы не работали никогда например с протоколами передачи данных. В кадрах которых данные находятся упакованными. И объявлять такие кадры удобно структурами. Поэтому Вам и сложно представить такое применение. И дырок в таких кадрах нет - ну не заложили их разработчики этого протокола!
|
|
|
|
|
Feb 1 2017, 11:57
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Feb 1 2017, 12:14
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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} на байты. Убедили!  беру __packed.
|
|
|
|
|
Feb 1 2017, 12:36
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(jcxz @ Feb 1 2017, 15:11)  А если работа идёт через члены пакованных структур, то код вообще менять не нужно - компилятор сам знает, что на данном CPU можно не разбирать {u32 x = y} на байты. Как минимум для DS5 это несколько сложнее и требует внимания программиста. Для упакованной структуры нет предположений о том что её начало выравнено, поэтому такая оптимизация не произойдет в общем случае. Всегда будет рассматриваться худший случай невыравненного размещения. А невыравненный доступ на абсолютном большинстве архитектур дороже выравненного, поэтому если есть возможность привести данные в выравненное состояние то этим стоит воспользоваться.
|
|
|
|
|
Feb 1 2017, 13:05
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
Feb 1 2017, 13:10
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата выра́внивать
Глагол, несовершенный вид, переходный, тип спряжения по классификации А. Зализняка — 1a. Соответствующий глагол совершенного вида — выровнять.
Приставка: вы-; корень: -равн-; суффикс: -ива; глагольное окончание: -ть [Тихонов, 1996].  Цитата(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 см. выделенное жирным Последние два поста (начиная с этого) они конечно очень к тебе относятся.
|
|
|
|
|
Feb 1 2017, 15:56
|
Гуру
     
Группа: Свой
Сообщений: 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; }
|
|
|
|
|
Feb 1 2017, 16:17
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата Внутренний перфекционист негодует...  Так похоже поводов нет: если предположить, что реализация (в IAR) __aeabi_uread4 аналогична __aeabi_memcpy, то оба варианта идентичны по затратам.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|