dsp4us 0 14 августа, 2008 Опубликовано 14 августа, 2008 · Жалоба Мы благополучно спортировали scmRTOS на Xtensa процессор и эта штука худо бедно работает. Сейчас мы усиленно занимаемся тестированием. Вот входе этого тестирования возникла ситуация которую не совсем понятно как решить. Переключение процессов осуществляется по программному прерыванию - естественно в критической секции где мы запоминаем маску разрешенных прерываний и отключаем их, в новом процесс - востанавливаем маску их стека этого нового процесса и т.д. Все замечательно. Но что происходит когда в контексте какого либо процесса какое либо прерывание глобально маскируется или наоборот разрешается - в этом случае в контексте другого процесса об этом никто не знает и все сбрасывается в первоначальное состояние?! Тоесть олучается при нашей реализации мы можем изменять прерывания только в контексте процессов а не глобально. Что не есть хорошо. Кто то может меня просвятить на зту тему - как в принцыпе в scmRTOS можно управлять прерываниями глобально и возможно ли это в других портах на других процессорах? И еще небольшое замечание/просьба для тех кто поддерживает веб сайт scmRTOS - сайт на английском но когда кликаешь на линк документации вываливает описание на русском языке. Английская версия там тоже есть но нужно изголяться и шарить ручками. Я думаю это займет всго лишь 5 минут добавить/исправить линк в тексте - все мои коллеги кому я давал ссылки на эту ОС по русски не говорят. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
solosh 0 14 августа, 2008 Опубликовано 14 августа, 2008 · Жалоба Сохраняется признак глобального состояния прерываний (разрешены/запрещены или текущий приоритет если есть таковой) плюс состояние флагов CPU. Маски отдельных прерываний не сохраняютя, т.е. если один процесс изменит, то увидят все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BlackPahan 0 14 августа, 2008 Опубликовано 14 августа, 2008 · Жалоба Автор данной ОСи в отпуске до 25.08 (ориентировочно). Он появляется в этом форуме под ником dxp. Так что ждите. Ответит и посоветует в полной мере и по-русски. Сайт поправят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 14 августа, 2008 Опубликовано 14 августа, 2008 · Жалоба Если уж очень хочется запоминать маску прерываний, то кто мешает ее запомнить в какой-нибудь глобальной переменной. Вот она и будет доступна для всех процессов. Какое это отношение имеет к сохранению/восстановлению контекста процесса? На мой взгляд - никакого. Контекст - это совокупность регистров процессора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dsp4us 0 15 августа, 2008 Опубликовано 15 августа, 2008 · Жалоба <Black Pahan> - Спасибо за инфу, подождем ... <solosh> - Вы правы "Сохраняется признак глобального состояния прерываний (разрешены/запрещены или текущий приоритет если есть таковой) плюс состояние флагов CPU.". Но дело то в том что "признак" я называю его маской прерываний запоминается в критической секции в стеке "старого/уходящего" процесса а новый признак востанавливается из стека "нового/приходящего" процесса. То есть все изменения сделанные в этой маске прерываний становяться не видными как только мы переключили процессы. <sergeeff> - тут вопрос не в том что я хочу чего то - Критическая секция и сделана с этой целью чтобы отменить все прерывания и сохранить всю информацию о тех которые были разрешены до этого что бы можно было востановить их состояния. Критическая секция выполнена как объект в конструкторе которого все это "сохранение" и происходит а в деструкторе востанавливается. Но при переключении процесса деструктор то выполняется в контексте другого процесса. тоесть StatusReg будет другой! Вот в чем загвоздка! //----------------------------------------------------------------------------- // // The Critital Section Wrapper // // class TCritSect { public: TCritSect () : StatusReg(_xtos_ints_off(0xFFFFFFFF)) { } ~TCritSect() { _xtos_ints_on(StatusReg); } private: TStatusReg StatusReg; }; Удачи всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
solosh 0 15 августа, 2008 Опубликовано 15 августа, 2008 · Жалоба <solosh> - Вы правы "Сохраняется признак глобального состояния прерываний (разрешены/запрещены или текущий приоритет если есть таковой) плюс состояние флагов CPU.". Но дело то в том что "признак" я называю его маской прерываний запоминается в критической секции в стеке "старого/уходящего" процесса а новый признак востанавливается из стека "нового/приходящего" процесса. То есть все изменения сделанные в этой маске прерываний становяться не видными как только мы переключили процессы. Есть ли другой способ запретить все прерывания на вашем процессоре кроме как через маски ? Бит в регистре, например, или приоритет. И покажите еще код _xtos_ints_off/_xtos_ints_on, а то непонятно что в StatusReg у вас сохраняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 15 августа, 2008 Опубликовано 15 августа, 2008 · Жалоба Переключение процессов осуществляется по программному прерыванию - естественно в критической секции где мы запоминаем маску разрешенных прерываний и отключаем их, в новом процесс - востанавливаем маску их стека этого нового процесса и т.д. Все замечательно. Но что происходит когда в контексте какого либо процесса какое либо прерывание глобально маскируется или наоборот разрешается - в этом случае в контексте другого процесса об этом никто не знает и все сбрасывается в первоначальное состояние?! Тоесть олучается при нашей реализации мы можем изменять прерывания только в контексте процессов а не глобально. Что не есть хорошо. Кто то может меня просвятить на зту тему - как в принцыпе в scmRTOS можно управлять прерываниями глобально и возможно ли это в других портах на других процессорах? В критической секции должны запрещаться только прерывания глобально, не затрагивая ресурсы управления индивидуальными прерываниями. Либо использовать иной способ исключить возможность перепланировки и изменения совместно используемых ресурсов ОС (запрещение прерываний - наиболее простой способ). Тогда все должно работать правильно. И еще небольшое замечание/просьба для тех кто поддерживает веб сайт scmRTOS - сайт на английском но когда кликаешь на линк документации вываливает описание на русском языке. Английская версия там тоже есть но нужно изголяться и шарить ручками. Я думаю это займет всго лишь 5 минут добавить/исправить линк в тексте - все мои коллеги кому я давал ссылки на эту ОС по русски не говорят. Поправлено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться