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

 
 
> Прошу помощи с STM32F051, Периодическое сваливание в HardFault
nanorobot
сообщение Aug 8 2014, 18:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Отлаживаю дивайс на STM32F051. интенсивно используется DMA - все каналы. Периодически (1 раз в 1- 4 часа) происходит HardFault.Ввел обработчик ХардФаулт из Definitive Guide, получил листинг регистров. Не могу полноценно осознать результаты. Судя по содержимому PC, инструкция, вызвавшая HardFault была расположена в RAM. Непонятно. Указатели на функции не использую.
Во вложении кусочек скриншота с регистрами.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Aug 17 2014, 14:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ну типа

Код
char Array[10];
int *p = (int *)&Array[2];
*p = 10; //пипец %)


но при этом к полям пакованной структуры компилятор будет обращаться правильно, понимая что они могут быть не выровнены. Но передав это поле в функцию просто указателем будет опять обломс....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 17 2014, 22:22
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Aug 17 2014, 17:07) *
Но передав это поле в функцию просто указателем будет опять обломс....
Вот тут вы и стреляете себе в ногу - пытясь передать указатель на упакованное поле как обычный указатель. Передавайте его честно, как указатель на упакованные данные - и обломса не будет.


--------------------
На любой вопрос даю любой ответ
"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
KnightIgor
сообщение Aug 18 2014, 07:50
Сообщение #4


Знающий
****

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



Цитата(Сергей Борщ @ Aug 18 2014, 00:22) *
Вот тут вы и стреляете себе в ногу - пытясь передать указатель на упакованное поле как обычный указатель. Передавайте его честно, как указатель на упакованные данные - и обломса не будет.

Как правильно заметил Golikov A., обломс наступает при переносе библиотек.
У меня есть обработчик SVC, код которого базируется на широко цитируемых в сети примерах от ARM. Там, чтобы получить номер SVC из кода инструкции, есть выражение LDRB R0,[R0, #-2], где в R0 загружен сохраненный PC, который, очевидно, указывает на следующую за SVC инструкцию. Так вот, M0 НЕ ДОПУСКАЕТ отрицательные смещения. Хорошо, что ругня идет еще на этапе трансляции... Чтобы код был универсальным, пришлось сделать

SUBS R0, R0, #2
LDRB R0,[R0]

Сообщение отредактировал KnightIgor - Aug 18 2014, 07:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 18 2014, 09:56
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KnightIgor @ Aug 18 2014, 10:50) *
Как правильно заметил Golikov A., обломс наступает при переносе библиотек.
Почему вы упорно валите с больной головы на здоровую? Если библиотека написана правильно, то указатель на упакованные данные будет описан именно как указатель на упакованные данные, без всяких допущений - умеет процессор сам работать с неупакованными данными или нет. Это работа компилятора - он знает целевой процессор лучше нас с вами и если досуп к упакованным данным на целевом процессоре возможен одной командой - он так и сделает. Но если такой доступ невозможен - он сгенерит честный побайтовый доступ. Если же автор библиотеки попытался обмануть компилятор и вместо указателя на упакованные данные подсунул обычный указатель, то виноват в этом писатель библиотеки и более никто. Эта попытка обмануть компилятор и есть выстрел в ногу.

Цитата(KnightIgor @ Aug 18 2014, 10:50) *
У меня есть обработчик SVC, код которого базируется на широко цитируемых в сети примерах от ARM.
То есть вас удивляет, что ассемблерный код для одного ядра не ассемблируется для другого??? А почему вас тогда не удивляет, что код для Пентиума не ассемблируется под 8086? Простите, но это напоминает анекдот:

- У меня на телефоне фотографии нечеткими получаются.
- Да ладно? Прикинь, а у меня с фотоаппарата вообще звонить нельзя!


--------------------
На любой вопрос даю любой ответ
"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
KnightIgor
сообщение Aug 18 2014, 12:31
Сообщение #6


Знающий
****

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



Цитата(Сергей Борщ @ Aug 18 2014, 11:56) *
Почему вы упорно валите с больной головы на здоровую?

