Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ContextSwitcher_ISR (MegaAVR)
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
_Артём_
ContextSwitcher_ISR выполняется с запретом вложенных прерываний (что логично).
Не понимаю такой момент: может ли нарушить работу системы прерывание не используещие сервисы Оси(если разрешить прерывания в ContextSwitcher_ISR), при том что гарантированно не будет прерываний используюший Ос (например записью 0 в TIMSK, ETIMSK - прерываний немного).
Вопрос возник потому что величина времи с полным запретом прерываний очень велика, теряются данные.
Спасибо.
Сергей Борщ
QUOTE (_Артём_ @ Jan 25 2012, 02:43) *
может ли нарушить работу системы прерывание не используещие сервисы Оси(если разрешить прерывания в ContextSwitcher_ISR), при том что гарантированно не будет прерываний используюший Ос (например записью 0 в TIMSK, ETIMSK - прерываний немного).
Нет, не нарушит. Для такого прерывания ContextSwitcher_ISR ничем не отличается от фоновой задачи в "обычной" системе. И раз "обычные" системы работают...
ReAl
Только запретить прерывание системного таймера может быть мало — другие «осевые» прерывания могут возникать. Разрешить прерывания — и они полезут.
Или в конкретном приложении переключения процессов возникают только от таймера, асинхронно от периферии не возникают?

На мой взгляд, если переключение контекста (менее двухсот тактов процессора для AVR) — это слишком долго, то нужно что-то менять. Или более быстрый процессор, или невытесняющая ОС со всем «быстрым» в прерываниях.
_Артём_
Цитата(Сергей Борщ @ Jan 25 2012, 09:29) *
Нет, не нарушит. Для такого прерывания ContextSwitcher_ISR ничем не отличается от фоновой задачи в "обычной" системе. И раз "обычные" системы работают...


Понятно.
Тогда можно в дополнении к разрешению прерываний в ContextSwitcher_ISR убрать TCritSect из OS_ContextSwitchHook(правда там не очень долгий код).

Цитата
Только запретить прерывание системного таймера может быть мало — другие «осевые» прерывания могут возникать. Разрешить прерывания — и они полезут.

Если плохо запретить, то полузут и всё посыпется, это ясно.

Цитата
Или в конкретном приложении переключения процессов возникают только от таймера, асинхронно от периферии не возникают?


Только от таймера.
От периферии не возникают (если и будут, то - вне ОСи).

Цитата
На мой взгляд, если переключение контекста (менее двухсот тактов процессора для AVR) — это слишком долго, то нужно что-то менять.

Менять нужно, согласен. Но сложно.

Цитата
Или более быстрый процессор.

АВР быстее не может.
ARM ещё не освоен, то есть быстро не поменяешь.
Цитата
или невытесняющая ОС со всем «быстрым» в прерываниях.

Не нашёл пока подходящего варианта.
_Артём_
Продолжаем разговор?
Имеет ли смысл такой код?
Код
    class TISR_StackSwitcher {
    public:
        INLINE TISR_StackSwitcher() {
            ISR_Enter();
        }
        INLINE ~TISR_StackSwitcher() {
            ISR_Exit();
        }
    private:
        INLINE void ISR_Enter() {
            TCritSect cs;
            if(Kernel.ISR_NestCount++ == 0) {
                SavedSP.DataSP   = GetDataSP();
                SavedSP.ReturnSP = GetReturnSP();
                SetISRStackPointers();
            }
        }
        INLINE void ISR_Exit() {
            TCritSect cs;
            if (--Kernel.ISR_NestCount==0) {
                SetReturnSP(SavedSP.ReturnSP);
                SetDataSP  (SavedSP.DataSP);
            }
        }
    };

Использовать предполагаю, в прерываниях не вызываюших сервисы ОС:
Код
#pragma vector=USARTE0_RXC_vect
__interrupt void ExtUartRx()
{
    OS::TISR_StackSwitcher ss;
    do {
        unsigned char i=USART_GetChar(&USARTE0);
        GsmRxPtr.WriteByte(i);
    } while (USART_IsRXComplete(&USARTE0));
}

