|
ContextSwitcher_ISR (MegaAVR) |
|
|
|
 |
Ответов
|
Jan 25 2012, 14:51
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Сергей Борщ @ Jan 25 2012, 09:29)  Нет, не нарушит. Для такого прерывания ContextSwitcher_ISR ничем не отличается от фоновой задачи в "обычной" системе. И раз "обычные" системы работают... Понятно. Тогда можно в дополнении к разрешению прерываний в ContextSwitcher_ISR убрать TCritSect из OS_ContextSwitchHook(правда там не очень долгий код). Цитата Только запретить прерывание системного таймера может быть мало — другие «осевые» прерывания могут возникать. Разрешить прерывания — и они полезут. Если плохо запретить, то полузут и всё посыпется, это ясно. Цитата Или в конкретном приложении переключения процессов возникают только от таймера, асинхронно от периферии не возникают? Только от таймера. От периферии не возникают (если и будут, то - вне ОСи). Цитата На мой взгляд, если переключение контекста (менее двухсот тактов процессора для AVR) — это слишком долго, то нужно что-то менять. Менять нужно, согласен. Но сложно. Цитата Или более быстрый процессор. АВР быстее не может. ARM ещё не освоен, то есть быстро не поменяешь. Цитата или невытесняющая ОС со всем «быстрым» в прерываниях. Не нашёл пока подходящего варианта.
|
|
|
|
|
Feb 1 2012, 16:42
|
Гуру
     
Группа: Свой
Сообщений: 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 изменится не может?
|
|
|
|
|
Feb 1 2012, 21:08
|
Гуру
     
Группа: Свой
Сообщений: 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 также должен сделать те же действия, кроме вызова планировщика. То есть может возникнуть экономия стека процессов (особенно в случае вложенных прерываний).
|
|
|
|
|
Feb 2 2012, 15:53
|
Гуру
     
Группа: Свой
Сообщений: 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 кГц (самая скоростная задача, остальное всё медленнее и соответственно проблем не вижу (пока не вижу?). Такая ситуёвина.
|
|
|
|
Сообщений в этой теме
_Артём_ ContextSwitcher_ISR (MegaAVR) Jan 25 2012, 00:43       AHTOXA Цитата(_Артём_ @ Feb 2 2012, 21:53) Пока ... Feb 2 2012, 17:13        _Артём_ Цитата(AHTOXA @ Feb 2 2012, 19:13) Это на... Feb 2 2012, 21:05         AHTOXA Цитата(_Артём_ @ Feb 3 2012, 03:05) Да на... Feb 3 2012, 03:45          _Артём_ Цитата(AHTOXA @ Feb 3 2012, 05:45) Я непр... Feb 3 2012, 14:49           AHTOXA Цитата(_Артём_ @ Feb 3 2012, 20:49) А ско... Feb 3 2012, 18:04            _Артём_ Цитата(AHTOXA @ Feb 3 2012, 20:04) Максим... Feb 3 2012, 20:27             AHTOXA Цитата(_Артём_ @ Feb 4 2012, 02:27) Семь.... Feb 4 2012, 11:52              _Артём_ Цитата(AHTOXA @ Feb 4 2012, 13:52) Ну хор... Feb 4 2012, 20:29               AHTOXA Цитата(_Артём_ @ Feb 5 2012, 02:29) P.S. ... Feb 5 2012, 14:04                _Артём_ Цитата(AHTOXA @ Feb 5 2012, 16:04) Я имел... Feb 6 2012, 01:56                 AHTOXA Цитата(_Артём_ @ Feb 6 2012, 07:56) Он же... Feb 6 2012, 03:43    WHALE Цитата(Сергей Борщ @ Feb 2 2012, 00:11) Е... Feb 9 2013, 06:18     dxp QUOTE (WHALE @ Feb 9 2013, 13:18) А если ... Feb 9 2013, 08:50 ReAl Только запретить прерывание системного таймера мож... Jan 25 2012, 08:00 ReAl Т.е., просто откладываем реакцию на этот флаг до т... Feb 9 2013, 08:49 WHALE Спасибо. У меня и работало в железе в таком вариан... Feb 9 2013, 19:30 Tiro Цитата(WHALE @ Feb 9 2013, 22:30) исправь... Feb 9 2013, 20:17 dxp QUOTE (WHALE @ Feb 10 2013, 02:30) З.Ы. И... Feb 10 2013, 12:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|