|
Начало работы 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 18 2008, 07:50
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Как узнать точное использование стека процессами? А то я все делаю вслепую: выставил 100 - работает. Добавил ф-цию - зависает... Использую AVR (Mega324P). JTAG исключен из-за отсутствия свободных выводов. В симуляторе тоже проблематично (как получить ответ от перефирии I2C, SPI, ?..). Было бы совсем неплохо, если бы средствами ОС была возможность в отладочном режиме посмотреть размер неиспользуемого стека каждой задачи через терминал. Такую возможность я увидел в ОС нашего соотечественника uOS. Там для этой цели используется ф-ция task_stack_avail(). И второе. По поводу ф-ции Blink в режиме редактирования времени. Я это реализовал с использованием очереди сообщений, как в примере 3- Channel. Создал от базового класса TMsg объект Blink с методом InvertRect(...); Вопрос, собственно, заключается в следующем : Как обеспечить периодический MsgQueue.push(&Blink) ? Конечно, можно для этой цели использовать отдельный таймер, но хотелось бы обойтись системным таймером. Но не хочу использовать SystemTimerUserHook() по понятным причинам. Может воспользоваться OS::GetTickCount(); которая, на сколько я понял, возвращает общее количество тиков с момента запуска ОС ? Тогда при входе в п. меню "Редактирование" сохранить T = OS::GetTickCount(), а в низкоприоритетном процессе LCDProc отсчитывать от значения T 500 тиков (500*2=1сек) и тогда класть сообщение Blink в очередь. Также нужно учитывать переполнение счетчика. Что скажете?
|
|
|
|
|
Mar 18 2008, 09:02
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(alux @ Mar 18 2008, 13:50)  Как узнать точное использование стека процессами? Сергей Борщ советовал добавить в конструктор процесса memset, которая заполнит стековую память указанным значением. Стек для эксперимента надо взять с запасом. После этого делается прогон программы и анализируется глубина потребления стека. Цитата(alux @ Mar 18 2008, 13:50)  Вопрос, собственно, заключается в следующем : Как обеспечить периодический MsgQueue.push(&Blink) ? Конечно, можно для этой цели использовать отдельный таймер, но хотелось бы обойтись системным таймером. Но не хочу использовать SystemTimerUserHook() по понятным причинам. Может воспользоваться OS::GetTickCount(); которая, на сколько я понял, возвращает общее количество тиков с момента запуска ОС ? Тогда при входе в п. меню "Редактирование" сохранить T = OS::GetTickCount(), а в низкоприоритетном процессе LCDProc отсчитывать от значения T 500 тиков (500*2=1сек) и тогда класть сообщение Blink в очередь. Также нужно учитывать переполнение счетчика. Что скажете? А что является инициатором (источником события) этого блинка? Вот оно и должно пихать в очередь сообщение. Если надо просто периодически мигать, то запуск по счетчику тиков, имхо, не самое плохое решение (если в отдельный процесс не выносить, а запускать из имеющегося, выполняющиегося с заданной периодичностью).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Mar 19 2008, 09:42
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(alux @ Mar 19 2008, 13:26)  Что значит "руками" ? Руками - значит, остановить эмулятором прогон программы и посмотреть до куда стек заполнился. Цитата(alux @ Mar 19 2008, 13:26)  Или приведите, пожалуйста, пример функции. Предлагаете написать мне для вас функцию?  Там все это совсем не сложно - адрес объекта известен, размер его полей до стека тоже известен, отсюда можно вычислить адрес, где начинается стек. Размер стека тоже известен. По сути надо просто от начала стека пройти до первого значения, которое отличается от значения по умолчанию (того, которым заполнен стек сначала). Это и будет размер свободного пространства в стеке. Далее, можно это опять же эмулятором смотреть, а можно вываливать хоть на терминал или куда удобно.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 28 2008, 08:38
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(dxp @ Mar 19 2008, 12:42)  Там все это совсем не сложно - адрес объекта известен, размер его полей до стека тоже известен, отсюда можно вычислить адрес, где начинается стек. Размер стека тоже известен. По сути надо просто от начала стека пройти до первого значения, которое отличается от значения по умолчанию (того, которым заполнен стек сначала). Это и будет размер свободного пространства в стеке. Далее, можно это опять же эмулятором смотреть, а можно вываливать хоть на терминал или куда удобно. Хочу вернуться к актуальному для меня сегодня вопросу определения размеров потребления стека процессами. scmRTOS порт IAR, AVR. Можно хотя бы пару строк кода примера привести? Допустим, создан объект Код TKeyScan KeyScan; // Процесс обработки клавиатуры с параметрами Код typedef OS::process<OS::pr0, 250, 32> TKeyScan; // Proc1; Задача: вычислить реальные CSTACK, RSTACK , использованные этим процессом в runtime. Ну, а вывести эти значения на ЖКИ в виде числа - это не проблема. И второй вопрос. Размер CSTACK, RSTACK в опциях компилятора имеет отношение только к функциям, которые вызываются до запуска OS::Run() ?
|
|
|
|
|
Jun 28 2008, 12:29
|

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

