Спасибо.
Значит в примере от IAR 310 пропущено только дрыгание ногой по прерываниям компаратора при scmRTOS_CONTEXT_SWITCH_SCHEME 1?
Или я опять недопонял...
Для уточнения
если
Код
#define scmRTOS_CONTEXT_SWITCH_SCHEME 0
переключение контекстов происходит по прерыванию записи во флешь (он - вектор прерывания все время взведен)
если
Код
#define scmRTOS_CONTEXT_SWITCH_SCHEME 1
по прерываниям от аналогового компаратора
В последнем случае немного непонятно. Получается, что прерывания по аналоговому компаратору тоже должны быть все время взведены?
Вобщем и целом тогда особой разницы в scmRTOS_CONTEXT_SWITCH_SCHEME нет?
Посмотрел pre 400, там код под IAR очень похож на WinAvr:
Код
//---------------------------------------------------------------------------
// "Hello, scope!" pins in pin_macros.h notation.
#define TIMER1_ISR D,5,H
#define TIMER1_TO_PROC1 B,0,H
#define PROC1 B,1,H
#define PROC2 B,2,H
#define PROC3 B,3,H
#define TIMER_HOOK B,4,H
#define IDLE_HOOK B,5,H
//---------------------------------------------------------------------------
//
// Process types
//
// demonstrate process switching from Proc2 to Proc3 in sleep() or ef.signal() call
#if PROC2_HIGHER_THAN_PROC3
# define PROC2_PRIO OS::pr1
# define PROC3_PRIO OS::pr2
#else
# define PROC2_PRIO OS::pr2
# define PROC3_PRIO OS::pr1
#endif
typedef OS::process<OS::pr0, 120, 32> TProc1;
typedef OS::process<PROC2_PRIO, 160, 32> TProc2;
typedef OS::process<PROC3_PRIO, 120, 32> TProc3;
template<> void TProc1::exec();
template<> void TProc2::exec();
template<> void TProc3::exec();
//---------------------------------------------------------------------------
//
// Process objects
//
TProc1 Proc1;
TProc2 Proc2;
TProc3 Proc3;
//---------------------------------------------------------------------------
tick_count_t tick_count; // global variable for OS::GetTickCount testing
OS::TEventFlag Timer1_Ovf; // set in TIMER1_COMPA_vect(), waited in Proc1
OS::TEventFlag ef; // set in Proc3, waited in Proc2
//---------------------------------------------------------------------------
int main()
{
TCCR1B = (1 << WGM12) | (1 << CS10); // CTC mode, clk/1
OCR1A = 40000U;
TIMSK = (1 << OCIE1A); // Timer1 OC interrupt enable
// Start System Timer
TCCR0 = (1 << CS01) | (1 << CS00); // clk/64
TIMSK |= (1 << TOIE0);
DRIVER(TIMER1_ISR,OUT);
DRIVER(TIMER_HOOK,OUT);
DRIVER(IDLE_HOOK,OUT);
//
OS::run();
}
Правда компилится без проблем
Я так понял, что там для идентичности с gcc добавлены функции типа DRIVER(TIMER1_ISR,OUT);
и др.