|
|
  |
Настройка GCC компилятора для CortexM4, Какой ключ указать, чтобы использовать DSP инструкции |
|
|
|
Jan 23 2014, 19:59
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333

|
Читаю книгу Joseph Yiu "The Definitive Guide to the ARM Cortex-M3" и нашел там в главе про bus fault следующее: In the Cortex-M3, bus faults can also occur during the following: Stack PUSH in the beginning of interrupt processing, called a stacking error. Как видно у меня обработчик прерывания начинается с push:
Теперь возникает вопрос как избавиться от push в начале прерывания?
|
|
|
|
|
Jan 23 2014, 21:14
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(sidy @ Jan 23 2014, 21:59)  Читаю книгу Joseph Yiu "The Definitive Guide to the ARM Cortex-M3" и нашел там в главе про bus fault следующее: In the Cortex-M3, bus faults can also occur during the following: Stack PUSH in the beginning of interrupt processing, called a stacking error. Книга хорошая конечно, но вы как-то не так этот момент поняли: отказ шины, возникающий во время сохранения регистров в стек (Stack PUSH) называется "stacking error". Очень вольный перевод. Чем может быть вызвана эта ошибка не знаю - может стека не хватит или ещё что - не важно. Она ведь и возникать-то не должна в нормально написанной программе. Цитата(sidy @ Jan 23 2014, 21:59)  Как видно у меня обработчик прерывания начинается с push: Теперь возникает вопрос как избавиться от push в начале прерывания? Не надо с ветряными мельницами бороться - компилятору не хватает регистров R0 - R2 (или какие там автоматом в стек попадают) для обработчика прерывания, вот он и сохраняет ещё несколько. И на выходе их восстановит.
|
|
|
|
|
Jan 24 2014, 09:12
|

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

|
Цитата(sidy @ Jan 23 2014, 21:59)  Как видно у меня обработчик прерывания начинается с push: Полагаю, что тут имеется ввиду аппаратная запись стекового фрейма (R0-R3, R12, PC, LR, PSR). Цитата When the processor takes an exception, unless the exception is a tail-chained or a latearriving exception, the processor pushes information onto the current stack. This operation is referred as stacking and the structure of eight data words is referred as stack frame На нее вы повлиять не можете.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 24 2014, 16:09
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(sidy @ Jan 24 2014, 16:10)  А если я отключу bus fault В смысле запретите ядру делать bus fault-ы? Или запретите обработчик BusFault? Цитата(sidy @ Jan 24 2014, 16:10)  А если я отключу bus fault то программа вернет в каком-то месте некорректное значение? Ничего она не вернёт скорей всего - если BusFault_Handler запрещён, то будет вызван HardFault_Handler (это по-простому - на самом деле там несколько условий - почитайте например пункт мануала Fault handling). Если во время выполнения HardFault_Handler-a возникнет ошибка, то ядро будет заблокировано (Lookup state). Цитата(sidy @ Jan 24 2014, 16:10)  Может быть это поможет в поиске места возникновения bus fault ? Скорей помешает - зачем запрещать специально предназначенный для этой цели обработчик?
|
|
|
|
|
Jan 24 2014, 18:59
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333

|
Цитата(_Артём_ @ Jan 24 2014, 22:44)  Странный адрес какой-то...У вас внешнее ОЗУ не подключено? Или где-то в адресе цифру забыли написать? Внешнего ОЗУ нет. Адрес копировал из окна отладчика.
Сообщение отредактировал sidy - Jan 24 2014, 18:59
|
|
|
|
|
Jan 25 2014, 14:38
|

Частый гость
 
Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747

|
С чего Вы взяли, что попадаете в Hard Fault, у Вас же на все исключения прописан обработчик Default_Handler? На мой взгляд убьете больше времени, разбираясь с запуском обработчика и выдергиванием точки входа в исключение, чем логически подумать, почему раньше работало, добавить перед каждым вызовом функций настройки периферии принтф. Если получаем Hard Fault, значит смотрим систему тактирования и настройки DMA, если Default Handler, значит не влезли в стек, накосячили с указателем и т.д.
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Jan 31 2014, 15:33
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333

|
Обработчики для различных Fault'ов я добавил. Поймал сегодня еще один Fault. В регистре SCB->CFSR установлено 0x1000000, т.е. установлен бит UNALIGNED: the processor has made an unaligned memory access. В обработчике faul'та следующее:  Т.е. если смотреть pc, там содержится 0х08002с24. По этому адресу содержится следующее:
если я сделал все правильно, то непонятно, что в районе этого адреса может быть невыровнено.
|
|
|
|
|
Feb 1 2014, 10:04
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333

|
Вот кусок исходного кода: Код if (CalcUBpA>=1){ temp=(float)NUBpAPeriod/(float)SIZE; temp=vsqrt(temp); BypassInpUa=BypassInpUaK*UacCoeff*temp; CalcUBpA=0; }
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|