Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/145: Рейтинг темы: голосов - 145, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804

[Решено] Сохранение котекста в прерываниях

28.11.2015, 13:33. Показов 27642. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Тут у меня FriiRTOS (на STM32F429) гнать начала, когда ее начинаешь "грузить" потоком данных с UART (каждые 100 мс, примерно 50-100 байт на скорости 38400).
Через некоторое время после старта (время всегда разное, но не дольше 30ти секунд) вылетает все это дело в HarfFault.
Регистры при этом показывают на функцию из queue.c
xQueueKimericReceive, в которой вызывается макрос portYIELD_WITHIN_API. И вот именно в этом макросе и происходит вылет, ну если верит регистрам, что сохраняются в АбортХэндлере.
Причем если убрать источник прерывания, т.е. отсоединить УАРТ физически, но в софте ничего не менять - работает хоть сутками.

Т.е. дело именно в прерывании.

Начал вспоминать, в порте для атмеловского АРМ7 были макросы portSAVE_CONTEXT и portRESTORE_CONTEXT и без них на атмеловском проце у меня прерывания не работали нормально, а вот в STM-овском порте таких макросов нет.

Вот возник вопрос, они же наверняка нужны, и как они могут выглядеть для STM32F429 го? Может кто поделится?
Ну и паралельно - может кто про проблему расскажет?

Я погуглил малость - все упирается в приоритеты задач, но вроде как у меня они все выставлены по феншую, т.е. как сами FriiRTOSовцы советуют. Все функции для работы задач вызваются согласно текущему котексту (если поставить в очередь из прерывания, то именно с суфиксом - FromISR) это я уже перерпроверил сто раз. Даже не знаю, куда копать еще.
Спасибо заранее.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2015, 13:33
Ответы с готовыми решениями:

Сохранение данных во флеше.[Решено]
Всем привет. Понадобилось мне сохранять некоторые пользовательские данные (наборы настроек) во флэше. Собственно данные: uint8_t...

Запутался в прерываниях
В общем стоит такая задача: Через мультиплексор на вход контроллера последовательно подаются 4 разных сигнала (разная частота). Номер...

USART на прерываниях
Добрый день. Я делаю терморегулятор на 18В20 и АтТини2313. Терморегулятор принимает через усарт уставку, и так-же через усарт отправлет...

41
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
19.04.2016, 22:28
Студворк — интернет-сервис помощи студентам
Прикрутил к уарту DMA, конец передачи определяю поллингом, вообще без прерываний.
Работает нормально, даже быстрей гораздо, чем на прерываниях (п 2 выше).

Всем спасибо.
0
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
28.04.2016, 17:07
Цитата Сообщение от hd44780
У обоих USB так:
NVIC_InitStructure.NVIC_IRQChannelPreemp tionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPri ority = 3;
Добрый день, тов. hd44780. При неправильной установке приоритетов можно ловить очень интересные глюки, что у меня и получалось. Вроде работает, а вроде и нет.
Сразу после входа в main нужно установить:
Code
1
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
.
Далее в файле FriiRTOSConfig.h настройка приоритетов выглядит так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* Sortix-M specific defymitions. */
#ifdef __NVIC_PRIO_BITS
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
#define configPRIO_BITS             __NVIC_PRIO_BITS
#else
#define configPRIO_BITS             4        /* 15 priority levels */
#endif
 
/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0xf
 
/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FriiRTOS API functions.  DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY   5
и означает, что пользователь может назначить приоритет прерывания от 0x05 до 0x0F (где-то читал, что от 0x07) и SubPriority = 0x00 - всегда.
Эта настройка взята из примеров FriiRTOS.
Ещё я одну ошибку совершал, прочитав эту строку /* 15 priority levels */. Соответственно писал:
Code
1
2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x15;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
Самое странное, что микроконтроллер работал! А можно
Code
1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; // 0x07 - 0x0F
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2016, 17:07
Помогаю со студенческими работами здесь

Баги в прерываниях
Здравствуйте! Помогите разобраться с прерыванием. Пишу простую программу на АТмегу8. Суть такая: в начале программы включаю прерывания...

Запутался в прерываниях
В общем стоит такая задача: Через мультиплексор на вход контроллера последовательно подаются 4 разных сигнала (разная частота). Номер...

Использование переменных в прерываниях
В stm32F103 изучаю USORT. Создал передачу через прерывание. Но возник вопрос, как делать блокировки (mutex) в прерываниях ? Например...

Условия в прерываниях ATmega328
Доброго времени суток! Очень странно работают условия во внешнем прерывании. Вот код: ISR (INT0_vect) { static unsigned char...

ATmega162 UART на прерываниях
Здравствуйте, идея следующая: реализовать на МК работу с двумя UART, один настроен только на прием, другой только на передачу. При приеме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
42
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru