реклама на сайте
подробности

 
 
> scmRTOS (версия 310) IAR AVR 5511 (mega128a)
Acvarif
сообщение Jun 30 2011, 08:29
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Попытался скомпилировать scmRTOS (версия 310) IAR AVR 5511 (mega128a) - (Error[Pe020]: identifier "SPMCR" is undefined ...\scmRTOS_TARGET_CFG.h 119). Похоже на несовместимость версий ОС и IAR? Может кто сталкивался. Как можно подправить?

С какой версией IAR AVR scmRTOS (версия 310) работает без исправлений?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Acvarif
сообщение Jun 30 2011, 11:42
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Acvarif @ Jun 30 2011, 11:29) *
Попытался скомпилировать scmRTOS (версия 310) IAR AVR 5511 (mega128a) - (Error[Pe020]: identifier "SPMCR" is undefined ...\scmRTOS_TARGET_CFG.h 119). Похоже на несовместимость версий ОС и IAR? Может кто сталкивался. Как можно подправить?

С какой версией IAR AVR scmRTOS (версия 310) работает без исправлений?


Вроде понял.
Если компилировать тестовый проект (во вложении) под Atmega32 все работает. Под 128a появляется вышеописанная ошибка потому, как в 128а име6ется регистр SPMCSR (Store Program Memory Control and Status Register), а в scmRTOS забит только SPMCR регистр (подходит для меги32).

Вот только где он забит и как это дело подправить пока не найду.

Помогите please, кому не лень

Цитата(Acvarif @ Jun 30 2011, 14:22) *
Вроде понял.
Если компилировать тестовый проект (во вложении) под Atmega32 все работает. Под 128a появляется вышеописанная ошибка потому, как в 128а име6ется регистр SPMCSR (Store Program Memory Control and Status Register), а в scmRTOS забит только SPMCR регистр (подходит для меги32).

Вот только где он забит и как это дело подправить пока не найду.

Помогите please, кому не лень


Нашел. Достаточно в файле scmRTOS_TARGET_CFG.h в строке #define SPM_CONTROL_REG SPMCR - SPMCR заменить на SPMCSR

Вообще у IAR какой-то кавардак с этими регистрами, в частности с их названиями. Неужели нельзя одни и те же по функциональности регистры называть одинаково? Хотя с другой стороны они поддерживаются того, что прописано в даташитах на девайсы.

Сообщение отредактировал Acvarif - Jun 30 2011, 11:23
Прикрепленные файлы
Прикрепленный файл  scmrtos_avr_iar_snapshot.rar ( 92.8 килобайт ) Кол-во скачиваний: 12
 
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jun 30 2011, 12:47
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Acvarif @ Jun 30 2011, 14:42) *
Нашел. Достаточно в файле scmRTOS_TARGET_CFG.h в строке #define SPM_CONTROL_REG SPMCR - SPMCR заменить на SPMCSR

Вообще у IAR какой-то кавардак с этими регистрами, в частности с их названиями. Неужели нельзя одни и те же по функциональности регистры называть одинаково? Хотя с другой стороны они поддерживаются того, что прописано в даташитах на девайсы.
Вот именно. Кавардак у Атмела.

У avr-gcc имена регистров -- простые #define на адреса, поэотму нет проблем с
Код
#ifdef SPMCR
#define SPM_CONTROL_REG SPMCR
#elif defined(SPMCSR)
#define SPM_CONTROL_REG SPMCSR
#else
#error SPM_CONTROL_REG is not defined
#endif
У IAR так сделать не выйдет, нужно поимённо проверять модели контроллеров. На всех не напасёшся, так что примеры сделаны под какие-то конкретные модели, при смене нужно менять.
В AVR-ских примерах под 4.0 я постарался напихать комментариев вида "пример рассчитан на XXX, для других может понадобиться изменение имён регистров", в документации коротко упомняуто где и что сидит по файлам примеров.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jun 30 2011, 12:54
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(ReAl @ Jun 30 2011, 15:47) *
В AVR-ских примерах под 4.0 я постарался напихать комментариев вида "пример рассчитан на XXX, для других может понадобиться изменение имён регистров", в документации коротко упомняуто где и что сидит по файлам примеров.


Да, верно. У Atmel.
А примеры под 4.0 где можно взять?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jun 30 2011, 16:32
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



И все же скажите пожалуйста под какую версию IAR AVR выполнены примеры scmRTOS v3.10? В Iar avr 5511 (mega32) (1_EventFlag) все компилится нормально, но в симуляторе работает с предупреждениями и неверно - зацикливается в ядре здесь

Код
        RaiseContextSwitch();
        do
        {
            EnableContextSwitch();
            DUMMY_INSTR();
            DisableContextSwitch();
        }
        while(!IsContextSwitchDone());


и в OS_Target.h здесь

Код
INLINE inline void EnableInterrupts() { __enable_interrupt();  }
INLINE inline void DisableInterrupts() { __disable_interrupt(); }

#pragma segment="CSTACK"
#pragma segment="RSTACK"

