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

 
 
> Портирование scmRTOS на Xtensa. Вопрос о переключнении процессов
dsp4us
сообщение Aug 14 2008, 05:51
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 14-08-08
Пользователь №: 39 607



Мы благополучно спортировали scmRTOS на Xtensa процессор и эта штука худо бедно работает. Сейчас мы усиленно занимаемся тестированием. Вот входе этого тестирования возникла ситуация которую не совсем понятно как решить. Переключение процессов осуществляется по программному прерыванию - естественно в критической секции где мы запоминаем маску разрешенных прерываний и отключаем их, в новом процесс - востанавливаем маску их стека этого нового процесса и т.д. Все замечательно. Но что происходит когда в контексте какого либо процесса какое либо прерывание глобально маскируется или наоборот разрешается - в этом случае в контексте другого процесса об этом никто не знает и все сбрасывается в первоначальное состояние?! Тоесть олучается при нашей реализации мы можем изменять прерывания только в контексте процессов а не глобально. Что не есть хорошо. Кто то может меня просвятить на зту тему - как в принцыпе в scmRTOS можно управлять прерываниями глобально и возможно ли это в других портах на других процессорах?

И еще небольшое замечание/просьба для тех кто поддерживает веб сайт scmRTOS - сайт на английском но когда кликаешь на линк документации вываливает описание на русском языке. Английская версия там тоже есть но нужно изголяться и шарить ручками. Я думаю это займет всго лишь 5 минут добавить/исправить линк в тексте - все мои коллеги кому я давал ссылки на эту ОС по русски не говорят. Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dsp4us
сообщение Aug 15 2008, 03:40
Сообщение #2





Группа: Участник
Сообщений: 5
Регистрация: 14-08-08
Пользователь №: 39 607



<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;
};


Удачи всем.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:47
Рейтинг@Mail.ru


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