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

 
 
 
Reply to this topicStart new topic
a9d
сообщение Jul 19 2011, 12:44
Сообщение #1


Местный
***

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



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

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

Или есть альтернатива где можно проводить софтварную отладку?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 19 2011, 12:57
Сообщение #2


Гуру
******

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



QUOTE (a9d @ Jul 19 2011, 15:44) *
Почему-то прерывание таймера не срабатывает.
И при чем здесь ОС?


--------------------
На любой вопрос даю любой ответ
"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
a9d
сообщение Jul 19 2011, 13:24
Сообщение #3


Местный
***

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



Запускаю проект без ОС. В нем используется таймер ноль. Все работает.

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

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


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


Ура завел.

выставил
#define scmRTOS_CONTEXT_SWITCH_SCHEME 0

Сообщение отредактировал a9d - Jul 19 2011, 15:07
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 20 2011, 10:58
Сообщение #4


Гуру
******

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



QUOTE (a9d @ Jul 19 2011, 16:24) *
Ура завел.

выставил
#define scmRTOS_CONTEXT_SWITCH_SCHEME 0
Это, как бы сказать, несколько другой (не самый лучший) вариант переключения задач. Посмотрите, какое прерывание используется в настройках вашего проекта (в scmRTOS_TARGET_CFG.h) для переключения контекста. Вероятнее всего - прерывание SPM. Проверьте, что протеус его корректно симулирует. Если некооректно - увы. При 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
haker_fox
сообщение Jul 20 2011, 13:05
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (a9d @ Jul 19 2011, 21:44) *
Но в протеусе не запускаются даже рабочие проекты. Почему-то прерывание таймера не срабатывает.

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

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

Софтварную отладку можно вести в симуляторе AVR Studio. Вроде Си++ код отлаживать там можно через файл *.elf
Там симулятор более-менее адекватный.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
a9d
сообщение Jul 20 2011, 14:40
Сообщение #6


Местный
***

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



Код
// enable and raise SPM interrupt
    INLINE inline void RaiseContextSwitch() { SPM_CONTROL_REG |= (1 << SPMIE);  }


Да именно он.

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

Думаю протеуса на первую неделю хватит. Все таки хоть где-то нужно проверять работу.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 20 2011, 17:48
Сообщение #7


Гуру
******

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



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


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Jul 20 2011, 19:39
Сообщение #8


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

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



Боюсь, имелось ввиду -o0 :-)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 20 2011, 19:51
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (ReAl @ Jul 20 2011, 21:39) *
Боюсь, имелось ввиду -o0 :-)

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
a9d
сообщение Jul 21 2011, 04:39
Сообщение #10


Местный
***

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


Гуру
******

Группа: Модераторы
Сообщений: 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 Текстовая версия Сейчас: 24th June 2025 - 15:20
Рейтинг@Mail.ru


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