Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Skt
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 14
#1

stm32f103 + FreeRTOS непонятный hard fault и ещё кое что - ARM, Cortex, STM32 микроконтроллер

14.06.2016, 13:35. Просмотров 2644. Ответов 4
Метки нет (Все метки)

Делаю программу для управления двигателем. В основе stm32f103c8t6 на нём FriiRTOS 8 версии. Есть не периодическая задача обработки данных из CAN. Также есть 3 периодических: опрос датчика тока, обработка ПИД регулятора пересчёт текущей скорости или положения вала, т.к. в виде обратной связи используется или квадратурный энкодер или потенциометр. Тики энкодера обрабатываются в прерываниях по одной из линий.

Проблем две.

Первая - это иногда возникающий hard fault, причём судя по той статистике что у меня есть он возникает когда в качестве обратной связи энкодер. Больше сказать не могу, так как он возникает непредсказуемо.

Вторая более интересная. Кто пытался во фриртосе сделать return из таска наверняка знает чем это заканчивается. Вызовом обработчика этого безобразия, а именно функции static void prvTaskExitError( void ) из port.c. Так вот у меня эта функция вызывается просто так. Опять же из той статистики которая у меня есть абсолютно не понятно что является причиной вызова этой функции, т.к. ни в одном таске ретёрна нет. И программа улетает в неё совсем не предсказуемо.

Обе эти проблемы возникают непредсказуемо, программа может работать полтора часа и вылететь в одну из этих ошибок, а может через 5 минут работы

Вопрос больше каким образом обнаружить источник ошибки? До этого заметил, что при переполнении переменной типа ftoot мк улетал в hard fault, сейчас суммирования нет нигде и переполняться нечему. В программе использую очереди типа uint8_t, а потом полученный данные из очереди использую как индекс массива. Может быть тут что-то не так? Может ли это быть результат переполнение стека?
В общем буду признателен любой помощи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2016, 13:35
Я подобрал для вас темы с готовыми решениями и ответами на вопрос stm32f103 + FreeRTOS непонятный hard fault и ещё кое что (ARM, Cortex, STM32 микроконтроллер):

Попадание в Hard Fault после POP в Cortex-M3 (EFM32GG-STK3700 с FreeRTOS)
Добрый день! Столкнулся с непонятным поведением процессора при выполнении...

1Wire+STM32F103+FreeRTOS
Здравствуйте. Кто что скажет по поводу реализации данной связки...

FreeRTOS на STM32F103 "медленные" миллисекунды.
Запустил FriiRTOS на STM32F103C8, 72MHz. Использую IAR. Хочу поморгать...

jetlink8 STM32 - Hard Fault
Купили на работу нам "отладчик", jetlink8. Который якобы все поддерживает. SWD,...

GPIOA->BSRR - Hard fault
Здравствуйте, коллеги! Начал изучать stm32. Есть плата собственного...

Hard Fault _ Idle Task
Доброго времени суток. Stm32F205RE РТОС использовал Uc/Os 2 и FriiRtos. ПО...

4
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
14.06.2016, 14:58 #2
Я тут малость накатал некоторые мысли про ХардФолт и как его дебажить

Про вылет из задачи - у меня так было, когда стек задачи был маленьким.

Про первую проблему - смотрите в сторону приоритетов прерываний. Что то мне подсказывает - что дело в них.
0
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
14.06.2016, 16:34 #3
кроме приоритетов прерываний можно посмотреть какие FriiRTOS функции используются в контексте прерывания. А именно должны использоваться только *fromISR версии.
В программе использую очереди типа uint8_t, а потом полученный данные из очереди использую как индекс массива
Еще можно посмотреть может где-то происходит запись в массив, когда он еще не прочитался. И в итоге обрабатываются неверные данные. Нужно расставить проверки, проверить все возможности выхода за пределы массивов, проверять максимальные и минимальные значения индексов взятых из пакета и т.д.

причём судя по той статистике что у меня есть он возникает когда в качестве обратной связи энкодер.
я бы начал копать с прерываний обработки энкодера
0
Skt
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 14
16.06.2016, 10:43 #4
Спасибо за ответы. Помогли покопаться в нужную сторону. Увеличил размера стека задач, изменил приоритеты прерываний. А так же переделал логику обработки сообщений из CAN. Раньше у меня по приходу сообщения создавалась задача обработки, которая удалялась после выполнения. В проекте на ф407 такая система работала без проблем, а вот тут почему то нет. В итоге поставил её циклично выполняться и сигнал о новом сообщении передаю через семафор. Теперь вроде всё работает нормально.
0
HotD
0 / 0 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
16.06.2016, 12:31 #5
по поводу создания и удаления задач - какой heap был выбран? Там есть тонкости. Некоторые heap не предназначены для удаления задач, какие-то оставляют фрагментированные фрагменты, и новые задачи должны быть размером такие-же, как и удаленные. Возможно у вас просто кончалась куча, из-за того что задачи были с разным размером стека и после удаления оставались мелкие фрагментированные кусочки.
0
16.06.2016, 12:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2016, 12:31
Привет! Вот еще темы с решениями:

[Решено] STM32F4 + MP3 Player + I2C уходит в hard fault
Добрый вечер! Есть проект с STM32F4Dyscovery. На FSMC шине висит LCD...

Массив и кое-что ещё
Доброго дня. Не объясните мне пожалуйста что значит этот код? Здесь x задан...

Изменение громкости и ещё кое-что...
Всем привет! Оч интересует вопрос, какая функция в BASS позволяет уменьшать и...

Температура 4670K и кое-что ещё
Prime95 Benchmark прогрел ядра процессора до 75 градусов, CPU 44 LinX за...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru