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

 
 
> ScmRTOS & Proteus
a9d
сообщение Jul 19 2011, 12:44
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Кто-то знает почему ScmRTOS не работает в протеусе?

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

Или есть альтернатива где можно проводить софтварную отладку?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
a9d
сообщение Jul 21 2011, 04:39
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Я использую плагин к эклипсу.
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).

Сообщение отредактировал a9d - Jul 21 2011, 09:38
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 21 2011, 09:56
Сообщение #3


Гуру
******

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



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 такта, после чего - см. цитату выше. Все.


--------------------
На любой вопрос даю любой ответ
"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



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 12:00
Рейтинг@Mail.ru


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