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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Прошу помощи с 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
adnega
сообщение Aug 8 2014, 19:22
Сообщение #2


Гуру
******

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



Стека точно хватает?
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Aug 8 2014, 19:25
Сообщение #3


Местный
***

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



Цитата(adnega @ Aug 9 2014, 01:22) *
Стека точно хватает?

Вопрос интересный... Яровские установки = default
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 9 2014, 06:15
Сообщение #4


Гуру
******

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



так сгенерите карту памяти, и поглядите. Если огромной рекурсии нету то вам покажут занятость стека весьма понятно.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Aug 9 2014, 09:21
Сообщение #5


Местный
***

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



увеличил размер стека в 1.5 раза. не помогло.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 9 2014, 10:06
Сообщение #6


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

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



Причина HardFault описана в Fault регистрах. В той же книге они описаны. Я всегда сначала там роюсь, а потом адрес, с которого улетел, смотрю.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Aug 9 2014, 10:18
Сообщение #7


Местный
***

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



Цитата(ViKo @ Aug 9 2014, 16:06) *
Причина HardFault описана в Fault регистрах. В той же книге они описаны. Я всегда сначала там роюсь, а потом адрес, с которого улетел, смотрю.



Если Вы имеете в виду регистры CFSR и HFSR то в M0 их нет, только в M3/M4. А адрес с которого улетело, есть адрес в области RAM. Программа же расположена во FLASH, и не использует никаких трюков с выполнением из RAM и указателей на функции. Отсюда мой ступор.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 9 2014, 10:33
Сообщение #8


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

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



С CM0 знаком меньше. Может, таблица векторов прерываний переназначилась на ОЗУ?
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Aug 9 2014, 11:17
Сообщение #9


Знающий
****

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



Цитата(nanorobot @ Aug 8 2014, 20:41) *
Отлаживаю дивайс на STM32F051. интенсивно используется DMA - все каналы. Периодически (1 раз в 1- 4 часа) происходит HardFault.Ввел обработчик ХардФаулт из Definitive Guide, получил листинг регистров. Не могу полноценно осознать результаты. Судя по содержимому PC, инструкция, вызвавшая HardFault была расположена в RAM. Непонятно. Указатели на функции не использую.
Во вложении кусочек скриншота с регистрами.

Явно в какой-то процедуре затирается стек (LR странный), и при возврате из нее процессор попадает в никуда. Стек затирается видимо ввиду нарушения границ какой-то локальной переменной (массива), объявленной в процедуре. Почему так редко? Ну может наступает некое условие раз в час, например, особое время суток в часах реального времени. А может происходит неверная инициализация DMA, который влазит на чужую область памяти. Например, принимается пакет извне (через UART и т.п.), пакет содержит поле длины, эта длина оказывается изредка неправильной, проверка границ не происходит, DMA грузится слишком "длинно" и влазит в чужой огород.

Если глянуть на регистры R1 и R2, можно также увидеть, что они указывают в RAM. Возможно по их значениям и карте памяти для секции RAM можно определить, какие переменные там есть, и, таким образом, по имени переменных и по тексту кода "вычислить" процедуру, которая ломает стек. Да и R3 содержит 0x4B0 = 1200 - больно круглое число, чтобы быть случайным. Это указывает на какой-то счетчик (например, из for ()). Вот гляньте, нет ли в коде процедуры, которая чего-то там прописывает с этой длиной.

Если используется динамическое размещение памяти, то в результате длительной работы может возникнуть сильная фрагментация кучи, с которой менеджер не справляется (кто сказал, что не бывает ошибок в библиотеках?) и выделяет память ошибочно. Попробуйте кучу увеличить. Кстати, если куча в собственном коде явно и не используется, возможно она используется библиотеками. Например, для стандарта --C99 локальная переменная-массив может быть переменной длины, зависимой от параметра функции. Это реализуется, к сожалению, не смещением указателя стека, чтобы разместить такой массив в нем, а вызовом malloc/free.

