|
scmRTOS холостой ход и системный таймер |
|
|
|
Jul 4 2011, 11:56
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
"Продолжаем разговор" как говорил Карлсон. Запустил ОСь на mega128a в WinAvr (в скрепке проект - сделан на базе http://real.kiev.ua/scmrtos/1-eventflag/)В железе холостой ход явно просматривается, а прерываний системного таймера нет. Все, что зависит от него (это proc1, proc2 ..) естественнго не работает. Поскольку нет отладчика то понять в чем дело сложно. В IAR (v5501) ОСь не работает совсем (проект приложен в скрепке). В проекте сделана визуализация холостого хода и переполнения системного таймера (чего уж может быть проще). Поскольку в железе не видать не только системного таймера, но и холостого хода то получается, что зацикливание происходит в OS::Run(); Подсобите please разобраться ... Спасибо.
Сообщение отредактировал Acvarif - Jul 4 2011, 12:25
|
|
|
|
|
 |
Ответов
|
Jul 6 2011, 08:29
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
ОСь таки запустилась. Проблема была таки в компиляторе. Он не умеет правильно отличать mega128a от 128, хотя они ничем не отличаются кроме некоторых электрических характеристик (пример slon 1-EventFlag для mega128a, в настройках компилятора IAR AVR 5501,5511 нужно ставить mega128 в скрепке ). Просмотрев в железе прерывания системного таймера стало чуть грустно. Прерывания системного таймера (период 1,2 ms) явно нестабильны, хотя вроде ничего на прерывания T0 не должно влиять. Тоесть использовать системные тики для каких-либо более менее точных отсчетов нельзя. Но посмотрев на взаимодействие между вторым и третьим процессом особой нестабильности не заметил. ОСь начинает нравиться. Код template<> void TProc2::Exec() { for(;;) { ef.Wait(); PORTC |= (1 << 3);
} } //--------------------------------------------------------------------------- template<> void TProc3::Exec() { for(;;) {
Sleep(20); ef.Signal(); PORTC &= ~(1 << 3); } } Так до сих пор и не понял зачем в примере нужен аналоговый компаратор? Код ACSR |= (1 << ACBG) | (1 << ACIE); /* Ref ON, IE ON */ DDRB |= (1 << 4); /* AIN1*/ Если закоментировать этот код ничего не изменится. В документацци сказано о переключении контекстов. Дергание ногой должно вызывать прерывания по компаратору и соответственно переключение контекстов. Но где это дергание происходит? И какая все же разница между контекстом и процессом? Я так понимаю, что процесс это все вместе взятое - нить со своими переменными, регистрами стеком.
|
|
|
|
|
Jul 6 2011, 08:50
|

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