Или эти действия излишни, и лучше использовать TISRW_SS?
В TISRW_SS не нравится следующий код:
Код
INLINE void ISR_Exit()
{
    TCritSect cs;
    if (--Kernel.ISR_NestCount==0) {
        SetReturnSP(SavedSP.ReturnSP);
        SetDataSP  (SavedSP.DataSP);
    }

    Kernel.SchedISR();
}

Зачем вызывать Kernel.SchedISR(), если в прерывании CurProcPriority изменится не может?
Сергей Борщ
QUOTE (_Артём_ @ Feb 1 2012, 18:42) *
Имеет ли смысл такой код?
Если прерывание не использует сервисов ОС, то обертку OS::TISRW или подобную заводить в нем не нужно и TISR_StackSwitcher как-бы не нужен совсем.
_Артём_
Цитата(Сергей Борщ @ Feb 1 2012, 22:11) *
Если прерывание не использует сервисов ОС, то обертку OS::TISRW или подобную заводить в нем не нужно и TISR_StackSwitcher как-бы не нужен совсем.


Тогда я что-то не понимаю.

Цитата('Из scmRTOS_v2.pdf')
Когда возникает прерывание, управление передается обработчику преры-
вания, который работает со стеком прерванного процесса. Это означает, что стек
процесса должен иметь размер, достаточный для работы как кода самого процес-
са, так и кода обработчиков прерываний. Причем дополнительные требования к
размеру стека определяются самым потребляющим обработчиком прерывания.
Более того, эти требования распространяются на все процессы, т.е. любой процесс
должен иметь размер стека с учетом возможности работы в этом стеке самого
«толстого» обработчика прерывания. В случае вложенных прерываний ситуация
еще более усугубляется.


TISRW_SS как я понял делает след. действия:
1) переключение стека, если не переключено.
2) востановление стека процесса, если Kernel.ISR_NestCount=1
3) запуск планировщика
Переключение стека делается для экономии стека процессов. Или нет?

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

dxp
QUOTE (_Артём_ @ Feb 2 2012, 04:08) *
Тогда я что-то не понимаю.
<...>
TISR_StackSwitcher также должен сделать те же действия, кроме вызова планировщика. То есть может возникнуть экономия стека процессов (особенно в случае вложенных прерываний).

Цитаты лучше приводить из актуальной на данный момент доки (v4). Там тоже на эту тему есть слова (п 3.2.7.2), особенно текст предупреждения и и после него. Краткий вывод - не надо на процах, где нет аппаратной поддержки стека прерываний, это делать. Куда лучше организовывать код так, чтобы прерывания были быстрыми и "лёгкими" (если проблема с памятью под стеки процессов).
_Артём_
Цитата(dxp @ Feb 2 2012, 06:26) *
Цитаты лучше приводить из актуальной на данный момент доки (v4).

Пока до v4 не добрался, застрял на v3.

Цитата(dxp @ Feb 2 2012, 06:26) *
Там тоже на эту тему есть слова (п 3.2.7.2), особенно текст предупреждения и и после него. Краткий вывод - не надо на процах, где нет аппаратной поддержки стека прерываний, это делать.

То есть практика показала, что переключать - выходит себе дороже?
Но тем не менее TISRW_SS из v4 никуда не делся и не изменился (на первый взгляд).

Цитата(dxp @ Feb 2 2012, 06:26) *
Куда лучше организовывать код так, чтобы прерывания были быстрыми и "лёгкими" (если проблема с памятью под стеки процессов).


Буду думать...

Цитата(dxp @ Feb 2 2012, 06:26) *
(если проблема с памятью под стеки процессов).


