ОСь таки запустилась. Проблема была таки в компиляторе. Он не умеет правильно отличать mega128a от 128, хотя они ничем не отличаются кроме некоторых электрических характеристик (пример slon 1-EventFlag для mega128a, в настройках компилятора IAR AVR 5501,5511 нужно ставить mega128 в скрепке ).
Просмотрев в железе прерывания системного таймера стало чуть грустно.
Прерывания системного таймера (период 1,2 ms) явно нестабильны, хотя вроде ничего на прерывания T0 не должно влиять.
Тоесть использовать системные тики для каких-либо более менее точных отсчетов нельзя.
Но посмотрев на взаимодействие между вторым и третьим процессом особой нестабильности не заметил. ОСь начинает нравиться.
Код
template<> void TProc2::Exec()
{
for(;;)
{
ef.Wait();
PORTC |= (1 << 3);
}
}
//---------------------------------------------------------------------------
template<> void TProc3::Exec()
{
for(;;)
{
Sleep(20);
ef.Signal();
PORTC &= ~(1 << 3);
}
}
Так до сих пор и не понял зачем в примере нужен аналоговый компаратор?
Код
ACSR |= (1 << ACBG) | (1 << ACIE); /* Ref ON, IE ON */
DDRB |= (1 << 4); /* AIN1*/
Если закоментировать этот код ничего не изменится.
В документацци сказано о переключении контекстов. Дергание ногой должно вызывать прерывания по компаратору и соответственно переключение контекстов.
Но где это дергание происходит? И какая все же разница между контекстом и процессом? Я так понимаю, что процесс это все вместе взятое - нить со своими переменными, регистрами стеком.