|
QUOTE (Acvarif @ Jul 6 2011, 11:29)  Так до сих пор и не понял зачем в примере нужен аналоговый компаратор? Посмотрите внимательно в scmRTOS_config.h чему равно scmRTOS_CONTEXT_SWITCH_SCHEME. Если 0, то компаратор не нужен. Если 1, то таки да, его прерывание переключает контекст. QUOTE (Acvarif @ Jul 6 2011, 11:29)  Но где это дергание происходит? Смотрите OS_Kernel.h, там есть строки CODE void OS::TKernel::SchedISR() { TPriority NextPrty = GetHighPriority(ReadyProcessMap); if(NextPrty != CurProcPriority) { SchedProcPriority = NextPrty; RaiseContextSwitch(); } } Вот RaiseContextSwitch() и есть дерганье ногой. Ищите его определение в OS_Target.h QUOTE (Acvarif @ Jul 6 2011, 11:29)  Я так понимаю, что процесс это все вместе взятое - нить со своими переменными, регистрами стеком. Контекст - содержимое регистров для процесса (плюс указатель стека, который в "нормальных" процессорах входит в регистры ядра).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 6 2011, 10:35
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Спасибо. Стало немного светлее. Цитата(Сергей Борщ @ Jul 6 2011, 11:50)  Посмотрите внимательно в scmRTOS_config.h чему равно scmRTOS_CONTEXT_SWITCH_SCHEME. Если 0, то компаратор не нужен. Если 1, то таки да, его прерывание переключает контекст. Код #define scmRTOS_CONTEXT_SWITCH_SCHEME 1 Получается, что если scmRTOS_CONTEXT_SWITCH_SCHEME = 1 то функция RaiseContextSwitch() просто разрешает глобальные прерывания Код #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
INLINE inline void RaiseContextSwitch() { SPM_CONTROL_REG |= (1 << SPMIE); } // enable SPM interrupt INLINE inline void BlockContextSwitch() { SPM_CONTROL_REG &= ~(1 << SPMIE); } // disable SPM interrupt Кто или что тогда всетаки переключает процессы? Или с какой частотой переключаются процессы? Кто ее формирует? Я так понимаю, что переключатель контекста и есть переключатель процессов? Может глупость сморозил...
|
|
|
|
|
Jul 6 2011, 10:57
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(MrYuran @ Jul 6 2011, 13:40)  Переключается по таймеру. Таймер дёргает прерывание (обычно самое низкоприоритетное), по которому вызывается диспетчер процессов. По-моему, так. (давно за инструмент не садился) Примерно так и думал. В данном случае получается, что переключателем процессов является Таймер 0 (он же системный таймер или формирователь тиков)? Зачем тогда еще один вариант переключения процессов (в данном примере scmRTOS_CONTEXT_SWITCH_SCHEME = 1 не работает) внешнее дергание ноги -> вызов таким образом какого нибудь низкоуровневого прерывания для переключения между процессами? Что это дает? Освобождает как то системный таймер?
Сообщение отредактировал Acvarif - Jul 6 2011, 11:01
|
|
|
|
Сообщений в этой теме
Acvarif scmRTOS холостой ход и системный таймер Jul 4 2011, 11:56   Сергей Борщ QUOTE (Acvarif @ Jul 6 2011, 13:35) Получ... Jul 6 2011, 11:47    Acvarif Цитата(Сергей Борщ @ Jul 6 2011, 14:47) Т... Jul 6 2011, 13:10    ReAl Цитата(Сергей Борщ @ Jul 6 2011, 14:47) В... Jul 6 2011, 20:49     Acvarif Спасибо.
Значит в примере от IAR 310 пропущено т... Jul 7 2011, 07:37      ReAl Цитата(Acvarif @ Jul 7 2011, 10:37) Значи... Jul 7 2011, 08:49       Acvarif ЦитатаВ случае "0" переключение производ... Jul 7 2011, 11:00        Acvarif Всем спасибо.
Появилось кое-какое понимание.
Пыт... Jul 7 2011, 14:00 ReAl 1. Подключение файлов к проекту смотрят не в доке ... Jul 7 2011, 20:07 Acvarif Да, понял. Спасибо.
С IAR плотно работал несколько... Jul 8 2011, 07:12 Acvarif Пролем с IAR AVR OCью (310) пока нет.
По ходу воз... Jul 9 2011, 09:01 ReAl 1. А почему нет? Даже не-константы можно, только в... Jul 9 2011, 09:45 Acvarif Цитата(ReAl @ Jul 9 2011, 12:45) 1. А поч... Jul 9 2011, 11:08  ReAl Конечно может.
Цитата(Acvarif @ Jul 9 2011, ... Jul 9 2011, 11:57   Acvarif Цитата(ReAl @ Jul 9 2011, 14:57) Интересн... Jul 11 2011, 17:25    dxp Цитата(Acvarif @ Jul 12 2011, 00:25) В sс... Jul 12 2011, 10:23     Acvarif Цитата(dxp @ Jul 12 2011, 13:23) А почему... Jul 12 2011, 13:46      MrYuran Цитата(Acvarif @ Jul 12 2011, 17:46) Дума... Jul 12 2011, 13:56 Acvarif Имеется три процесса.
1. Первый передача запросов ... Jul 13 2011, 10:35 AHTOXA В прерывании Usart0_rxc_ISR() надо вычитывать UDR0... Jul 13 2011, 12:15  Acvarif Цитата(AHTOXA @ Jul 13 2011, 15:15) В пре... Jul 13 2011, 13:00   Сергей Борщ QUOTE (Acvarif @ Jul 13 2011, 16:00) Проц... Jul 13 2011, 13:42    Acvarif Цитата(Сергей Борщ @ Jul 13 2011, 16:42) ... Jul 13 2011, 17:43 dxp Цитата(Acvarif @ Jul 12 2011, 20:46) Дума... Jul 14 2011, 03:34 Acvarif Цитата(dxp @ Jul 14 2011, 06:34) Вы имеет... Jul 14 2011, 06:55
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|