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

 
 
> STM32L0 HardFault: заморочки с выравниванием
k000858
сообщение Jan 31 2017, 12:19
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978



Есть какие то ограничения в ядре, приводящие к HardFault?

Пришлось в одной функции привести указатель типа uint8_t* к типу uint32_t* изза чего получил HardFault.

В STM32F4 камне тот же самый код работает нормально.
Почему же M0+ вылетает в HardFault?

Сообщение отредактировал k000858 - Feb 1 2017, 03:59
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Feb 1 2017, 10:29
Сообщение #2


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

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



И все это ради того, чтобы не дать указание компилятору-линкеру разместить переменную в правильном месте. laughing.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 1 2017, 10:34
Сообщение #3


неотягощённый злом
******

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



Цитата(ViKo @ Feb 1 2017, 13:29) *
И все это ради того, чтобы не дать указание компилятору-линкеру разместить переменную в правильном месте. laughing.gif

Нет. Это для того чтобы из принятого буфера прочесть переменную с произвольным смещением в этом буфере.
Такой вариант никто не предлагал:
Код
uint32_t __packed* p = &buff[33];
uint32_t x = *p;

Около года назад в gcc эта шляпа не сработала, а в кейле работала.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2017, 10:46
Сообщение #4


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

Группа: Модераторы
Сообщений: 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 эта шляпа не сработала, а в кейле работала.

Поясните. Выше интересовался таким же вопросом. Указатель на упакованную структуру - как это помогает обратиться к слову по не выровненному адресу?
Ясно. Читает по байтам.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 1 2017, 10:53
Сообщение #5


Гуру
******

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



Цитата(ViKo @ Feb 1 2017, 12:46) *
Для M0 здесь нет решения, кроме как читать по байтам.
...
Ясно. Читает по байтам.

А Вы что хотели - некую чудесную инструкцию процессора? biggrin.gif
M0 физически не умеет невыровненный доступ - нет таких инструкций у него!
Так что такой доступ можно только эмулировать. Либо встроенными возможностями компилятора (__packed) либо реализовав это самостоятельно (свой класс с перегрузками, например).

PS: Более того - даже для ядра M4 (и прочих) если переменная находится (или может находиться) по невыровненному адресу, для неё надо указывать спецификатор __packed.
А то, что у ТС "В STM32F4 камне тот же самый код работает нормально" - о говорит только о кривости написания этого кода, который сейчас работает, завтра перекомпилят его на другом компиляторе (или новой версии того же компилятора) - он будет падать в тот же HF на том же самом ядре M4. Так как никто не мешает компилятору для обращения к этим данным использовать не инструкции LDR/STR, а например LDRD/STRD или LDM/STM, которые не умеют невыровненный доступ. И компилятор имеет право это сделать, например при оптимизации.
Так что надо взять за правило: на любом процессоре, если переменная невыровнена, она должна быть объявлена как невыровненная.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 1 2017, 11:11
Сообщение #6


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

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



Цитата(jcxz @ Feb 1 2017, 13:53) *
А Вы что хотели - некую чудесную инструкцию процессора?

Так что надо взять за правило: на любом процессоре, если переменная невыровнена, она должна быть объявлена как невыровненная.

Я руками (головой) размещаю переменные в структуре так, чтобы стояли ровно. biggrin.gif Если есть дыры, забиваю их uint8_t RESERVED_n. А саму структуру линкер знает, куда разместить. Без указаний.
И компиляторы не пугают, ни прошлые, ни будущие.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Feb 1 2017, 11:17
Сообщение #7


Гуру
******

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

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


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

 


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


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