ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
111195 Топик полностью
Сергей Борщ (24.01.2008 19:36, просмотров: 192) ответил Сергей Борщ на А вот не уверен. Получается, что если флаг просигнален раньше, чем его кто-то начал ждать - флаг потеряется. Раньше не терялся. Поправил по этому варианту, но все равно не получается добиться исходной функциональности.
А вот снова промахнулся :( Теперь процесс, ждущий без таймаута нельзя разбудить с помощью OS::ForceWakeUpProcess() Гляньте, может так? http://scmrtos.svn.sourceforge.net/viewvc/scmrtos/trunk/Common/OS_Services.h?revision=108&view=markup
bool OS::TEventFlag::Wait(TTimeout timeout) { TCritSect cs; TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority); if(Value & PrioTag) { ClrPrioTag(Value, PrioTag); // clear flag for current process return true; } else { TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority]; p->Timeout = timeout; SetPrioTag(ProcessMap, PrioTag); // put current process to wait map ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from ready map Kernel.Scheduler(); ClrPrioTag(ProcessMap, PrioTag); // remove current process from wait list p->Timeout = 0; if( Value & PrioTag ) // if waked-up by signal() or signal_ISR() { ClrPrioTag(Value, PrioTag); // clear flag for current process return true; } // otherwice waked-up by timeout or // by OS::ForceWakeUpProcess() return false; } }Убрал цикл.