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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> ContextSwitcher_ISR (MegaAVR)
_Артём_
сообщение Jan 25 2012, 00:43
Сообщение #1


Гуру
******

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



ContextSwitcher_ISR выполняется с запретом вложенных прерываний (что логично).
Не понимаю такой момент: может ли нарушить работу системы прерывание не используещие сервисы Оси(если разрешить прерывания в ContextSwitcher_ISR), при том что гарантированно не будет прерываний используюший Ос (например записью 0 в TIMSK, ETIMSK - прерываний немного).
Вопрос возник потому что величина времи с полным запретом прерываний очень велика, теряются данные.
Спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2012, 07:29
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_Артём_ @ Jan 25 2012, 02:43) *
может ли нарушить работу системы прерывание не используещие сервисы Оси(если разрешить прерывания в ContextSwitcher_ISR), при том что гарантированно не будет прерываний используюший Ос (например записью 0 в TIMSK, ETIMSK - прерываний немного).
Нет, не нарушит. Для такого прерывания ContextSwitcher_ISR ничем не отличается от фоновой задачи в "обычной" системе. И раз "обычные" системы работают...


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Jan 25 2012, 08:00
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Только запретить прерывание системного таймера может быть мало — другие «осевые» прерывания могут возникать. Разрешить прерывания — и они полезут.
Или в конкретном приложении переключения процессов возникают только от таймера, асинхронно от периферии не возникают?

На мой взгляд, если переключение контекста (менее двухсот тактов процессора для AVR) — это слишком долго, то нужно что-то менять. Или более быстрый процессор, или невытесняющая ОС со всем «быстрым» в прерываниях.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jan 25 2012, 14:51
Сообщение #4


Гуру
******

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



Цитата(Сергей Борщ @ Jan 25 2012, 09:29) *
Нет, не нарушит. Для такого прерывания ContextSwitcher_ISR ничем не отличается от фоновой задачи в "обычной" системе. И раз "обычные" системы работают...


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

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

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

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


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

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

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

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

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

Не нашёл пока подходящего варианта.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 1 2012, 16:42
Сообщение #5


Гуру
******

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



Продолжаем разговор?
Имеет ли смысл такой код?
Код
    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 изменится не может?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 1 2012, 20:11
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (_Артём_ @ Feb 1 2012, 18:42) *
Имеет ли смысл такой код?
Если прерывание не использует сервисов ОС, то обертку OS::TISRW или подобную заводить в нем не нужно и TISR_StackSwitcher как-бы не нужен совсем.


--------------------
На любой вопрос даю любой ответ
"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
_Артём_
сообщение Feb 1 2012, 21:08
Сообщение #7


Гуру
******

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



Цитата(Сергей Борщ @ Feb 1 2012, 22:11) *
Если прерывание не использует сервисов ОС, то обертку OS::TISRW или подобную заводить в нем не нужно и TISR_StackSwitcher как-бы не нужен совсем.


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

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


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

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

Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 2 2012, 04:26
Сообщение #8


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

Цитаты лучше приводить из актуальной на данный момент доки (v4). Там тоже на эту тему есть слова (п 3.2.7.2), особенно текст предупреждения и и после него. Краткий вывод - не надо на процах, где нет аппаратной поддержки стека прерываний, это делать. Куда лучше организовывать код так, чтобы прерывания были быстрыми и "лёгкими" (если проблема с памятью под стеки процессов).


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 2 2012, 15:53
Сообщение #9


Гуру
******

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



Цитата(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 кГц (самая скоростная задача, остальное всё медленнее и соответственно проблем не вижу (пока не вижу?). Такая ситуёвина.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 2 2012, 17:13
Сообщение #10


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_Артём_ @ 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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 2 2012, 21:05
Сообщение #11


Гуру
******

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



Цитата(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 порта нет?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 3 2012, 03:45
Сообщение #12


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

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

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 3 2012, 14:49
Сообщение #13


Гуру
******

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



Цитата(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. Странно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 3 2012, 18:04
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_Артём_ @ Feb 3 2012, 20:49) *
А сколько бывало нужно?

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

Дык, напишите, вот и будет порт sm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 3 2012, 20:27
Сообщение #15


Гуру
******

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



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

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

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

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

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

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

Так что мне до порта, как до Луны (даже готовый зашить - и то дистанция не маленькая).
Go to the top of the page
 
+Quote Post

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

 


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


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