|
1. Попробовал ипользовать scmRTOS (брал здесь _http://scmrtos.narod.ru/). Переделанный пример автора привожу ниже. Вопрос: как только привлекаю ОС к участию в обработке прерываний от таймера, работа программы нарушается.
2. Приблизительно тоже самое творится с uCOS- то работает, то нет. О похожей проблеме весной много писал Soic. Чем закончилась борьба с ОС у него?
#include DefineProcess(TSlonProc, 80); // 80 bytes Stack Size TSlonProc SlonProc (pr0); #define ZM 4 unsigned int DT0=5000; //#define OS_INT #ifdef OS_INT OS::TEventFlag EventFlag; //------------------------------------------------------------------------------ for(;;)
E-mail:
info@telesys.ru
DefineProcess(TMamontProc, 80); // 80 bytes Stack Size
DefineProcess(TSlonickProc, 80); // 80 bytes Stack Size
TMamontProc MamontProc (pr1);
TSlonickProc SlonickProc (pr2);
unsigned char en=1;
extern "C" OS_INTERRUPT void Timer_A1(void);
#pragma vector=TIMERA1_VECTOR
OS_INTERRUPT void Timer_A1(void)
{
OS::TISR_Wrapper ISR;
volatile unsigned int v;
v=TAIV;
CCR1 += DT0;
if(en) P3OUT^= ZM;
}
#else
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1( void )
{
volatile unsigned int v;
v=TAIV;
CCR1 += DT0;
if(en) P3OUT^= ZM;
}
#endif
int main()
{
P3DIR |= ZM;
OS::Run();
}
//------------------------------------------------------------------------------
OS_PROCESS void TSlonProc::Exec()
{
for(;;)
{
EventFlag.Wait();
{
TCritSec cs;
en= !en;
}
}
}
//------------------------------------------------------------------------------
OS_PROCESS void TMamontProc::Exec()
{
for(;;)
{
Sleep(60);
EventFlag.Signal();
}
}
//------------------------------------------------------------------------------
OS_PROCESS void TSlonickProc::Exec()
{
TACTL = TASSEL1 + TACLR; // Source = SMCLK, clear TAR
CCTL1 = CCIFG | CCIE; // CCR1 interrupt enabled
TACTL |= MC_2; // Start Timer_A in continuous mode
{
{
TCritSec cs;
// if(en) P3OUT^= ZM;
}
Sleep(2);
}
}
Ответы