Easyelectronics.ru

Электроника для всех
Текущее время: 20 ноя 2017, 05:18

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



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 06 ноя 2017, 23:35 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 42
Откуда: Томск
Super Simple Tasker - один из вариантов реализации вытесняющей многозадачности для микроконтроллеров. Для его реализации нужна такая вещь: в функции-обработчике прерывания, после выполнения необходимого кода, нужно как-то сообщить микроконтроллеру, что с прерыванием закончили работать но из функции-обработчика не выходить. Т.е. нужно разрешить вложенные прерывания. Как это можно сделать для ARM?

_________________
Много говорить и много сказать не одно и то же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 06 ноя 2017, 23:42 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 613
Он (МК) сам это сделает, если приоритет нового прерывания будет выше, чем приоритет того прерывания, в котором сейчас находится, и новое прерывание разрешено (в NVIC и в периферийном модуле, от которого прерывание ожидается). Не забываем, что нумерация приоритетов - наоборот. Чем меньше номер, тем выше приоритет. 0 - самый высокий. Отрицательные - исключения ядра, еще более высокий приоритет.

С многократно вложенными прерываниями работайте аккуратно - стек не безграничен, не забывайте выходить из ненужных более обработчиков.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 06 ноя 2017, 23:52 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 42
Откуда: Томск
Неправильно выразил идею. С разными прерываниями - понятно как работает (зависит от приоритета). Нужно разрешить вызывать то же самое прерывание, в контексте которого уже работаем. Т.е. как будто бы с прерыванием работать закончили, но из функции обработчика не вышли, а уже может быть вызвано тоже самое прерывание.

_________________
Много говорить и много сказать не одно и то же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 01:16 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 3365
Перед самым выходом из обработчика не забывайте проверить, не пришел ли новый request на это-же прерывание. Если пришел, то запустите обработчик повторно, не выходя из него. (обычная практика)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 11:18 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 42
Откуда: Томск
u37 тоже не то. Мне нужен аналог команды End Of Interrupt (EOI), только для ARM (cortex). В приведённой статье для ПК используется команда outportb(0x20, 0x20). Обычно она выполняется непосредственно перед выходом из функции-обработчика прерывания, но в SST после EOI диспетчер вызывается, прямо в контексте прерывания. Т.е. вызвав EOI, но оставаясь в контексте прерывания, мы разрешаем вложенные прерывания.

_________________
Много говорить и много сказать не одно и то же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 12:41 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 353
u37 писал(а):
Перед самым выходом из обработчика не забывайте проверить, не пришел ли новый request на это-же прерывание. Если пришел, то запустите обработчик повторно, не выходя из него. (обычная практика)

Если при выходе из прерывания обнаружится, что есть новый запрос, то сохраненные регистры восстанавливаться не будут и в новое прерывание мк войдет через 6 тактов, не уверен стоит ли при таком раскладе вручную что-то проверять .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 12:50 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
Если не найдёте цивильного метода - всегда есть нестареющая классика: подменить адрес возврата и выйти из прерывания. Возможно даже, это самый удобный метод - из-за registers banking.
Но я не спец, с армами дел не имел - так что вам всё равно читать документацию (arm exception handling и т.п.), может, прочитав, что получше найдёте.

Ну т.е. в собственно прерывании у вас будет минимум кода: сохранить регистры (и из банка тоже) и вызвать нужную функцию заменить адрес возврата на свою функцию - которая вызовет нужную, а потом вернёт регистры на место.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 13:17 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 613
Нет, повторный вход в уже активное прерывание невозможен. Да и не нужен. Выполните обычный стандартный выход в цикл while(1). Новое прерывание по этому же вектор, если оно было зафиксирован, вызовет новый вход в этот же обработчик.
Вы немного неправильно расценки концепцию


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 13:32 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 42
Откуда: Томск
BusMaster, не понял, при чём тут while(1)?
Вот рисунок 3 из статьи:
Изображение
В момент 2 - вызов прерывания. В момент 4 - обработка прерывания. В момент 7 выполнили EOI, тем самым разрешив это прерывание заново. Теперь, мы до момента 13 остаёмся в контексте прерывания (не сделали return из функции-обработчика). В в любой момент времени между 7-13 прерывание может быть опять вызвано. Там под рисунком 3 подробно расписано - три абзаца.

_________________
Много говорить и много сказать не одно и то же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 17:33 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 613
Замечательно.
Объясняю на пальцах. Согласно программинг-мануалу, если прерывание или исключение в данный момент активно, то возникающие запросы с тем же самым приоритетом не могут вытеснить уже активное прерывание. Как только прерывание становится неактивным, и если pending-бит, т.е. запрос был выставлен заново, произойдет немедленный повторный вход без возврата в основной режим. Значит, что для этого надо сделать? в конце кода обработчика прерывания программно ожидать (поллингом) повторного запроса по тому же прерыванию и как только оно получено, произвести выход из обработчика. Начнется процедура выхода и последующего входа заново.

PS. Предыдущее сообщение писал с неудобной мобилы с автоисправлением, поэтому следует читать "Выполните обычный стандартный выход после цикла while(!bit)"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 17:40 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 42
Откуда: Томск
BusMaster, это будет повторный вход в обработчик прерывания. К сожалению, для реализации SST такой способ не подойдёт...

_________________
Много говорить и много сказать не одно и то же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 18:03 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 613
У ARM указатель вершины стека прерываний - не кольцевой, в отличие от некоторых других МК. И рекурсивные входы в прерывания без выходов из них рано или поздно приведут к порче полезного содержимого ОЗУ и сбою.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывание в прерывании (для Super Simple Tasker)
СообщениеДобавлено: 07 ноя 2017, 18:11 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:07
Сообщения: 42
Откуда: Томск
Так мы выйдем, только позже, когда все более приоритетные задачи выполнятся. Самая большая глубина такой рекурсии равна количеству задач, оно задано жёстко. (одно из достоинств SST, которое подчёркивает автор, как раз и является более эффективное использование памяти по сравнению с обычными ОС. У нас не отдельный стек для каждой задачи, а общий для всех).

_________________
Много говорить и много сказать не одно и то же.


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

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


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

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


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

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

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