Сообщение отредактировал KnightIgor - Aug 9 2014, 11:21
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Aug 9 2014, 11:23
Сообщение #10


Местный
***

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



Цитата(KnightIgor @ Aug 9 2014, 17:17) *
...


Благодарю за развернутый ответ. Буду копать в указанных направлениях.

Сообщение отредактировал IgorKossak - Aug 9 2014, 18:29
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 9 2014, 15:25
Сообщение #11


Гуру
******

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



Цитата(nanorobot @ Aug 9 2014, 16:18) *
Если Вы имеете в виду регистры CFSR и HFSR то в M0 их нет, только в M3/M4. А адрес с которого улетело, есть адрес в области RAM. Программа же расположена во FLASH, и не использует никаких трюков с выполнением из RAM и указателей на функции. Отсюда мой ступор.

Это и не обязательно. Cortex может сохранять адреса возврата из функций на стеке. Если Вы его каким-либо образом разрушаете, то при попытке возврата выполнение может
улететь куда угодно (или сразу в fault).

Цитата(KnightIgor @ Aug 9 2014, 17:17) *
Явно в какой-то процедуре затирается стек (LR странный)

Там не только LR странный, но и PSR к примеру.
Сдаётся мне, что это никакое не содержимое регистров в момент fault-a, а просто ТС привёл нам мусор. wink.gif
Вот например, что выдаёт мой обработчик критических ошибок при возникновении
BUS FAULT: неточная ошибка при обращении к данным (imprecise data bus error) (ловушка 123):
Прикрепленное изображение

Всё чётко видно где произошло, при каких регистрах и стеке.
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Aug 9 2014, 16:44
Сообщение #12


Местный
***

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



Цитата(jcxz @ Aug 9 2014, 21:25) *
...



Если быть точным, это не регистры, а их копии лежащие в верхушке стека, т.е. их состояния на момент HardFault. Если я намеренно привожу ситуацию к HardFault - все регистры (их копии в стеке) выглядят вполне пристойно.

Сообщение отредактировал IgorKossak - Aug 9 2014, 18:30
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 9 2014, 18:32
Сообщение #13


Гуру
******

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



Цитата(nanorobot @ Aug 9 2014, 22:44) *
Если быть точным, это не регистры, а их копии лежащие в верхушке стека, т.е. их состояния на момент HardFault. Если я намеренно привожу ситуацию к HardFault - все регистры (их копии в стеке) выглядят вполне пристойно.

Пристойно? И 24й бит PSR тоже?
И биты 0...8 тоже? А ведь они говорят, что этот fault у вас случился типа внутри ISR с номером 0x160. У вашего M0 столько источников прерываний??? Я даже у M3 более примерно полусотни-то не видел....
То что Вы приводите не имеет никакого отношения к регистрам либо "их копиям в верхушке стека".
Go to the top of the page
 
+Quote Post
nanorobot
сообщение Aug 9 2014, 18:35
Сообщение #14


Местный
***

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



Цитата(jcxz @ Aug 10 2014, 00:22) *
Пристойно? И 24й бит PSR тоже?
То что Вы приводите не имеет никакого отношения к регистрам либо "их копиям в верхушке стека".


Извините, если что не так. Вы меня неправильно поняли. "Пристойно" они выглядят не в приведенном случае, а в том, когда я программно создаю ситуацию HardFault от кнопки.
а текущий случай не укладывается ни в какие рамки. Возможно ситуация осложнена модификацией стека, или чем либо еще, но она именно такова.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 9 2014, 18:50
Сообщение #15


Гуру
******

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



Тогда эта модификация стека произошла в вашем обработчике HardFault.
Вы же вроде пытаетесь привести результат стекинга на входе в HardFault?
Вот как раз такого результата быть не может, как я вам выше уже показал.
Скорей всего Вы неправильно определили положение верхушки стека прерванной программы.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:05
Рейтинг@Mail.ru


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