|
Начало работы with scmRTOS, Несколько вопросиков |
|
|
|
Feb 20 2008, 14:56
|
Частый гость
 
Группа: Новичок
Сообщений: 83
Регистрация: 2-02-06
Пользователь №: 13 912

|
Хочется научиться работать с этой штукой - scmRTOS & AVR(Atmega8) & IAR 4.30A ! Почитал темы которые есть на форуме, почитал User's Manual v2. Возникло некторое количество вопросов: 1. Какая последовательность создания проекта: мои предположения - создаем в IAR новый проект, тискаем добавить файлы в проект и добавляем OS_Kernel.cpp , OS_Services.cpp , OS_Target_asm.s90 , OS_Target_cpp.cpp , usrlib.cpp. В maim.cpp пишем Код #include <scmRTOS.h> . Затем каким то образом нужно создать самому как я понял scmRTOS_TARGET_CFG.h и scmRTOS_CONFIG.h, но как не ясно или их нужно тупо скопировать из примера автора и если что нада то менять. 2. Почему в примерах автор добавляет Код void OS::SystemTimerUserHook() { } void OS::IdleProcessUserHook() { } Так нужно делать всегда ? 3. Дальше >> понятно что для AVR передачу управления можно осуществить сгенерировав прерывание например от компоратора как описано в документации, но непонятно как нужно оформить функцию обработки этого прерывания, и чем она будет отличаться от функции обработки других прерываний. О взаимодействии между потоками пока вроде понятно. Может кто нить может описать последовательность начальных действий и привести пример кода или хотя бы шапку , где есть процессы и обработчики прерываний и передача управления. Мог написать что - нибудь глупое, потому как в круг моих понятий scmRTOS пока входит очень туманно или вообще не входит.
|
|
|
|
|
 |
Ответов
|
Mar 11 2008, 12:37
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Возникло пару вопросов. Допустим, есть три процесса: KeyMenu, EditTime, Blink. Порядок работы должен быть такой : 1) KeyMenu - навигация по пунктам меню. На этом этапе остальные два процесса находятся в ожидании. 2) Заходим в пункт меню "Настройка -> Время". После нажатия ENTER запускается функция, которая считывает время с RTC в переменные и выводит эти значения на ЖКИ. После этого необходимо запустить процессы EditTime и Blink. При этом необходимо перевести KeyMenu в ожидание, пока работают эти процессы. Процесс Blink - это просто инвертирование текущего знакоместа с периодом 1 сек. 3) После окончания ввода времени, EditTime и Blink снова переводятся в ожидание, а KeyMenu переходит в состояние готовности.
Первый вопрос. Как это лучше организовать? И второй вопрос скорее по C++. Мой проект состоит из нескольких С-файлов. В tasks.c я вынес все процессы и объявления объектов. Как в другом С-файле использовать методы объекта?
PS. В другом С-файле, в котором необходимо вызвать ef.Signal(); просто объявил extern OS::TEventFlag ef; как это обычно делается с переменными и компилятора это устроило, хотя в учебнике С++ сказано, что данные-члены не могут определятся с модификаторами auto, extern, register
|
|
|
|
|
Mar 11 2008, 16:48
|

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