Есть ли проблема... это для меня большой вопрос, т.к. до недавнего времени ни какие Оси не использовал, то оценить мне трудно.
А что есть: АВР с 128/256 кБ flash + до 16кБ ram, на чём нужно написать сбор данных с АЦП с частотой 10-20 кГц (самая скоростная задача, остальное всё медленнее и соответственно проблем не вижу (пока не вижу?). Такая ситуёвина.
AHTOXA
Цитата(_Артём_ @ Feb 2 2012, 21:53) *
Пока до v4 не добрался, застрял на v3.

Это напрасно. v4 сейчас уже практически стабильна, содержит несколько полезных улучшений и важных исправлений. Тем более, если вы только начинаете работу с scmRTOS, то у вас нет старых проектов на третьей версии, и, следовательно, нет совсем никаких резонов её использовать.
Цитата
То есть практика показала, что переключать - выходит себе дороже?

Тут такое дело. Сегодня оно работает, а завтра вы поменяли ключи компиляции или версию компилятора, или добавили ещё одну переменную в обработчик прерывания -- и оно перестало работать. Ладно если вы это обнаружите сразу после изменения, тогда (возможно) причину найдёте быстро. А если чуть погодя? А если в дедлайн? sm.gif Короче, имхо, - овчинка выделки не стоит.
Цитата
Но тем не менее TISRW_SS из v4 никуда не делся и не изменился (на первый взгляд).

Оставили для совместимости. Ну или для крайних случаев, когда надо впихнуть невпихуемоеsm.gif
Цитата
А что есть: АВР с 128/256 кБ flash + до 16кБ ram, на чём нужно написать сбор данных с АЦП с частотой 10-20 кГц (самая скоростная задача, остальное всё медленнее и соответственно проблем не вижу (пока не вижу?). Такая ситуёвина.

Памяти вагон, а скорость без переключения стека будет даже больше. Нормульsm.gif
_Артём_
Цитата(AHTOXA @ Feb 2 2012, 19:13) *
Это напрасно. v4 сейчас уже практически стабильна, содержит несколько полезных улучшений и важных исправлений. Тем более, если вы только начинаете работу с scmRTOS, то у вас нет старых проектов на третьей версии, и, следовательно, нет совсем никаких резонов её использовать.

Да надо переходить, хотя фраза "практически стабильна" настораживает.
Ну да ладно, авось пронесёт.

Цитата(AHTOXA @ Feb 2 2012, 19:13) *
Тут такое дело. Сегодня оно работает, а завтра вы поменяли ключи компиляции или версию компилятора, или добавили ещё одну переменную в обработчик прерывания -- и оно перестало работать. Ладно если вы это обнаружите сразу после изменения, тогда (возможно) причину найдёте быстро. А если чуть погодя? А если в дедлайн? sm.gif Короче, имхо, - овчинка выделки не стоит.

Оставили для совместимости. Ну или для крайних случаев, когда надо впихнуть невпихуемоеsm.gif

Ясно, буду пробовать без переключателей.

Цитата(AHTOXA @ Feb 2 2012, 19:13) *
Памяти вагон, а скорость без переключения стека будет даже больше. Нормульsm.gif

Если на процесс выделить байт по 100-200-300, и таких процессов десяток/другой.
Вагон , не вагон, а тележка совсем не маленькая остаётся.
Только блокировку прерываний аккуратно убрать остаётся.

Хм..интересно, если TISRW_SS убрать то что мешает её на xmeg-е запустить? Надо попробовать.
Update: хорошая мысля приходит опосля. Мешает PMIC - Programmable Multi-level Interrupt Controller - без переделки не запустится. И пробовать не стоит.

A в scmRTOS v4 количество процессов по прежнему 32? Не маловато будет? Или увеличение количества просто приведёт к недопустимому увеличению времени переключения (или т.п. негативнем эффектам)? В uCOS вроде 54 процесса, что где-то логично - объёмы памяти выросли в разы за последние несколько лет.


Offtop. А для STM32F40x в v4 порта нет?
AHTOXA
Цитата(_Артём_ @ Feb 3 2012, 03:05) *
Да надо переходить, хотя фраза "практически стабильна" настораживает.

Я неправильно выразился. Имелось в виду - фактически является текущей стабильной версией.
Цитата
Если на процесс выделить байт по 100-200-300, и таких процессов десяток/другой.

Не представляю, зачем нужно столько процессов. По процессу на каждый из десятка датчиков? А смысл? Сделайте один процесс на все датчики, и опрашивайте их поочерёдно. Это выйдет и быстрее (нет накладных расходов на переключение задач), и менее затратно по памяти (нет расходов на контекст кучи процессов).
Цитата
Offtop. А для STM32F40x в v4 порта нет?

Нет. Но по идее должен пойти порт от STM32F1xx.
_Артём_
Цитата(AHTOXA @ Feb 3 2012, 05:45) *
Я неправильно выразился. Имелось в виду - фактически является текущей стабильной версией.

Я так и думал...

Цитата(AHTOXA @ Feb 3 2012, 05:45) *
Не представляю, зачем нужно столько процессов.

А сколько бывало нужно?


Цитата(AHTOXA @ Feb 3 2012, 05:45) *
По процессу на каждый из десятка датчиков? А смысл?

Нет смысла. Если датчики одинаковы, то один процесс на все безусловно.
Попробую прикинуть сколько нужно процессов, может насчёт того что 31 мало я ошибаюсь (не использовал ОС раньше - не отчего оттолкнуться).

Цитата(AHTOXA @ Feb 3 2012, 05:45) *
Нет. Но по идее должен пойти порт от STM32F1xx.

Ясно.
p.s. Чот я не одного порта под ARM-Keil не вижу, компилятор у них что ли не той системы? Вроде продукт качественный, лучше IAR. Странно.
AHTOXA
Цитата(_Артём_ @ Feb 3 2012, 20:49) *
А сколько бывало нужно?

Максимум того, что было лично у меня - семь процессов. Но это я очень торопился, там можно ещё улучшить схему взаимодействия.
Кстати, когда я пишу программы под винду, то использую ещё меньше процессов (вернее потоков) - два-три. Видимо потому, что там не нужно работать с периферией и прерываниями.
Цитата
p.s. Чот я не одного порта под ARM-Keil не вижу, компилятор у них что ли не той системы? Вроде продукт качественный, лучше IAR. Странно.

Дык, напишите, вот и будет порт sm.gif
_Артём_
Цитата(AHTOXA @ Feb 3 2012, 20:04) *
Максимум того, что было лично у меня - семь процессов. Но это я очень торопился, там можно ещё улучшить схему взаимодействия.

Семь. Хм...может программа простая...

Цитата(AHTOXA @ Feb 3 2012, 20:04) *
Кстати, когда я пишу программы под винду, то использую ещё меньше процессов (вернее потоков) - два-три.

У меня как-то наоборот: если сокет какой слушает порт или com-порт (к примеру), то поток, если таких сокетов/портов несколько, то каждый в своём потоке и в итоге потоков с десяток легко набегает. А программы не бог весть какие сложные...

Цитата(AHTOXA @ Feb 3 2012, 20:04) *
Дык, напишите, вот и будет порт sm.gif

Весь мой опыт работы а Keil-ARM:
Установил.
Подключил, не заработало.
Поставил драйвера, заработало.
Зашил программу моргания светодиодом, походил немного в отладчике.
Выключил.
Всё.

Так что мне до порта, как до Луны (даже готовый зашить - и то дистанция не маленькая).
AHTOXA
Цитата(_Артём_ @ Feb 4 2012, 02:27) *
Семь. Хм...может программа простая...

Ну хорошо, давайте навскидку придумайте больше семи независимых процессов в микроконтроллерной программеsm.gif
Цитата
У меня как-то наоборот: если сокет какой слушает порт или com-порт (к примеру), то поток, если таких сокетов/портов несколько, то каждый в своём потоке и в итоге потоков с десяток легко набегает. А программы не бог весть какие сложные...

У меня другой подход, я предпочитаю обрабатывать однообразные сокеты/порты в одном потоке (WSACreateEvent/WSAWaitForMultipleEvents для сокетов, WaitCommEvent + OVERLAPPED + оконные сообщения для портов). Просто с давних пор привык считать, что лишние потоки - это весьма накладно. Хотя при нынешних компьютерах это наверное уже не так.
_Артём_
Цитата(AHTOXA @ Feb 4 2012, 13:52) *
Ну хорошо, давайте навскидку придумайте больше семи независимых процессов в микроконтроллерной программеsm.gif

На днях попробую придумать программку на десяток потоков, если получится выложу мысли - посмеёмся.
P.S. Независимых == не взаимодействующих между собой?
Или достаточно так?
Код
#define  scmRTOS_PROCESS_COUNT              8


Цитата(AHTOXA @ Feb 4 2012, 13:52) *
Просто с давних пор привык считать, что лишние потоки - это весьма накладно. Хотя при нынешних компьютерах это наверное уже не так.

При нынешних контроллерах скоро не накладно будет (или уже не накладно?).
AHTOXA
Цитата(_Артём_ @ Feb 5 2012, 02:29) *
P.S. Независимых == не взаимодействующих между собой?

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

Да, переключение контекста в scmRTOS на кортексе 100 МГц всяко побыстрее, чем под win95 на 486DX4-100. Но памяти пока всё же поменьшеsm.gif
_Артём_
Цитата(AHTOXA @ Feb 5 2012, 16:04) *
Я имел в виду такие процессы, которые не могут быть обслужены одним потоком выполнения поочерёдно. То есть, например, ждущие различных прерываний.
(Хотя и в этом случае зачастую можно утоптать их в один поток, например, ставя из прерываний некие сообщения в очередь)

Понятно.

Цитата
Цитата

Offtop. А для STM32F40x в v4 порта нет?

Нет. Но по идее должен пойти порт от STM32F1xx.


Он же cortex-m3. Или разница между M3 и M4 для scmRtos не существенна?
AHTOXA
Цитата(_Артём_ @ Feb 6 2012, 07:56) *
Он же cortex-m3. Или разница между M3 и M4 для scmRtos не существенна?

Я не занимался ещё ими, но там вроде только плавучка добавляется? Если так, то, имхо, да, пойдёт.
WHALE
Цитата(Сергей Борщ @ Feb 2 2012, 00:11) *
Если прерывание не использует сервисов ОС, то обертку OS::TISRW или подобную заводить в нем не нужно и TISR_StackSwitcher как-бы не нужен совсем.

А если прерывание использует сервис ОС-сигналит флаг, но вложенные прерывания запрещены и срочной обработки(немедленного вызова шедулера) не требуется - можно также не использовать в нем обертку OS::TISRW?
ReAl
Т.е., просто откладываем реакцию на этот флаг до того, как пройдет следующее перепланирование из-за соответствующего вызова из какого-то потока либо из-за другого прерывания, имеющего TISRW ?

Похоже, можно.
Всякие signal_isr() ничего такого по цепочке вызовов не делают, что могло бы в неправильное состояние потроха ОС поставить.
dxp
QUOTE (WHALE @ Feb 9 2013, 13:18) *
А если прерывание использует сервис ОС-сигналит флаг, но вложенные прерывания запрещены и срочной обработки(немедленного вызова шедулера) не требуется - можно также не использовать в нем обертку OS::TISRW?

Можно. Передача управления произойдёт при одном из следующих вызовов планировщика (в зависимости от приоритета).
WHALE
Спасибо. У меня и работало в железе в таком варианте, но лучше быть уверенным,что сам себе бомбу не подкладываешь...

З.Ы. И что-бы два раза не вставать - исправьте,пожалуйста, очепятку в руководстве по scmRTOS version 4 в описании доступных операций с семафором OS::TMutex на стр.87 TMutex::unlock_usr() на TMutex::unlock_isr().

С уважением.
Tiro
Цитата(WHALE @ Feb 9 2013, 22:30) *
исправьте,пожалуйста, очепятку в руководстве по scmRTOS version 4 в описании доступных операций с семафором OS::TMutex на стр.87 TMutex::unlock_usr() на TMutex::unlock_isr().

Хоть бы букву выделил, а то я целую минуту искал отличия ))
dxp
QUOTE (WHALE @ Feb 10 2013, 02:30) *
З.Ы. И что-бы два раза не вставать - исправьте,пожалуйста, очепятку в руководстве по scmRTOS version 4 в описании доступных операций с семафором OS::TMutex на стр.87 TMutex::unlock_usr() на TMutex::unlock_isr().

У вас, очевидно, не самая свежая ревизия документа. Посмотрел, этой опечатки там нет. Смутно припоминаю, что несколько месяцев назад уже указывали на это приватно, было исправлено. Но всё равно спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.