Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-окт-20 22:37

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 2017-фев-28 13:08 
Не в сети

Зарегистрирован: 2014-авг-08 10:42
Сообщения: 10
Откуда: ВНИИЭМ
Добрый день. Пробуем работать с 1986ВЕ1Т с внешней памятью.
Реализация задачи следующая:

Есть загрузчик во внутренней памяти микроконтроллера, который инициализирует внешнюю шину, необходимую периферию.
Так как начало таблицы векторов в данном контроллере не перемещаемое, начальная таблица заполнена вектором Default_Handler, в котором находится код, выбирающий вектор перехода из таблицы во внешней памяти. В момент старта микроконтроллера, после инициализации внешней шины, загрузчик помещает свою таблицу векторов во внешнюю память и включает прерывания. Механизм перехода по вектору из внешней таблицы используется в дальнейшем при работе функционального ПО (ФПО)
Имеется ФПО, загружаемое загрузчиком из внешней Flash-памяти(1636рр2у) во внешнюю RAM(2х1645ру4у), на которое передается управление.
Указанное ФПО построено на основе FreeRTOS в нем реализуется 8 задач.
Все работает прекрасно до тех пор пока не подключается процесс в котором задействована куча математики на double. То что это медленно и микроконтроллер для этого не предназначался - я знаю, скорости вполне хватает. Тем не менее время от времени при работе этой математической задачи микроконтроллер падает в hard fault.
Имеется обработчик hard fault исходя из которого видно, что падения происходят в одном и том же месте. Казалось бы надо искать ошибку в этом самом месте, но ошибки там нет (похоже что нет). Это может быть код перемножения матриц, может быть взятие квадратного корня, может простое перемножение двух даблов - доступ тоже кажется везде выровненным ибо не используется динамическое выделения памяти, а те массивы, которые попадают на вход в функции определены на этапе компиляции. Более того падения происходит далеко не каждый раз. Иногда ФПО успевает проработать сутки и более. Дальше интереснее - меняем код в совершенно произвольном месте месте, в другой задаче, так чтобы поехал результирующий бинарник. И вуаля - падает теперь в другом, но снова в одном и том же месте.

Открыть Default Handler
Default_Handler:
mrs r0,IPSR
ldr r1,=0x60800000
lsls r0, r0,#2
ldr r3,[r1,r0]
mov pc,r3
nop
mov r0,r0
movs r0, #0
strh r0, [r0, #0]
.size Default_Handler, . - Default_Handler
Закрыть


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-фев-28 19:01 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 373
Задачи друг другу стек не портят?

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-01 08:26 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 998
Откуда: Тула
Это не в режиме отладки происходит?
Можно ли урезать задачи так, чтобы код влез во внутреннй флеш?
На память, было что-то подобное на форуме и решения не было выявлено. У меня к подобному эффекту (но существенно быстрее, секунды) приводило включенное отображение переменных в отладчике (видимо какие-то конфликты на шине).

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-01 10:16 
Не в сети

Зарегистрирован: 2014-авг-08 10:42
Сообщения: 10
Откуда: ВНИИЭМ
Задачи стек не портят, так как используется Stack overflow hook, uxTaskGetStackHighWaterMark, и память под все нужды ос выделена статически и в момент падения стеки не затираются. Пробовали выделять больше стека под задачи - ситуация не изменилась.
Падение происходит с отладчиком и без. Без отладчика работает значительно дольше.
Код во флеш можно вместить, для интереса.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-06 15:49 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 46
Рискну предложить несколько идей:
1. Проверьте, не выполняются ли вычисления с плавающей точкой внутри какого-либо обработчика прерываний? Такие вычисления корректно работают только за их пределами.
2. Обеспечен ли монопольный доступ задачи к вещественным данным? Например, не может ли ОС во время выполнения операции над переменной X типа double переключиться на выполнение какой-то другой задачи, которая тоже будет что-то делать с этой переменной. Поскольку эмулируемые вещественные операции не являются атомарными, может возникнуть серьезная ошибка. Другими словами, все ли мьютексы на месте :-)?
3. Попробуйте отключить оптимизацию (поставьте уровень 0).
4. Попробуйте вещественные переменные, с которыми работает проблемная задача, опиcать со словом volatile (чтобы уж точно никакой оптимизации не было).
5.
Цитата:
Дальше интереснее - меняем код в совершенно произвольном месте месте, в другой задаче, так чтобы поехал результирующий бинарник. И вуаля - падает теперь в другом, но снова в одном и том же месте.