Я не валю, тем более упорно. Я подцепил вброс Golikov A. (перенос библиотек), который простекает из двух основных проблем программирования: нельзя видеть будущее (и написать библиотеку на все случаи жизни), и нужно обеспечивать совместимость с предыдущей версией. Это хорошо проснуться десятилетием позже и охватить все варианты мудрым взором. Но Вы ведь помните, что сначала был M3, а лишь много позже ARM замутил M0, который вдруг не понимает отрицательных смещений и невыровненного доступа. И куда податься крестьянину? Ответ: перепахать огород. Я, кстати, совершенно с Вами согласен, что строгое программирование (в обсуждаемом случае __packed) может избавить от косяков. Но только честно: пусть в нас кинет камень тот, чей код соответствует MISRA.

Цитата
То есть вас удивляет, что ассемблерный код для одного ядра не ассемблируется для другого??? А почему вас тогда не удивляет, что код для Пентиума не ассемблируется под 8086? Простите, но это напоминает анекдот:
- У меня на телефоне фотографии нечеткими получаются.
- Да ладно? Прикинь, а у меня с фотоаппарата вообще звонить нельзя!

По поводу 8086 и Пентиума - я изложил в первом абзаце. Если пофилосовствовать же, то меня ничто не удивляет в мире диалектики. Ясно одно: чтобы понять настоящее, надо знать предысторию. Правда, один немецкий филосов сказал, что главный урок состоит истории в том, что никто не извлекает из нее уроков. Кстати, Ваш анекдот в части телефона никто бы не понял еще лет 20 назад. На Ваш анекдот отвечу другим:
- Почему Богу удалось создать мир всего да 6 дней?
- Не нужно было обеспечивать совместимость с предыдущей версией.
Go to the top of the page
 
+Quote Post
LightElf
сообщение Aug 18 2014, 13:13
Сообщение #7


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

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (KnightIgor @ Aug 18 2014, 16:31) *
Я не валю, тем более упорно. Я подцепил вброс Golikov A. (перенос библиотек), который простекает из двух основных проблем программирования: нельзя видеть будущее (и написать библиотеку на все случаи жизни), и нужно обеспечивать совместимость с предыдущей версией.

Написать вполне можно. Достаточно следовать простым правилам. В данном случае нарушено простенькое правило: нельзя приводить указатель от меньшего типа к большему. Из указателя на int делать указатель на char можно. А наоборот - нельзя.

QUOTE (KnightIgor @ Aug 18 2014, 16:31) *
Но Вы ведь помните, что сначала был M3, а лишь много позже ARM замутил M0, который вдруг не понимает отрицательных смещений и невыровненного доступа.

До Cortex-M3 был ARM7TDMI. Вполне логично ожидать, что ассемблерный код для одной архитектуры не будет переносим на другую архитектуру. На то он и ассемблерный код.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Aug 18 2014, 14:45
Сообщение #8


Знающий
****

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



Цитата(LightElf @ Aug 18 2014, 15:13) *
До Cortex-M3 был ARM7TDMI. Вполне логично ожидать, что ассемблерный код для одной архитектуры не будет переносим на другую архитектуру. На то он и ассемблерный код.

"Логично ожидать?"
Тогда вопросы.
Когда был ARM7TDMI, было уже известно, что будет Cortex-M3?
Когда появился Cortex-M3, и инструкция с отрицательным смещением была допустима, было известно, что появится M0?
Если ARM приводит в 2009 пример для Cortex-M3, а именно на ассемблере (речь идет о SVC, и ARM прямо говорит, что без ассемблерной вставки никак), можно ли верить ARM и использовать код?
Что будем делать с time_t после 19.01.2038?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 18 2014, 15:09
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KnightIgor @ Aug 18 2014, 17:45) *
Если ARM приводит в 2009 пример для Cortex-M3, а именно на ассемблере (...) можно ли верить ARM и использовать код?
Использовать для Cortex-M3 - можно. Этот же код для Cortex-M0 - чаще всего нет.


--------------------
На любой вопрос даю любой ответ
"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
KnightIgor
сообщение Aug 18 2014, 16:31
Сообщение #10


Знающий
****

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



Цитата(Сергей Борщ @ Aug 18 2014, 17:09) *
Использовать для Cortex-M3 - можно. Этот же код для Cortex-M0 - чаще всего нет.

Сергей, Вы правы. В 2014 году. Для 2009-2010 высказывание смысла не имеет. Как никто бы лет 20 назад не понял, почему смешно, что телефон фотографировать может, а фотоаппарат не может звонить. Кстати, уже и фотоаппарат почти может, коль WiFi в нем уже есть. А лет 30 назад никто бы не понял фразу: "забыл трубу дома". Подумали бы, что музыкант.

