Easyelectronics.ru

Электроника для всех
Текущее время: 21 мар 2019, 17:18

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Вылет при использовании FPU в прерывании на Cortex M4
СообщениеДобавлено: 20 апр 2015, 05:09 
Здравствуйте!

Зарегистрирован: 20 апр 2015, 04:55
Сообщения: 2
Всем привет!
Заранее извиняюсь за терминологию - доки на английском, учёба на немецком, ... Переводить некогда )

Помогите плз понять что уводит в HardFault при использовании FPU с активированным LSPEN (пушем регистров FPU только по необходимости)
Контроллер: STM32F405RG
Вылет происходи при вызове инструкции vldr s0, [r4] из коллстека прерывания OTG_FS_IRQn.
Адрес в r4 в RAM и кончается на 0x4, те вроде чётен к слову. При шаге в дебаггере происходит уход в HardFault, в CFSR при этом выставляется флаг NOCP (копроцессор недоступен) и флаги HFRDY и THREAD. В CPACR CP10 и CP11 установлены в 0b11 (копроцессор включен).
Также в FPCCR установлены ASPEN (пуш ркгистров FPU) и LSPEN (пуш только по надобности).

Если убрать LSPEN, то комманда выполняется без ошибок !! Но у меня довольно жёсткие требования к таймингам, так что было бы неплохо его не снимать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вылет при использовании FPU в прерывании на Cortex M4
СообщениеДобавлено: 20 апр 2015, 12:54 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 651
В прерывании низя юзать fpu, а так-же регистры r5-r11. Собственно GCC этого не позволит сделать, если только вставки на асме...
При очень большом желании - необходимо запрещать прерывания на время выполнения fpu , сохранять регистры при этом - не обязательно.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вылет при использовании FPU в прерывании на Cortex M4
СообщениеДобавлено: 20 апр 2015, 16:28 
Здравствуйте!

Зарегистрирован: 20 апр 2015, 04:55
Сообщения: 2
Вы может не о Cortex M4F?
Цитата:
#4 Using floating point calculations in an Interrupt Service Routine

Floating point calculations are performed on a separate register bank inside the floating point unit. If both the main thread (e.g. main program) and interrupt service routines (ISR) use the FPU, extra context saving and restoring are required to ensure that the ISR does not corrupt the data used by the main thread. The extra context saving and restoring requires extra clock cycles, and therefore if you want to have fast ISR response time, one way is to avoid floating point calculations inside an ISR. In this way, the stacking and unstacking of FPU registers is avoided using a feature called Lazy Stacking (see ARM application note AN298).

http://community.arm.com/docs/DOC-7544


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

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


Кто сейчас на конференции

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


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB