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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> scmRTOS (версия 310) IAR AVR 5511 (mega128a)
Acvarif
сообщение Jul 1 2011, 06:56
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 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
Сергей Борщ
сообщение Jul 1 2011, 07:40
Сообщение #17


Гуру
******

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



QUOTE (Acvarif @ Jul 1 2011, 09:56) *
Интересно а с AVR JTAG ice ОС будет крутиться? Или все будет как в симуляторе?
А что ей объективно может помешать?


--------------------
На любой вопрос даю любой ответ
"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, 08:38
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 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
сообщение Jul 1 2011, 11:48
Сообщение #19


Знающий
****

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



Пока ничего не получается. Перешел опять на версию оси 310.

Казалось бы, что может быть проще двух процессов...

В main устанавливается порт PC0 на вывод и запускается системный таймер

Код
    DDRC |= (1 << 0);

    TCNT0 = 0xf0;
    TCCR0 = 0x05;                  
    TIMSK |=  (1 << TOIE0);

теперь после запуска оси OS::Run();
прописываем процессы и перезагрузку системного таймера

Код
template<> void TProc1::Exec()
{
    for(;;)
    {
        PORTC ^= (1 << 0);
        Sleep(500);
    }
}
//---------------------------------------------------------------------------
template<> void TProc2::Exec()
{
    for(;;)
    {
        Sleep(10);
    }
}
//---------------------------------------------------------------------------
void OS::SystemTimerUserHook()
{
    TCNT0 = 0xf0;
}

в первом процессе я должен увидеть дергание ноги PC0.

Но... ничего подобного не видать.

Архив с проектом и настройками в скрепке...

Подсобите пожалуйста запустить ОС в железе.
Неуверен в настройках (файл scmRTOS_config.h)
Не могут ли фьюсы mega128a к этому иметь какое-то отношение? Хотя врядли потому, как обычный процедурный код на нем работает без проблем.

Сообщение отредактировал Acvarif - Jul 1 2011, 11:49
Прикрепленные файлы
Прикрепленный файл  ScmRtos310.rar ( 212.04 килобайт ) Кол-во скачиваний: 31
 
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 18 2011, 11:35
Сообщение #20


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

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



Только сегодня добрался до этого вопроса.
По дороге противно зашипел и погасил экран мой любимый Hameg HM1507-3 :-(

Всего-то нужно было добавить выделенную строку в файл OS_Target_asm.s90
Цитата
#if defined(__ATmega103__) || \
defined(__ATmega128__) || \
defined(__ATmega128A__) || \
defined(__ATmega1280__) || \
defined(__ATmega1281__) || \
defined(__ATmega2560__) || \
defined(__ATmega2561__) || \
defined(__AT90CAN128__) || \
defined(__AT90USB1286__) || \
defined(__AT90USB1287__) || \
defined(__AT90USB1287__)

#define HAS_RAMPZ 1
#endif
В pre-400 это и atmega1284 были добавлены, а сюда уже никто не лазил.
После этого пример из Вашего ScmRtos310.rar работает с обеими видами переключателя контекстов.

«повбивав би» c этими отдельными ключами компилятора для А-версий, которые ничем не отличаются от «просто» и «V-версий» :-)
Заодно тюкнул бы легонько по темечку IAR, который для С/С++ даёт макрос __HAS_RAMPZ__, а для ассемблера -- нет. Потому и приходиться городить процитированное выше.
Если собирать как для ATmega128 либо как для ATmega64(тут уже можно и A) -- работало и так.
А для ATmega128A в результате рассинхронизации мнения о размере стекового кадра у констурктора процесса в OS_Target_cpp.cpp и у переключателя контекстов в OS_Target_asm.s90 (в функцию которого входит и начальное «переключение» по OS_Start) «возврат» из OS_Start шёл куда попало.


p.s. Немного подчистил примеры и порт 3.10 и обновил в репозитории.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 07:02
Рейтинг@Mail.ru


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