П.С. Не удержусь, расскажу случай с собственным ребенком в садике. Дело было 2 года назад. В стране, где я живу, в саду проводят тесты, насколько хорошо дети владеют языком, чтобы вовремя отправить к логопеду, например, или позаниматься дополнительно в группе. Для этого им показывают картинки, просят назвать предмет, эмоции лица, и т.п. Родители могут молча присутствовать. И вот показывают моему мальцу картинку, на которой изображено что-то закругленно кубическое, красное, с кругом посередине и точками. Он смотрит долго, хмыкает и говорит: "божья коровка". Тетка начинает ставить наводящие вопросы. Реакция та же - жук, и все. Тогда тетка раскрывает ребенку глаза на этот удивительный мир и утверждает, что изображен телефон (для меня было очевидно: телефон с тубкой сверху, наборной диск с дырочками). На что мой малец говорит: "это не телефон, телефон - с кнопочками и картинкой". Вот так. Что скажут его дети на нынешние смартфоны, имея вживленные сети с приемом прямо в мозг?

Сообщение отредактировал KnightIgor - Aug 18 2014, 16:49
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- nanorobot   Прошу помощи с STM32F051   Aug 8 2014, 18:41
- - adnega   Стека точно хватает?   Aug 8 2014, 19:22
|- - nanorobot   Цитата(adnega @ Aug 9 2014, 01:22) Стека ...   Aug 8 2014, 19:25
- - Golikov A.   так сгенерите карту памяти, и поглядите. Если огро...   Aug 9 2014, 06:15
- - nanorobot   увеличил размер стека в 1.5 раза. не помогло.   Aug 9 2014, 09:21
- - ViKo   Причина HardFault описана в Fault регистрах. В той...   Aug 9 2014, 10:06
|- - nanorobot   Цитата(ViKo @ Aug 9 2014, 16:06) Причина ...   Aug 9 2014, 10:18
|- - jcxz   Цитата(nanorobot @ Aug 9 2014, 16:18) Есл...   Aug 9 2014, 15:25
|- - nanorobot   Цитата(jcxz @ Aug 9 2014, 21:25) ... Ес...   Aug 9 2014, 16:44
|- - jcxz   Цитата(nanorobot @ Aug 9 2014, 22:44) Есл...   Aug 9 2014, 18:32
|- - nanorobot   Цитата(jcxz @ Aug 10 2014, 00:22) Пристой...   Aug 9 2014, 18:35
|- - jcxz   Тогда эта модификация стека произошла в вашем обра...   Aug 9 2014, 18:50
|- - nanorobot   Цитата(jcxz @ Aug 10 2014, 00:50) Тогда э...   Aug 9 2014, 19:21
|- - ViKo   Цитата(nanorobot @ Aug 9 2014, 22:21) Осо...   Aug 9 2014, 20:50
- - ViKo   С CM0 знаком меньше. Может, таблица векторов преры...   Aug 9 2014, 10:33
- - KnightIgor   Цитата(nanorobot @ Aug 8 2014, 20:41) Отл...   Aug 9 2014, 11:17
|- - nanorobot   Цитата(KnightIgor @ Aug 9 2014, 17:17) .....   Aug 9 2014, 11:23
- - nanorobot   Со стеком разобрался. Нашел точку в которой происх...   Aug 9 2014, 20:47
|- - KnightIgor   Цитата(nanorobot @ Aug 9 2014, 22:47) Точ...   Aug 10 2014, 12:21
|- - Сергей Борщ   Цитата(KnightIgor @ Aug 10 2014, 15:21) Т...   Aug 10 2014, 14:57
||- - KnightIgor   Цитата(Сергей Борщ @ Aug 10 2014, 16:57) ...   Aug 10 2014, 16:49
||- - Сергей Борщ   Цитата(KnightIgor @ Aug 10 2014, 19:49) У...   Aug 11 2014, 08:43
||- - jcxz   Цитата(Сергей Борщ @ Aug 11 2014, 14:43) ...   Aug 11 2014, 09:11
||- - KnightIgor   Цитата(Сергей Борщ @ Aug 11 2014, 10:43) ...   Aug 12 2014, 10:08
||- - Сергей Борщ   Цитата(KnightIgor @ Aug 12 2014, 13:08) в...   Aug 12 2014, 11:39
||- - KnightIgor   Цитата(Сергей Борщ @ Aug 12 2014, 13:39) ...   Aug 12 2014, 12:33
||- - Сергей Борщ   Цитата(KnightIgor @ Aug 12 2014, 15:33) н...   Aug 12 2014, 17:39
|- - nanorobot   Цитата(KnightIgor @ Aug 10 2014, 18:21) Г...   Aug 10 2014, 15:14
|- - MiklPolikov   Очень интересная тема ! Подскажите, нет ли в и...   Aug 17 2014, 11:18
|- - adnega   Цитата(MiklPolikov @ Aug 17 2014, 15:18) ...   Aug 17 2014, 11:45
|- - MiklPolikov   Цитата(adnega @ Aug 17 2014, 15:45) Почем...   Aug 17 2014, 11:54
|- - adnega   Цитата(MiklPolikov @ Aug 17 2014, 15:54) ...   Aug 17 2014, 13:46
- - nanorobot   Thank. День прожит не зря. ))   Aug 9 2014, 21:03
- - Golikov A.   вроде как-то уже такое обсуждали, но так и не смог...   Aug 11 2014, 09:59
|- - jcxz   Не правы. Здесь совсем о другом разговор. Почитайт...   Aug 11 2014, 10:11
|- - adnega   Цитата(Golikov A. @ Aug 17 2014, 18:07) н...   Aug 17 2014, 14:36
|- - Сергей Борщ   Цитата(KnightIgor @ Aug 18 2014, 15:31) Н...   Aug 18 2014, 12:48
|- - LightElf   QUOTE (KnightIgor @ Aug 18 2014, 18:45) К...   Aug 19 2014, 07:30
- - Golikov A.   это же условно... может же быть входной байтовый...   Aug 17 2014, 17:11
|- - adnega   Цитата(Golikov A. @ Aug 17 2014, 21:11) э...   Aug 17 2014, 20:45
- - Golikov A.   если тот кто пишет прошивку об этом знает и следит...   Aug 18 2014, 07:00
|- - adnega   Цитата(Golikov A. @ Aug 18 2014, 11:00) П...   Aug 18 2014, 07:38
- - Golikov A.   ЦитатаПочему вы упорно валите с больной головы на ...   Aug 18 2014, 11:39
|- - Tahoe   Цитата(Golikov A. @ Aug 18 2014, 15:39) п...   Aug 19 2014, 03:16
- - Golikov A.   ЦитатаИз указателя на int делать указатель на char...   Aug 18 2014, 15:37
- - Golikov A.   даже в мего защищенном С# есть object и var. Так ч...   Aug 19 2014, 05:05
|- - Сергей Борщ   Цитата(KnightIgor @ Aug 18 2014, 19:31) С...   Aug 19 2014, 06:10
||- - KnightIgor   Цитата(Сергей Борщ @ Aug 19 2014, 08:10) ...   Aug 19 2014, 08:21
||- - LightElf   QUOTE (KnightIgor @ Aug 19 2014, 12:21) Я...   Aug 19 2014, 10:29
||- - LightElf   QUOTE (KnightIgor @ Aug 19 2014, 12:21) Т...   Aug 21 2014, 11:51
||- - MiklPolikov   Подскажите пожалуйста, как увидеть карту занятости...   Aug 26 2014, 11:54
|- - Tahoe   Цитата(Golikov A. @ Aug 19 2014, 09:05) В...   Aug 20 2014, 05:39
- - Golikov A.   Сергей Борщ очень правильно указал зачем применяет...   Aug 19 2014, 19:40
- - Golikov A.   А вы по специальности работали? ... мне вот очень...   Aug 20 2014, 07:28
|- - Tahoe   Цитата(Golikov A. @ Aug 20 2014, 11:28) м...   Aug 20 2014, 08:30
- - Golikov A.   ЦитатаСдаюсь. Видимо, умение программировать дано ...   Aug 20 2014, 08:44
|- - Tahoe   Цитата(Golikov A. @ Aug 20 2014, 12:44) п...   Aug 20 2014, 10:46
- - Golikov A.   ну в целом все как бы ясно, и про вас и про ваш по...   Aug 20 2014, 11:24
- - Tahoe   Согласен. Потихоньку слиться - лучшее, что можно с...   Aug 20 2014, 12:17
- - Golikov A.   если опустить маалоки и рекурсию, то надо поставит...   Aug 26 2014, 12:22


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

 


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


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