|
Цитата(alux @ Mar 11 2008, 14:37)  3) После окончания ввода времени, EditTime и Blink снова переводятся в ожидание, а KeyMenu переходит в состояние готовности. А смысл делать EditTime отдельным процессом? Мне кажется он просится функцией (возможно - функцией-членом класса TTimer), вызываемой из KeyMenu, но никак не отдельным процессом. Что касается Blink - он может ожидать некое сообщение (скажем, BLINK_ON) и получив его - мигать, пока не получит сообщение BLINK_OFF. Он может также получать сообщения SHORT_FLASH (одна короткая вспышка), LONG_FLASH (одна длинная вспышка) и другие, или сообщение может представлять из себя структуру, в которой записаны частота мигания, скважность, длительность.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 11 2008, 20:31
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(Сергей Борщ @ Mar 11 2008, 20:48)  А смысл делать EditTime отдельным процессом? Мне кажется он просится функцией (возможно - функцией-членом класса TTimer), вызываемой из KeyMenu, но никак не отдельным процессом. Так изначально у меня ф-ция EditTime вызывалась из функции пункта меню "Настройка -> Время" . В этой ф-ции в вечном цикле опрашивались кнопки и происходило редактирование времени. Естественно, контроллер больше ничего не делал, кроме прерываний. Только ждал нажатия ESC, которое вывело бы его из вечного цикла. Это было до использования ОС. Поэтому я решил сделать EditTime отдельным процессом. Scan_code нажатой кнопки получаю в прерывании таймера 2, который запускается в обработчике внешнего прерывания от нажатия кнопки. Код OS_PROCESS void TKeyMenu::Exec() { for(;;) { if(key_code.scan & KEY_PRESSED) { key_code.scan &= (0xff-KEY_PRESSED); // Clear MSB of scan_code (key_pressed) switch(key_code.scan) { case UP: SET_MENU(PREVIOUS); break; case DOWN: SET_MENU(NEXT); break; case LEFT: SET_MENU(PARENT); break; case RIGHT: SET_MENU(SIBLING); break; } } Sleep(10); } }
//----------------------------------------------------- OS_PROCESS void TEditTime::Exec() { for(;;) { ef.Wait(); if(key_code.scan & KEY_PRESSED) { key_code.scan &= (0xff-KEY_PRESSED); // Clear MSB of scan_code (key_pressed) switch(key_code.scan) { case LEFT: //k_esc // выйти из редактирования. Возврат к предыдущему пункту меню break; case RIGHT: //k_enter // переход к следующему параметру break; case DOWN: //k_left // перевод курсор на один символ влево break; case UP: //k_right // перевод курсора на один символ вправо break; default: // 0...9 //цифровые кнопки break; } } Sleep(3); } }
//--------------------------------------------------------------------------- OS_PROCESS void TBlink::Exec() { for(;;) { ef.Wait(); ks0108InvertRect(x, y, w, 9); Sleep(500); } } EditTime и Blink ждут сигнала от функции, которая вызывается при входе в пункт меню. Это мой первый опыт работы с ОС. Предложите что-нибудь лучше. А что такое функция-член класса TTimer ? Можно поподробней? Желательно с примером. Заранее спасибо.
|
|
|
|
|
Mar 11 2008, 22:31
|

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

|
Цитата(alux @ Mar 11 2008, 22:31)  Так изначально у меня ф-ция EditTime вызывалась из функции пункта меню "Настройка -> Время" . В этой ф-ции в вечном цикле опрашивались кнопки и происходило редактирование времени. Естественно, контроллер больше ничего не делал, кроме прерываний... Поэтому я решил сделать EditTime отдельным процессом. Так ведь и теперь у вас он во время EditTime не делает ничего в TKeyMenu. При этом у вас получилось, что EditTime работает изредка, а память под свой стек занимает всегда. Если бы вы сделали его функцией и вызывали из TKeyMenu - в остальное время этот стек мог бы быть использован другими частями TKeyMenu. Цитата(alux @ Mar 11 2008, 22:31)  А что такое функция-член класса TTimer ? Можно поподробней? Это я прочитал рекомендовавшуюся здесь книжку Гради Буча "Объектно-ориентированный анализ и проектирование" и пытаюсь применять полученные там знания. Он рекомендует вычленять в предметной области законченные абстракции и облекать их в вид классов. Вот у вас в системе судя по описанию есть некие часы, которые можно выделить в отдельную абстракцию. Они умеют считать время, их можно спросить "который час", их можно установить. Их можно реализовать в виде класса (обозвать его TTimer), который будет иметь только две открытые функции GetTime(), SetTime(). Внутрь этого класса спрятать (сделать private) счетчик времени и тем самым гарантировать, что никто его случайно не испортит - только вызвав явно SetTime(). Применяя в системе разные внешние микросхемы часов или программные часы, вам придется переписать только реализацию этого класса, вся остальная часть программы не будет зависеть от физической реализации часов. Вот изложил все это и понял, что функция EditTime имеет отношение скорее к интерфейсу пользователя, чем к часам, ее нет смысла делать членом класса TTimer, скорее она должна в конце своей работы вызвать SetTime().
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 12 2008, 06:48
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(Сергей Борщ @ Mar 12 2008, 02:31)  Так ведь и теперь у вас он во время EditTime не делает ничего в TKeyMenu. При этом у вас получилось, что EditTime работает изредка, а память под свой стек занимает всегда. Если бы вы сделали его функцией и вызывали из TKeyMenu - в остальное время этот стек мог бы быть использован другими частями TKeyMenu. Согласен. Мой способ мне самому не нравится. Процессов не хватит на каждый пункт меню. В TEditTime и TKeyMenu используются одинаковые конструкции Код for(;;) { if(key_code.scan & KEY_PRESSED) { key_code.scan &= (0xff-KEY_PRESSED); // Clear MSB of scan_code (key_pressed) switch(key_code.scan) { case UP: ......... break; case DOWN: ......... break; case LEFT: ......... break; case RIGHT: ......... break; } } Sleep(...); } Как бы использовать один процесс TKey, только для редактирования времени выполнять одно действие, а для навигации меню - другое.? Подозреваю, что здесь напрашивается создать класс... Но пока не знаю, как это реализовать. Опыта с ++ маловато.
|
|
|
|
|
Mar 12 2008, 08:06
|

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

|
Цитата(alux @ Mar 12 2008, 08:48)  Как бы использовать один процесс TKey, только для редактирования времени выполнять одно действие, а для навигации меню - другое.? Подозреваю, что здесь напрашивается создать класс... Могу предложить сделать абстрактный базовый класс с виртуальными функциями (методами) ActionUp(), ActionDown(), ActionLeft() ....От него унаследовать TMainMenu, TEditTime и остальные, в которых переопределить эти методы. Посмотрите пример 3 из комплекта ОСи - там как раз такой подход реализован при кормлении слонов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
URANst Начало работы with scmRTOS Feb 20 2008, 14:56 dxp Цитата(URANst @ Feb 20 2008, 20:56) . Зат... Feb 21 2008, 04:11 URANst Вот взял из примера , это обработчик прерывания, к... Feb 21 2008, 06:50 URANst С предыдущим вроде разобрался, все оказалось проще... Feb 21 2008, 11:55 IgorKossak ENABLE_NESTED_INTERRUPTS(); - разрешить вложенные ... Feb 21 2008, 12:14 URANst Так получается что 1 прерывание сис таймера - это ... Feb 21 2008, 12:36 spf Цитата(URANst @ Feb 21 2008, 17:36) Так п... Feb 21 2008, 14:14 alux Тоже решил попробовать эту ОС. Долго не мог решитс... Mar 2 2008, 17:02 dxp Цитата(alux @ Mar 2 2008, 23:02) Выдает п... Mar 3 2008, 04:55 alux Так что же мне делать в этом конкретном случае кро... Mar 3 2008, 06:53 IgorKossak Цитата(alux @ Mar 3 2008, 08:53) Может не... Mar 3 2008, 11:53  alux Цитата(IgorKossak @ Mar 3 2008, 15:53) Су... Mar 4 2008, 15:43   IgorKossak Цитата(alux @ Mar 4 2008, 17:43) В overvi... Mar 4 2008, 20:09 alux При включении моих исходников проекта на Си в прое... Mar 4 2008, 14:13 Сергей Борщ Цитата(alux @ Mar 4 2008, 16:13) Мой прое... Mar 4 2008, 16:02  dxp Цитата(Сергей Борщ @ Mar 4 2008, 22:02) Г... Mar 5 2008, 04:55   alux Цитата(dxp @ Mar 5 2008, 08:55) Регистра ... Mar 5 2008, 07:36    Сергей Борщ Цитата(alux @ Mar 5 2008, 09:36) Вот толь... Mar 5 2008, 10:49     Сергей С. Цитата(Сергей Борщ @ Mar 5 2008, 14:49) Н... Mar 6 2008, 06:53      Сергей Борщ Цитата(Сергей С. @ Mar 6 2008, 08:53) Как... Mar 6 2008, 13:26       Сергей С. Цитата(Сергей Борщ @ Mar 6 2008, 17:26) Е... Mar 6 2008, 20:14    dxp Цитата(alux @ Mar 5 2008, 13:36) Почему н... Mar 5 2008, 11:14    Stas633 И снова "уровень оптимизации".. / см.... Jul 30 2008, 18:42 alux Имеет ли значение уровень оптимизации компилятора ... Mar 4 2008, 16:09 alux Мне не понятно, почему для генерации программного ... Mar 9 2008, 21:15 Сергей Борщ Цитата(alux @ Mar 9 2008, 23:15) Мне не п... Mar 10 2008, 01:42  alux Цитата(Сергей Борщ @ Mar 10 2008, 05:42) ... Mar 10 2008, 04:40   ReAl Цитата(alux @ Mar 10 2008, 06:40) Почему?... Mar 10 2008, 09:08    alux Спасибо за разъяснение. Маленькое уточнение: sbi P... Mar 10 2008, 09:56     ReAl Цитата(alux @ Mar 10 2008, 11:56) Маленьк... Mar 10 2008, 15:36      alux Цитата(ReAl @ Mar 10 2008, 19:36) Глянул ... Mar 10 2008, 16:00       Сергей Борщ Цитата(alux @ Mar 10 2008, 18:00) Но это ... Mar 10 2008, 16:52 dxp Цитата(alux @ Mar 11 2008, 18:37) И второ... Mar 11 2008, 14:03     dxp Цитата(alux @ Mar 12 2008, 12:48) Согласе... Mar 12 2008, 09:06 alux Реализация меню - это отдельная тема для разговора... Mar 12 2008, 10:45 Сергей Борщ Цитата(alux @ Mar 12 2008, 12:45) PS. Нич... Mar 12 2008, 12:30  alux Спасибо, Сергей. Сам бы до этого не додумался.
... Mar 12 2008, 13:24   Сергей Борщ Цитата(alux @ Mar 12 2008, 15:24) В конст... Mar 12 2008, 16:26 alux Сделал так как Сергей сказал. За исключением того,... Mar 12 2008, 16:57 alux Проблема с повтором решена. Спасибо Сергею Борщу. ... Mar 14 2008, 08:55 alux Как узнать точное использование стека процессами? ... Mar 18 2008, 07:50 dxp Цитата(alux @ Mar 18 2008, 13:50) Как узн... Mar 18 2008, 09:02  alux Цитата(dxp @ Mar 18 2008, 13:02) Сергей Б... Mar 18 2008, 09:38   dxp Цитата(alux @ Mar 18 2008, 15:38) Что так... Mar 18 2008, 13:13  alux Цитата(dxp @ Mar 18 2008, 13:02) После эт... Mar 18 2008, 15:19   dxp Цитата(alux @ Mar 18 2008, 21:19) Уж изви... Mar 19 2008, 04:32    alux Цитата(dxp @ Mar 19 2008, 08:32) В данном... Mar 19 2008, 07:26     dxp Цитата(alux @ Mar 19 2008, 13:26) Что зна... Mar 19 2008, 09:42      alux Цитата(dxp @ Mar 19 2008, 12:42) Там все ... Jun 28 2008, 08:38       Сергей Борщ Цитата(alux @ Jun 28 2008, 11:38) Можно х... Jun 28 2008, 12:29        alux Цитата(Сергей Борщ @ Jun 28 2008, 15:29) ... Jun 28 2008, 18:11        alux Как определить размеры потребления RSTACK процесса... Apr 14 2009, 03:03         dxp Цитата(alux @ Apr 14 2009, 10:03) Как опр... Apr 14 2009, 06:04          alux Цитата(dxp @ Apr 14 2009, 09:04) Иначе (е... Apr 14 2009, 11:09           dxp Цитата(alux @ Apr 14 2009, 18:09) Не рабо... Apr 15 2009, 06:41 alux Обнаружил такую проблему. Если два процесса ждут о... Mar 19 2008, 13:15 dxp Цитата(alux @ Mar 19 2008, 19:15) Обнаруж... Mar 20 2008, 07:17  alux Цитата(dxp @ Mar 20 2008, 11:17) Возможно... Mar 21 2008, 09:07   dxp Цитата(alux @ Mar 21 2008, 15:07) Заменил... Mar 21 2008, 09:27 alux Попробовал создать отдельный ef2 для TProc2 и
Код... Mar 21 2008, 10:39 dxp Цитата(alux @ Mar 21 2008, 16:39) Попробо... Mar 21 2008, 13:58 alux Отладчиком (JTAG) не пользуюсь по причине отсутств... Mar 21 2008, 14:46 dxp Цитата(alux @ Mar 21 2008, 20:46) Отладчи... Mar 22 2008, 07:38 alux Вроде нашел еще один свой прокол : Скорость поступ... Mar 22 2008, 11:28 alux Прошу прощения за невнимательность. Проблема с обн... Mar 23 2008, 15:25 IgorKossak Цитата(alux @ Mar 23 2008, 17:25) ... в р... Mar 25 2008, 09:50 sevstels Хочу поинтересоваться, это только у меня не запуск... Mar 25 2008, 09:11 sevstels Тестировал на примерах scmRTOS v3 AVR.
Изменил тол... Mar 25 2008, 10:43 IgorKossak sevstels, приложите к сообщению файл проекта (.ewp... Mar 25 2008, 11:49 sevstels Пока пытаюсь найти причину сам.
Вот нашёл вот тут:... Mar 26 2008, 05:27 IgorKossak Цитата(sevstels @ Mar 26 2008, 07:27) DEN... Mar 26 2008, 06:23 Ykidia Здравствуйте! Есть небольшой проектик под scmR... Mar 26 2008, 10:33 spf Цитата(Ykidia @ Mar 26 2008, 15:33) Что н... Mar 26 2008, 10:42 Ykidia Хорошо-хорошо, уже создал. Зачем кричать-то? Mar 26 2008, 11:38 sevstels Игорь, в общем, ничего к сожалению не получается.
... Mar 27 2008, 03:48 IgorKossak Цитата(sevstels @ Mar 27 2008, 05:48) Иго... Mar 27 2008, 06:45  sevstels Цитата(IgorKossak @ Mar 27 2008, 15:45) Е... Apr 1 2008, 04:55 Stas633 Прошу прощения за предыдущий пост! (стыдно, н... Jul 30 2008, 20:30 Copypaster При отладке демо-приложения в IAREW v 4.11b для MS... Jul 28 2009, 11:16 IgorKossak Цитата(Copypaster @ Jul 28 2009, 14:16) П... Jul 28 2009, 12:36 Embedder74 Начал разбираться с scmRTOS.3.10. Ответьте, плз. н... Mar 24 2010, 10:09 AHTOXA Цитата(Embedder74 @ Mar 24 2010, 15:09) Н... Mar 24 2010, 12:51 dxp Цитата(Embedder74 @ Mar 24 2010, 16:09) Н... Mar 24 2010, 15:04  Embedder74 Цитата(dxp @ Mar 24 2010, 18:04) Как это ... Mar 25 2010, 06:50 Embedder74 Пользуясь случаем, хочу спросить у DXP. Когда прим... Mar 25 2010, 09:03 dxp Цитата(Embedder74 @ Mar 25 2010, 15:03) П... Mar 26 2010, 07:21 jorikdima Ну и я что ли спрошу.
Почему в проекте, написанном... Mar 26 2010, 08:46 dxp Цитата(jorikdima @ Mar 26 2010, 14:46) По... Mar 26 2010, 12:54  jorikdima Цитата(dxp @ Mar 26 2010, 15:54) Потому, ... Mar 26 2010, 13:24   Сергей Борщ Цитата(jorikdima @ Mar 26 2010, 15:24) По... Mar 26 2010, 13:40   dxp Цитата(jorikdima @ Mar 26 2010, 19:24) Со... Mar 26 2010, 14:48    jorikdima Цитата(dxp @ Mar 26 2010, 17:48) Кстати, ... Mar 27 2010, 06:51     dxp Цитата(jorikdima @ Mar 27 2010, 12:51) Пр... Mar 27 2010, 13:31      jorikdima Цитата(dxp @ Mar 27 2010, 16:31) А что, у... Mar 28 2010, 10:45
3 страниц
1 2 3 >
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|