Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ScmRTOS & Proteus
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
a9d
Кто-то знает почему ScmRTOS не работает в протеусе?

У меня ЧП. Нужно приступить к работе но микроконтроллер прибудет только через две недели.
Но в протеусе не запускаются даже рабочие проекты. Почему-то прерывание таймера не срабатывает.

Или есть альтернатива где можно проводить софтварную отладку?
Сергей Борщ
QUOTE (a9d @ Jul 19 2011, 15:44) *
Почему-то прерывание таймера не срабатывает.
И при чем здесь ОС?
a9d
Запускаю проект без ОС. В нем используется таймер ноль. Все работает.

Создаю проект с ОС. Таймер настроен верно(конфиг взят из рабочего проекта). Прерывание таймера не срабатывает.
Также в протеусе не работают проекты которые работают на железе.

ОС конечно же не причем. Это глюк протеуса. Но его можно както обойти?


PS^ Прерывание оказалось вызывается. Гдето в другом месте загвоздка.


Ура завел.

выставил
#define scmRTOS_CONTEXT_SWITCH_SCHEME 0
Сергей Борщ
QUOTE (a9d @ Jul 19 2011, 16:24) *
Ура завел.

выставил
#define scmRTOS_CONTEXT_SWITCH_SCHEME 0
Это, как бы сказать, несколько другой (не самый лучший) вариант переключения задач. Посмотрите, какое прерывание используется в настройках вашего проекта (в scmRTOS_TARGET_CFG.h) для переключения контекста. Вероятнее всего - прерывание SPM. Проверьте, что протеус его корректно симулирует. Если некооректно - увы. При scmRTOS_CONTEXT_SWITCH_SCHEME 0 совсем другие и времена передачи управления, и расход стека, и объем самой программы.
haker_fox
QUOTE (a9d @ Jul 19 2011, 21:44) *
Но в протеусе не запускаются даже рабочие проекты. Почему-то прерывание таймера не срабатывает.

Или есть альтернатива где можно проводить софтварную отладку?

Протеус - красивая игрушка... отчасти... отчасти неплохой симулятор... но лишь отчасти...

Софтварную отладку можно вести в симуляторе AVR Studio. Вроде Си++ код отлаживать там можно через файл *.elf
Там симулятор более-менее адекватный.
a9d
Код
// enable and raise SPM interrupt
    INLINE inline void RaiseContextSwitch() { SPM_CONTROL_REG |= (1 << SPMIE);  }


Да именно он.

В студии отладить код немогу. Потому, что в DEBUG-mode он не компилится( в микроконтроллер не влазит).

Думаю протеуса на первую неделю хватит. Все таки хоть где-то нужно проверять работу.
Сергей Борщ
QUOTE (a9d @ Jul 20 2011, 17:40) *
В студии отладить код немогу. Потому, что в DEBUG-mode он не компилится( в микроконтроллер не влазит).
Что за DEBUG-mode? Какой компилятор вы вообще используете? При добавлении отладочной информации в .elf файл прошивки не должен увеличиваться ни на байт - отладочная информация в прошивку не попадает. А если по каким-то причинам в режиме компиляции с отладочной информацией у вас меняются другие ключи компиляции, отвечающие за уровень оптимизации и/или как-то влияющие на герерацию исполняемого кода, то надо эти причины просто устранить.
ReAl
Боюсь, имелось ввиду -o0 :-)
zltigo
QUOTE (ReAl @ Jul 20 2011, 21:39) *
Боюсь, имелось ввиду -o0 :-)

Ага, а потом будет заново "отлаживаться" sm.gif, поскольку отключение оптимизации это уже само по себе вернейший признак невменяемого кода sad.gif
a9d
Я использую плагин к эклипсу.
DEBUG - это отключение оптимизации и добавление отладочной информации.

Насколько я помню при включенной оптимизации код отлаживать гиблое дело. Компилятор может выкинуть строки кода на которых стоит бряка, избавиться от некоторых переменных и пошаговая трассировка будет работать неверно.

PS: Включил отладочную информацию.

Код
void TKernel::Sched()
{
    byte NextPrty = GetHighPriority(ReadyProcessMap);
    if(NextPrty != CurProcPriority)
    {
        SchedProcPriority = NextPrty;
    
        RaiseContextSwitch();
        do
        {
            EnableContextSwitch();
            DUMMY_INSTR();
            DisableContextSwitch();
        }
        while(!IsContextSwitchDone());
    }
}


Цикл никогда не завершается.

Также включил слежение за прерываниями. Во время работы срабатывает только TIMER0_OVF(Timer/Counter0 Overflow).
Сергей Борщ
QUOTE (a9d @ Jul 21 2011, 07:39) *
DEBUG - это отключение оптимизации и добавление отладочной информации.
В таком случае - в топку такой DEBUG. Включите добавление отладочной информации вручную. С оптимизацией это будет уже другой код, который, как вы пишете далее:
QUOTE (a9d @ Jul 21 2011, 07:39) *
выкинуть строки кода на которых стоит бряка, избавиться от некоторых переменных
Компилятор выкидывает только ненужное. Если он выкинул то, что вы считаете нужным - 99.9% ошибка у вас в коде.
QUOTE (a9d @ Jul 21 2011, 07:39) *
и пошаговая трассировка будет работать неверно.
Работет верно. Не нужно ожидать отражения каждого чиха вашего исходника в ассемблере. А в целом программа делает то, что попросил программист (но не всегда то, что он хотел wink.gif ). Пример:

CODE
int a = 1;
int b = 2;
int c = a + b;
PORTD = c * b;
При включенной оптимизации вы не увидете в ассемблере следов ни a, ни b, ни c. Но в PORTD будет записано число 6. Программа выполнила то, что вы задумали? Да. Оптимальнее, чем вы написали? Да. Какие претензии?
QUOTE (a9d @ Jul 21 2011, 07:39) *
Также включил слежение за прерываниями. Во время работы срабатывает только TIMER0_OVF(Timer/Counter0 Overflow).
В топку протеус.
CODE
INLINE inline void RaiseContextSwitch() { SPM_CONTROL_REG |= (1 << SPMIE);  }

QUOTE
When the SPMIE bit is written to one, and the I-bit in the Status Register is set (one), the SPM ready interrupt will be enabled. The SPM ready Interrupt will be executed as long as the SPMEN bit in the SPMCSR Register is cleared.
SPMEN нигде не устанавливается, прерывание SPM должно вызываться. Даже если бы был выставлен бит SPMEN он должен был бы сброситься через 4 такта, после чего - см. цитату выше. Все.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.