|
Цитата(alux @ Jun 28 2008, 11:38)  Можно хотя бы пару строк кода примера привести?
Задача: вычислить реальные CSTACK, RSTACK , использованные этим процессом в runtime. Примерно так: добавляем в конструктор процесса заполнение стека каким-то числом и добавляем функции сканирования стека: Код template<TPriority pr, word stack_size> class process : public TBaseProcess { public: INLINE process() : TBaseProcess(&Stack[stack_size/sizeof(TStackItem)] , pr , (void (*)())Exec) { TStackItem *pDst = Stack; word Size = StackPointer - Stack; while(Size) { *pDst++ = 0xAB; --Size; } } static int StackFree() { word Free = 0; for(;;) // stack always has non-0xAB items. { if( Stack[Free] != 0xAB ) return Free; ++Free; } } static int StackUsed() { return stack_size - StackFree(); } ................ Для двухстекового варианта переделайте сами. Для простоты функции возвращают результат в количестве элементов стека (а не байтах, но для AVR они совпадают). Не проверял, но думаю идея понятна. Посмотрите также еще один вариант реализации. Цитата(alux @ Jun 28 2008, 11:38)  И второй вопрос. Размер CSTACK, RSTACK в опциях компилятора имеет отношение только к функциям, которые вызываются до запуска OS::Run() ? Да. Эти же стеки используются для прерываний, если вы выбрали #define scmRTOS_ISRW_TYPE TISRW_SS
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 14 2009, 03:03
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Как определить размеры потребления RSTACK процессами? Вариант Сергея Борща (сообщение #77) определения CSTACK работает, если функции-члены StackFree() и StackUsed() определить НЕ static, т.к. в них используется нестатические переменные Stack, RStack. Пробовал вставить в конструктор процесса: Код template<TPriority pr, word stack_size, word rstack_size> class process : public TBaseProcess { public: INLINE process() : TBaseProcess( &Stack[stack_size/sizeof(TStackItem)] , &RStack[rstack_size/sizeof(TStackItem)] , pr , (void (*)())Exec) { // Заполнить RSTACK процесса значением 0xAB TStackItem *pDst = RStack; word Size = GetReturnSP() - RStack; while(Size) { *pDst++ = 0xAB; --Size; } }
OS_PROCESS int RStackFree() { word Free = 0; for(;;) // stack always has non-0xAB items. { if( RStack[Free] != 0xAB ) return Free; ++Free; } } OS_PROCESS static void Exec(); private: TStackItem Stack [stack_size/sizeof(TStackItem)]; TStackItem RStack[rstack_size/sizeof(TStackItem)]; }; Безрезультатно. После этого программа даже не запускается
|
|
|
|
|
Apr 14 2009, 11:09
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(dxp @ Apr 14 2009, 09:04)  Иначе (если больше), то там Memory Overwrite со всеми вытекающими. Не работает, даже если уменьшить Size : Size = GetReturnSP() - RStack - 2; Странно, ведь при вычислении реального CSTACK эти функции работают...
|
|
|
|
Сообщений в этой теме
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 alux Возникло пару вопросов. Допустим, есть три процесс... Mar 11 2008, 12:37 dxp Цитата(alux @ Mar 11 2008, 18:37) И второ... Mar 11 2008, 14:03 Сергей Борщ Цитата(alux @ Mar 11 2008, 14:37) 3) Посл... Mar 11 2008, 16:48  alux Цитата(Сергей Борщ @ Mar 11 2008, 20:48) ... Mar 11 2008, 20:31   Сергей Борщ Цитата(alux @ Mar 11 2008, 22:31) Так изн... Mar 11 2008, 22:31    alux Цитата(Сергей Борщ @ Mar 12 2008, 02:31) ... Mar 12 2008, 06:48     Сергей Борщ Цитата(alux @ Mar 12 2008, 08:48) Как бы ... Mar 12 2008, 08:06     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 Цитата(dxp @ Mar 18 2008, 13:02) Сергей Б... Mar 18 2008, 09:38   dxp Цитата(alux @ Mar 18 2008, 15:38) Что так... Mar 18 2008, 13:13        alux Цитата(Сергей Борщ @ Jun 28 2008, 15:29) ... Jun 28 2008, 18:11           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 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|