#define  ABS_WORD(x)  (*((volatile word*)x))

INLINE inline TStackItem* GetDataSP()   { return reinterpret_cast<TStackItem*>(ABS_WORD(28)); }
INLINE inline TStackItem* GetReturnSP() { return reinterpret_cast<TStackItem*>(SP); }

INLINE inline void SetISRStackPointers()
{
    ABS_WORD(28) = reinterpret_cast<word>(__segment_end("CSTACK"));
    SP = reinterpret_cast<word>(__segment_end("RSTACK")) - 1;
}

INLINE inline void SetDataSP(TStackItem* sp)   { ABS_WORD(28) = reinterpret_cast<word>(sp); }
INLINE inline void SetReturnSP(TStackItem* sp) { SP = reinterpret_cast<word>(sp); }

namespace OS
{
    INLINE inline void EnableContextSwitch()  { EnableInterrupts();  }
    INLINE inline void DisableContextSwitch() { DisableInterrupts(); }
}


(Thu Jun 30 19:04:28 2011: The stack pointer for stack 'RStack' (currently DATA:0x0001A5) is outside the stack range (DATA:0x000080 to
DATA:0x0000A0)
)

При переходе на mega128a в симуляторе виснуть начинает гораздо раньше (все время сидит на OS::Run();
И все же попробовал запустил в железе, надеясь увидеть дергание PINB4 по прериванию таймера 1 . В железе (под mega128a) не работает совсем. Очевидно так же как и в симуляторе висит.

Подскажите пожалуйста как все же запустить OS в симуляторе (в железе тоже должна заработать).
Очень уж хочется опробовать ее возможности и сравнить с обычной программой на C.
Привлекают (по документации) ее шустрость и небольшие требования к ресурсам железа.
Какраз для этого и железо имеется под рукой и реальная задача (асинхронный обмен и обработка данных по двум USART)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2011, 06:12
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Acvarif @ Jun 30 2011, 19:32) *
но в симуляторе работает с предупреждениями и неверно - зацикливается в ядре здесь
Симулятор ИАРа от рождения никогда не симулировал периферию. Никогда. И не собирается. А в переключателе контекста используется свойство периферии вызывать прерывание. Хотите в симуляторе - используйте scmRTOS_CONTEXT_SWITCH_SCHEME 0, но это будет уже другая программа, с другими требованиями к стекам и т.д. Не мучайте себя - отлаживайте сразу в железе.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jul 1 2011, 06:56
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(Сергей Борщ @ Jul 1 2011, 09:12) *
Симулятор ИАРа от рождения никогда не симулировал периферию. Никогда. И не собирается. А в переключателе контекста используется свойство периферии вызывать прерывание. Хотите в симуляторе - используйте scmRTOS_CONTEXT_SWITCH_SCHEME 0, но это будет уже другая программа, с другими требованиями к стекам и т.д. Не мучайте себя - отлаживайте сразу в железе.


Понял. Спасибо. Попробую в железе.
Интересно а с AVR JTAG ice ОС будет крутиться? Или все будет как в симуляторе?
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jul 1 2011, 08:38
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850



Цитата(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

Помогите, кому не сложно...

Сообщение отредактировал Acvarif - Jul 1 2011, 08:14
Прикрепленные файлы
Прикрепленный файл  ScmRtos400.rar ( 88.42 килобайт ) Кол-во скачиваний: 9
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Acvarif   scmRTOS (версия 310) IAR AVR 5511 (mega128a)   Jun 30 2011, 08:29
||- - Сергей Борщ   QUOTE (Acvarif @ Jul 1 2011, 09:56) Интер...   Jul 1 2011, 07:40
||- - Acvarif   Пока ничего не получается. Перешел опять на версию...   Jul 1 2011, 11:48
|- - AHTOXA   Цитата(Acvarif @ Jun 30 2011, 18:54) А пр...   Jun 30 2011, 17:04
|- - Acvarif   Цитата(AHTOXA @ Jun 30 2011, 20:04) Приме...   Jun 30 2011, 17:48
|- - Acvarif   Цитата(Acvarif @ Jun 30 2011, 20:48) Спас...   Jun 30 2011, 19:24
|- - AHTOXA   Цитата(Acvarif @ Jun 30 2011, 23:48) Може...   Jun 30 2011, 19:39
- - ReAl   Поставьте себе SVN Сделайте Кодsvn co http://s...   Jun 30 2011, 19:29
|- - Acvarif   Цитата(ReAl @ Jun 30 2011, 22:29) Поставь...   Jun 30 2011, 19:49
|- - AHTOXA   Цитата(Acvarif @ Jul 1 2011, 01:49) Прошу...   Jun 30 2011, 19:56
|- - Acvarif   Цитата(AHTOXA @ Jun 30 2011, 22:56) Хм. П...   Jun 30 2011, 20:36
|- - shreck   Цитата(Acvarif @ Jul 1 2011, 03:36) Thu J...   Jul 1 2011, 01:38
- - ReAl   Только сегодня добрался до этого вопроса. По дорог...   Jul 18 2011, 11:35


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016