Например TDA7294

Форум РадиоКот • Просмотр темы - GCC: Hard Fault при делении long long int на unsigned int
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт дек 30, 2025 18:32:48

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: GCC: Hard Fault при делении long long int на unsigned int
СообщениеДобавлено: Вт июл 23, 2024 16:45:42 
Открыл глаза

Зарегистрирован: Пт апр 22, 2011 18:41:48
Сообщений: 71
Рейтинг сообщения: 0
Коллеги, всем мяу!
Переношу проект из Keil в Eclipse, компилятор меняется на GCC. Почти всё работает, но периодически программа падает в HardFault, и путём отладки было обнаружено, что попадание в HardFault происходит при делении переменной типа long long int на константу типа int.
Код:
uint64_t tmpTime = (*(TimeEditorItems[TimeEditorItemIndex].pTime))/96000000;
При этом в Keil никаких проблем с компиляцией и выполнением этого кода не было, а вот GCC компилирует его так, что контроллер после этого падает в HardFault.
Кто-нибудь сталкивался с этим?
Благодарю за внимание.

_________________
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: GCC: Hard Fault при делении long long int на unsigned in
СообщениеДобавлено: Вт июл 23, 2024 23:32:19 
Электрический кот
Аватар пользователя

Карма: 14
Рейтинг сообщений: 387
Зарегистрирован: Пт апр 09, 2010 16:06:38
Сообщений: 1064
Откуда: Тула
Рейтинг сообщения: 0
Похоже на невыровненный доступ. Гляньте тут.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: GCC: Hard Fault при делении long long int на unsigned in
СообщениеДобавлено: Ср июл 24, 2024 07:03:24 
Друг Кота
Аватар пользователя

Карма: 17
Рейтинг сообщений: 467
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Сообщений: 5586
Откуда: Воронеж
Рейтинг сообщения: 0
А точно именно хардфолт? Там по умолчанию на множество прерываний одна и та же затычка, скорее всего.

_________________
"Привет!" - соврал он.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: GCC: Hard Fault при делении long long int на unsigned in
СообщениеДобавлено: Сб авг 24, 2024 11:40:11 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 187
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1663
Рейтинг сообщения: 0
А точно именно хардфолт? Там по умолчанию на множество прерываний одна и та же затычка, скорее всего.
Не обязательно именно из-за той же самой "затычки". Если программист не предпринимал попыток разделения fault-ов на разные типы (Bus fault, Usage fault, etc.) и обработки их по-отдельности; или если невозможно возбуждение соответствующего специфичного fault-а по иным причинам, то будет проводиться эскалация разных типов fault-ов в HF:
Цитата:
В архитектуре Cortex-M эскалация fault-а до Hard fault происходит в следующих случаях:

При возникновении fault-а в режиме обработки исключения:

Если возникло исключение (например, BusFault, UsageFault или MemManageFault) в контексте уже выполняющегося обработчика исключений и этот fault не может быть обработан корректно, то он эскалируется до HardFault. Это предотвращает рекурсивные вызовы исключений, которые могут привести к зависанию системы.
Когда в системе не разрешено определенное исключение:

Если произошло исключение типа BusFault, UsageFault или MemManageFault, но соответствующее ему исключение отключено (например, бит EN в регистре управления исключениями сброшен), то оно будет эскалировано до HardFault.
Ошибка стека (Stack overflow):

Если в результате переполнения стека или другого сбоя в работе стека происходит повреждение данных в стеке (например, некорректный возвратный адрес), это также может вызвать HardFault.
Доступ к защищенной памяти:

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

Если произошел BusFault при извлечении команды из памяти, это автоматически эскалируется до HardFault, так как процессор не может продолжить выполнение программы без этой команды.
Ошибка из-за некорректной конфигурации MPU (Memory Protection Unit):

Если MPU неправильно сконфигурирован, это может привести к возникновению MemManageFault, который эскалируется до HardFault, если проблема не может быть разрешена.

Таким образом, эскалация до HardFault служит последним рубежом защиты, когда система сталкивается с критической ошибкой, которую не удается обработать штатными методами.
и программист получит честный HF в любом случае.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: GCC: Hard Fault при делении long long int на unsigned in
СообщениеДобавлено: Сб авг 24, 2024 19:46:25 
Сверлит текстолит когтями

Зарегистрирован: Вт ноя 19, 2019 06:10:18
Сообщений: 1270
Рейтинг сообщения: 0
Ледокот писал(а):
HardFault происходит при делении переменной типа long long int на константу типа int

Никаких проблем с делением у GCC нет. У меня несколько ПЛК крутятся очень давно, так там при вычислении времени цикла как раз делается такое деление.
С нюансами кода от Кейла под ARM не знаком, ибо не использую его. Коллеги выше верно указали на необходимость обработки исключения и выяснения того, какое на самом деле исключение возникает.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: GCC: Hard Fault при делении long long int на unsigned in
СообщениеДобавлено: Сб авг 24, 2024 21:08:44 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Я бы посмотрел во что этот код в асме выливается. Ну и пошагал по нему в отладчике.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y