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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Настройка GCC компилятора для CortexM4, Какой ключ указать, чтобы использовать DSP инструкции
sidy
сообщение Jan 23 2014, 19:59
Сообщение #31


Местный
***

Группа: Участник
Сообщений: 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 в начале прерывания?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 23 2014, 21:14
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 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 (или какие там автоматом в стек попадают) для обработчика прерывания, вот он и сохраняет ещё несколько. И на выходе их восстановит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2014, 09:12
Сообщение #33


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 24 2014, 14:10
Сообщение #34


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



А если я отключу bus fault то программа вернет в каком-то месте некорректное значение? Может быть это поможет в поиске места возникновения bus fault ?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 24 2014, 16:09
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 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 ?
Скорей помешает - зачем запрещать специально предназначенный для этой цели обработчик?


Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 24 2014, 18:16
Сообщение #36


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



В регистре SCB->CFSR установлены биты PRECISERR и BFARVALID, а в регистре BFAR последний раз был адрес 0x268dfb8. Что можно полезного извлечь из этого адреса? Как я понимаю это адрес памяти? Но программа у меня стартует с адреса 0х08000000.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 24 2014, 18:44
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(sidy @ Jan 24 2014, 20:16) *
BFAR последний раз был адрес 0x268dfb8.

Странный адрес какой-то...У вас внешнее ОЗУ не подключено? Или где-то в адресе цифру забыли написать?
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 24 2014, 18:59
Сообщение #38


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



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

Внешнего ОЗУ нет. Адрес копировал из окна отладчика.

Сообщение отредактировал sidy - Jan 24 2014, 18:59
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 25 2014, 11:04
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(sidy @ Jan 24 2014, 20:59) *
Внешнего ОЗУ нет. Адрес копировал из окна отладчика.

Ну тогда проект бы выложили...Гадать можно долго.
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 25 2014, 11:59
Сообщение #40


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Выкладываю весь проект (достаточно большой): суть его управление трехфазным инвертором и выпрямителем. Сделан в CooCox CoIDE. Особая просьба посмотреть в файле startup_stm32f4xx.c обработчик Hard Fault может я не правильно вылавливаю Hard Fault.
Прикрепленный файл  Project.rar ( 440.99 килобайт ) Кол-во скачиваний: 84


Сообщение отредактировал sidy - Jan 25 2014, 12:53
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Jan 25 2014, 14:38
Сообщение #41


Частый гость
**

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



С чего Вы взяли, что попадаете в Hard Fault, у Вас же на все исключения прописан обработчик Default_Handler? На мой взгляд убьете больше времени, разбираясь с запуском обработчика и выдергиванием точки входа в исключение, чем логически подумать, почему раньше работало, добавить перед каждым вызовом функций настройки периферии принтф. Если получаем Hard Fault, значит смотрим систему тактирования и настройки DMA, если Default Handler, значит не влезли в стек, накосячили с указателем и т.д.


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
Aaron
сообщение Jan 28 2014, 13:06
Сообщение #42


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Ну на самом деле полезно сделать один раз качественный развёрнутый обработчик исключений и потом им постоянно пользоваться, может спусти не одну тысячу нервных клеток!
Для корректного разворачивания причины прерывания (анализ можно прямо в коде проводить и printf-ами выводить сообщения анализа) надо читать доку у STM, где всё-всё-всё расписано: PM0214: STM32F3xxx and STM32F4xxx Cortex-M4 programming manual
Go to the top of the page
 
+Quote Post
sidy
сообщение Jan 31 2014, 15:33
Сообщение #43


Местный
***

Группа: Участник
Сообщений: 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. По этому адресу содержится следующее:
Прикрепленное изображение

если я сделал все правильно, то непонятно, что в районе этого адреса может быть невыровнено.
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Feb 1 2014, 09:37
Сообщение #44


Частый гость
**

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



Для наглядности бы еще кусок исходного кода показали


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
sidy
сообщение Feb 1 2014, 10:04
Сообщение #45


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 2-11-08
Пользователь №: 41 333



Вот кусок исходного кода:
Код
if (CalcUBpA>=1){
      temp=(float)NUBpAPeriod/(float)SIZE; temp=vsqrt(temp);
      BypassInpUa=BypassInpUaK*UacCoeff*temp; CalcUBpA=0;
}
Go to the top of the page
 
+Quote Post

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

 


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


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