|
STM32L0 HardFault: заморочки с выравниванием |
|
|
|
 |
Ответов
|
Feb 1 2017, 10:34
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ViKo @ Feb 1 2017, 13:29)  И все это ради того, чтобы не дать указание компилятору-линкеру разместить переменную в правильном месте.  Нет. Это для того чтобы из принятого буфера прочесть переменную с произвольным смещением в этом буфере. Такой вариант никто не предлагал: Код uint32_t __packed* p = &buff[33]; uint32_t x = *p; Около года назад в gcc эта шляпа не сработала, а в кейле работала.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Feb 1 2017, 10:46
|

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

|
Цитата(demiurg_spb @ Feb 1 2017, 13:34)  Нет. Это для того чтобы из принятого буфера прочесть переменную с произвольным смещением в этом буфере. Для M0 здесь нет решения, кроме как читать по байтам. Цитата Такой вариант никто не предлагал: Код uint32_t __packed* p = &buff[33]; uint32_t x = *p; Около года назад в gcc эта шляпа не сработала, а в кейле работала. Поясните. Выше интересовался таким же вопросом. Указатель на упакованную структуру - как это помогает обратиться к слову по не выровненному адресу? Ясно. Читает по байтам.
|
|
|
|
|
Feb 1 2017, 10:53
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 1 2017, 12:46)  Для M0 здесь нет решения, кроме как читать по байтам. ... Ясно. Читает по байтам. А Вы что хотели - некую чудесную инструкцию процессора? M0 физически не умеет невыровненный доступ - нет таких инструкций у него! Так что такой доступ можно только эмулировать. Либо встроенными возможностями компилятора (__packed) либо реализовав это самостоятельно (свой класс с перегрузками, например). PS: Более того - даже для ядра M4 (и прочих) если переменная находится (или может находиться) по невыровненному адресу, для неё надо указывать спецификатор __packed. А то, что у ТС "В STM32F4 камне тот же самый код работает нормально" - о говорит только о кривости написания этого кода, который сейчас работает, завтра перекомпилят его на другом компиляторе (или новой версии того же компилятора) - он будет падать в тот же HF на том же самом ядре M4. Так как никто не мешает компилятору для обращения к этим данным использовать не инструкции LDR/STR, а например LDRD/STRD или LDM/STM, которые не умеют невыровненный доступ. И компилятор имеет право это сделать, например при оптимизации. Так что надо взять за правило: на любом процессоре, если переменная невыровнена, она должна быть объявлена как невыровненная.
|
|
|
|
|
Feb 1 2017, 11:17
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Feb 1 2017, 13:11)  Я руками (головой) размещаю переменные в структуре так, чтобы стояли ровно.  Если есть дыры, забиваю их uint8_t RESERVED_n. А саму структуру линкер знает, куда разместить. Без указаний. Очевидно Вы не работали никогда например с протоколами передачи данных. В кадрах которых данные находятся упакованными. И объявлять такие кадры удобно структурами. Поэтому Вам и сложно представить такое применение. И дырок в таких кадрах нет - ну не заложили их разработчики этого протокола!
|
|
|
|
Сообщений в этой теме
k000858 STM32L0 HardFault: заморочки с выравниванием Jan 31 2017, 12:19 Сергей Борщ QUOTE (k000858 @ Jan 31 2017, 14:19) Поче... Jan 31 2017, 12:21 k000858 Цитата(Сергей Борщ @ Jan 31 2017, 15:21) ... Jan 31 2017, 12:27  Сергей Борщ QUOTE (k000858 @ Jan 31 2017, 14:27) можн... Jan 31 2017, 13:11 adnega Нужно гарантировать, что uint32_t* указывает на пе... Jan 31 2017, 12:35 k000858 Цитата(adnega @ Jan 31 2017, 15:35) Нужно... Feb 1 2017, 04:04  jcxz Цитата(k000858 @ Feb 1 2017, 06:04) но чу... Feb 1 2017, 09:26 Alechek Код#pragma pack(push, 1)
struct _input {
... Feb 1 2017, 05:06 k000858 Цитата(Alechek @ Feb 1 2017, 08:06) Код#p... Feb 1 2017, 05:52  ViKo Цитата(k000858 @ Feb 1 2017, 08:52) да, с... Feb 1 2017, 06:54 Kabdim ... или более каноничный через memcpy.
Кодuint32_t... Feb 1 2017, 07:08 k000858 Цитата(Kabdim @ Feb 1 2017, 10:08) ... ил... Feb 1 2017, 07:31 scifi Цитата(Kabdim @ Feb 1 2017, 10:08) ... ил... Feb 1 2017, 09:25  Kabdim Цитата(scifi @ Feb 1 2017, 12:25) Если уж... Feb 1 2017, 09:38 ViKo Допустим, memcpy умеет правильно обращаться по не... Feb 1 2017, 07:44 Kabdim Почему ж она выровненная? Там прагма спереди и в к... Feb 1 2017, 07:58 ViKo Разве не достаточно создать union для обращения к ... Feb 1 2017, 09:35 jcxz Цитата(ViKo @ Feb 1 2017, 11:35) Разве не... Feb 1 2017, 09:39 ViKo Красиво - это когда просто. Перегрузка операторо... Feb 1 2017, 09:49 jcxz Цитата(ViKo @ Feb 1 2017, 11:49) Красиво ... Feb 1 2017, 09:54  ViKo Цитата(jcxz @ Feb 1 2017, 12:54) Чем имен... Feb 1 2017, 10:02   jcxz Цитата(ViKo @ Feb 1 2017, 12:02) Покажите... Feb 1 2017, 10:22 k000858 Цитата(ViKo @ Feb 1 2017, 13:29) И все эт... Feb 1 2017, 10:32  jcxz Цитата(demiurg_spb @ Feb 1 2017, 12:34) О... Feb 1 2017, 10:44   demiurg_spb Цитата(jcxz @ Feb 1 2017, 13:44) __packed... Feb 1 2017, 10:51      ViKo Цитата(jcxz @ Feb 1 2017, 14:17) Очевидно... Feb 1 2017, 11:22       scifi Цитата(ViKo @ Feb 1 2017, 14:22) Очевидно... Feb 1 2017, 11:32       adnega Цитата(ViKo @ Feb 1 2017, 14:22) Очевидно... Feb 1 2017, 11:57       jcxz Цитата(ViKo @ Feb 1 2017, 13:22) Очевидно... Feb 1 2017, 12:11        Kabdim Цитата(jcxz @ Feb 1 2017, 15:11) А если р... Feb 1 2017, 12:36         jcxz Цитата(Kabdim @ Feb 1 2017, 14:36) А невы... Feb 1 2017, 13:00          Kabdim Я там видимо опечатался "к теме" имел ... Feb 1 2017, 13:54           Axel ЦитатаВнутренний перфекционист негодует...
Так п... Feb 1 2017, 16:17 ViKo Легким движением руки структура превращается... пр... Feb 1 2017, 12:14 adnega Цитата(ViKo @ Feb 1 2017, 15:14) Легким д... Feb 1 2017, 15:56 ViKo ВЫРОВНЯТЬ, -яю, -яешь; св. (нсв. также ровнять). к... Feb 1 2017, 13:05 Kabdim Цитатавыра́внивать
Глагол, несовершенный вид... Feb 1 2017, 13:10 ViKo Цитата(Kabdim @ Feb 1 2017, 16:10) Послед... Feb 1 2017, 13:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|