Приходилось такое встречать. Проблема была в том, что залазил на чужую память (выходил за границы массива). При изменении исходника (даже незначительном) размещение глобальных переменных и подпрограмм меняется, поэтому проявлялось в разных местах программы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-06 16:28 
Не в сети

Зарегистрирован: 2014-авг-08 10:42
Сообщения: 10
Откуда: ВНИИЭМ
>1. Проверьте, не выполняются ли вычисления с плавающей точкой внутри какого-либо обработчика прерываний? Такие вычисления корректно работают только за их пределами. \

Никакой математики с double или float в прерываниях не выполняется.

>2. Обеспечен ли монопольный доступ задачи к вещественным данным? Например, не может ли ОС во время выполнения операции над переменной X типа double переключиться на выполнение какой-то другой задачи, которая >тоже будет что-то делать с этой переменной. Поскольку эмулируемые вещественные операции не являются атомарными, может возникнуть серьезная ошибка. Другими словами, все ли мьютексы на месте :-)
Такого нет. Доступ к переменым монопольный - но еще раз перепроверю что все ли корректно

>3. Попробуйте отключить оптимизацию (поставьте уровень 0).
сейчас поставлен Og, пробовал с O0 - без эффекта

>4. Попробуйте вещественные переменные, с которыми работает проблемная задача, опиcать со словом volatile (чтобы уж точно никакой оптимизации не было).
Попробовал задефайнить #define double volatile double - незнаю хватит ли этого

>5.
Не думаю, что что то налазит друг на друга, потому что код взят из другого проекта( выполнен платформонезависим - ибо математика) в котором успешно исполняется уже более 5 лет (также успешно исполняется под "старшими ОС" типа windows или linux в имитаторе)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-06 18:05 
Не в сети

Зарегистрирован: 2014-авг-08 10:42
Сообщения: 10
Откуда: ВНИИЭМ
Также замечено, что вызов vTaskSuspendAll() перед выполнением математики и вызов xTaskResumeAll() после коким то образом уменьшает вероятность возникновения проблемы (пока еще ни разу не упало)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-06 21:59 
Не в сети

Зарегистрирован: 2014-июн-25 09:29
Сообщения: 46
Еще идея.
Как на счет реентерабельности функций, которые у вас используются для вещественных вычислений? Собственно, это вариант п.2, о котором я уже говорил, но всё же лучше проверить. Быть может, библиотечные функции содержат какие-нибудь внутренние статические переменные. Пока вычисления ведутся лишь в одной задаче, будет всё в порядке, а когда в нескольких - полезут проблемы. Вылечить это однозначно можно применением мьютексов, защищающих доступ к вызову библиотечных функций, или, в некоторых случаях, изменением приоритетов задач.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-11 17:27 
Не в сети

Зарегистрирован: 2014-авг-08 10:42
Сообщения: 10
Откуда: ВНИИЭМ
Кстати забыл упомянуть, что используем GCC в качестве компилятора. Может быть тут скрыты какие-нибудь проблемы? Моет быть библиотеку для математики надо использовать какую-нибудь особую?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-мар-21 20:02 
Не в сети

Зарегистрирован: 2014-авг-08 10:42
Сообщения: 10
Откуда: ВНИИЭМ
Перенесли код на флешку (данные и стеки оставлены во внешней памяти) пока ни разу не упало.


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

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


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB