Цитата(Acvarif @ Jul 1 2011, 09:56)

Понял. Спасибо. Попробую в железе.
Интересно а с AVR JTAG ice ОС будет крутиться? Или все будет как в симуляторе?
В железе (mega128a) пока ничего не получилось.
Пробую пока версию оси 310.
Код
//---------------------------------------------------------------------------
#include <scmRTOS.h>
//---------------------------------------------------------------------------
// Типы процессов
typedef OS::process<OS::pr0, 120, 32> TProc1;
typedef OS::process<OS::pr1, 160, 32> TProc2;
//---------------------------------------------------------------------------
// Создание объектов процессов (выделение под них памяти)
TProc1 Proc1;
TProc2 Proc2;
//---------------------------------------------------------------------------
dword T; // global variable for OS::GetTickCount testing
//
OS::TEventFlag ef; //
OS::TEventFlag Timer1_Ovf; //
dword Count;
dword Value;
//---------------------------------------------------------------------------
int main()
{
// Порт C0 на вывод
DDRC |= (1 << 0);
// Порт C1 на вывод
DDRC |= (1 << 1);
// Старт таймера 1 с прескаллером 1
TCCR1B |= (1 << CS10);
// Разрешить прерывания таймера 1
TIMSK |= (1 << OCIE1A);
// Старт системного таймера (таймер 0)
TCCR0 = 0x03;
// Разрешить прерывания таймера 0
TIMSK |= (1 << TOIE0);
// Пуск ОС
OS::Run();
}
//---------------------------------------------------------------------------
template<> void TProc1::Exec()
{
// бесконечный цыкл процесса 1
for(;;)
{
// ожидание переполнения таймера 1
Timer1_Ovf.Wait();
PORTC ^= (1 << 0);
}
}
//---------------------------------------------------------------------------
template<> void TProc2::Exec()
{
// бесконечный цыкл процесса 2
for(;;)
{
// ef.Wait();
PORTC ^= (1 << 1);
T += OS::GetTickCount();
Sleep(10);
}
}
//---------------------------------------------------------------------------
void OS::SystemTimerUserHook() { }
//---------------------------------------------------------------------------
void OS::IdleProcessUserHook() { }
//---------------------------------------------------------------------------
#pragma vector=TIMER1_COMPA_vect
OS_INTERRUPT void Timer1_period_ISR()
{
OS::TISRW_SS ISRW;
ENABLE_NESTED_INTERRUPTS();
PORTC ^= (1 << 0);
Timer1_Ovf.SignalISR();
}
//---------------------------------------------------------------------------
После загрузки в железо я по идее должен увидеть по крайней мере дрыгание PC0. Или нет?
Пока не допонимаю этот участок
Код
//---------------------------------------------------------------------------
void OS::SystemTimerUserHook() { }
//---------------------------------------------------------------------------
void OS::IdleProcessUserHook() { }
//---------------------------------------------------------------------------
#pragma vector=TIMER1_COMPA_vect
OS_INTERRUPT void Timer1_period_ISR()
{
OS::TISRW_SS ISRW;
ENABLE_NESTED_INTERRUPTS();
PORTC ^= (1 << 0);
Timer1_Ovf.SignalISR();
}
Если кому не сложно, подпишите пожалуйста комменты к этому участку
Щас попробую ос версии 400...
ОС 400 на mega128а не хочет компилиться. Известная ошибка Error[Pe020]: identifier "SPMCR" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\1-EventFlag\Src\scmRTOS_TARGET_CFG.h 104
закомментировал
Код
# if defined(SPM_READY_vect)
# define CONTEXT_SWITCH_ISR_VECTOR SPM_READY_vect
# define SPM_CONTROL_REG SPMCSR
# elif defined(SPM_RDY_vect)
# define CONTEXT_SWITCH_ISR_VECTOR SPM_RDY_vect
# define SPM_CONTROL_REG SPMCR
# else
# error "SPM ready interrupt vector not defined"
записал просто
Код
# define SPM_CONTROL_REG SPMCSR
Дальше больше
Error[Pe020]: identifier "TIMSK0" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\scmRTOS\Common\OS_Kernel.h 447
Error[Pe020]: identifier "TIMSK0" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\scmRTOS\Common\OS_Kernel.h 448
Error[Pe020]: identifier "TIMSK1" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\1-EventFlag\Src\main.cpp 130
Error[Pe020]: identifier "TCCR0B" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\1-EventFlag\Src\main.cpp 133
Error[Pe020]: identifier "TIMSK0" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\1-EventFlag\Src\main.cpp 134
Щас попробую побороть.
Подправил main
Код
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();
}
Это убрать не удается
Error[Pe020]: identifier "TIMSK0" is undefined c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\scmRTOS\Common\OS_Kernel.h 447
Error[50]: Undefined symbol:'CONTEXT_SWITCH_ISR_VECTOR' c:\Temp\ScmRtos\pre-v400\Samples\AVR\IAR\scmRTOS\AVR\OS_Target_asm.s90 281
Помогите, кому не сложно...