Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы по scmRTOS
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Страницы: 1, 2, 3
koluna
Цитата(Сергей Борщ @ May 25 2009, 12:41) *
Да никаких, кроме обычных - обращение через указатель к уже уничтоженному объекту.


Ну с этим понятно... как обычно. Я думал, может, ещё что есть smile.gif
koluna
Здравствуйте! smile.gif

Смотрю в даташит и понять не могу...
Если использовать передачу управления на основе программного прерывания (аналоговый компаратор), то вывод МК AIN0 (10 для ATmega88) можно использовать как выход под свои нужды или нет?
Сергей Борщ
Цитата(n_bogoyavlensky @ Jun 10 2009, 13:20) *
Если использовать передачу управления на основе программного прерывания (аналоговый компаратор)
Да, можно. А вам обязательно, чтобы это было прерывание компаратора? Используйте прерывание SPM. Можно будет и AIN1 использовать под свои нужды. В одном из примеров была реализация.
ReAl
Цитата(n_bogoyavlensky @ Jun 10 2009, 13:20) *
Если использовать передачу управления на основе программного прерывания (аналоговый компаратор), то вывод МК AIN0 (10 для ATmega88) можно использовать как выход под свои нужды или нет?
Вход компаратора переключается на внутреннюю опору, вывод можно использовать как угодно.
koluna
Цитата(ReAl @ Jun 10 2009, 13:45) *
Вход компаратора переключается на внутреннюю опору


Это понятно.
Не было понятно что же твориться с самим выводом в этом случае...
Теперь понятно. Спасибо за разъяснения smile.gif

Цитата(Сергей Борщ @ Jun 10 2009, 13:41) *
Да, можно. А вам обязательно, чтобы это было прерывание компаратора? Используйте прерывание SPM.


Посмотрим! Спасибо! smile.gif
koluna
Цитата(Сергей Борщ @ Jun 10 2009, 14:41) *
Да, можно. А вам обязательно, чтобы это было прерывание компаратора? Используйте прерывание SPM. Можно будет и AIN1 использовать под свои нужды. В одном из примеров была реализация.



Здравствуйте!
Скажите, пожалуйста, для организации передачи управления по прерыванию SPM какие действия надо предпринять?
Смотрю примеры: 1-ый и 3-ий - то, что нужно. Но до конца пока не разобрался.

1. Использовать файл scmRTOS_TARGET_CFG.h из 1-го или 3-го примера.
2. В файле scmRTOS_CONFIG.h: #define scmRTOS_CONTEXT_SWITCH_SCHEME 1.

Ещё что-нибудь надо написать, чтобы заработало?
koluna
Не работает! sad.gif
Прямая передача управления работает, а передача управления по программному прерыванию не работает sad.gif
Смотрел осциллографом.
Такое ощущение, что первый поток начинает выполняться и... зависает...
В чём может быть дело?
Может быть я что-то не дописал? smile.gif

Уточняю.
Система работает до первого вызова Sleep из первого потока.
ReAl
Цитата(n_bogoyavlensky @ Jun 22 2009, 21:12) *
Не работает! sad.gif
Прямая передача управления работает, а передача управления по программному прерыванию не работает sad.gif

Странно.
В порте avr-gcc все примеры проверялись в железе c осциллографом с разными сочетаниями разрешения вложенных прерываний и методом переключения контекстов, но с WinAVR-20071221, 20070525.
koluna
Цитата(ReAl @ Jun 22 2009, 23:38) *
Странно.
В порте avr-gcc все примеры проверялись в железе c осциллографом с разными сочетаниями разрешения вложенных прерываний и методом переключения контекстов, но с WinAVR-20071221, 20070525.



Я пробую с WinAVR 20080610.
Исходники прилагаю (main.cpp, scmRTOS_CONFIG.h, scmRTOS_TARGET_CFG.h).
Посмотрите, пожалуйста, а то я уже голову сломал smile.gif
ReAl
Цитата(n_bogoyavlensky @ Jun 23 2009, 06:36) *
Я пробую с WinAVR 20080610.
Исходники прилагаю (main.cpp, scmRTOS_CONFIG.h, scmRTOS_TARGET_CFG.h).
Посмотрите, пожалуйста, а то я уже голову сломал smile.gif

Хм. В коде всё нормально.
Версия avr-gcc - значение опции MAKE_SMALLEST_HEX в makefile - размер кода/данных - работа в макете с atmega168@intRC8MHz
(опция MAKE_SMALLEST_HEX для 20060421 работает, так как у себя я заменил этой версии ldscripts на более новые с KEEP() для нужных секций).
Именно 20080610 у меня на компьютере нет и лень ставить.
Цитата
// 20060421-N - 3574/402 - OK
// 20071221-N - 3164/402 - OK
// 20081205-N - 3078/402 - OK
// 20090313-N - 3056/402 - OK

// 20060421-Y - 1218/402 - OK
// 20071221-Y - 1138/402 - OK
// 20081205-Y - 1052/402 - OK
// 20090313-Y - 1030/402 - OK
Прикладываю всё кучей аж с листингами, архив всё равно небольшой.
Попробуйте сверить ключи компилятора, хотя у меня ничего такого особого не прописано.
koluna
Цитата(ReAl @ Jun 23 2009, 12:42) *
Хм. В коде всё нормально.
Версия avr-gcc - значение опции MAKE_SMALLEST_HEX в makefile - размер кода/данных - работа в макете с atmega168@intRC8MHz
(опция MAKE_SMALLEST_HEX для 20060421 работает, так как у себя я заменил этой версии ldscripts на более новые с KEEP() для нужных секций).
Именно 20080610 у меня на компьютере нет и лень ставить.
Прикладываю всё кучей аж с листингами, архив всё равно небольшой.
Попробуйте сверить ключи компилятора, хотя у меня ничего такого особого не прописано.


Спасибо.
Ваш hex попробуем.
Посмотрим на мейк.
Скомпилировал в 2007. Вечером проверю. Доложу.

Кстати, а оптимизация не может негативно влиять?

У вас, я смотрю, оптимизация совсем никакая: опция OPT = -Os smile.gif
И ещё по поводу стандарта.
У вас -std=c++98, у меня не знаю что Code::Blocks компилятору подсовывает sad.gif
ReAl
Цитата(n_bogoyavlensky @ Jun 23 2009, 13:19) *
Кстати, а оптимизация не может негативно влиять?
У вас, я смотрю, оптимизация совсем никакая: опция OPT = -Os smile.gif
Самая правильная оптимизация для AVR
Вот за всякие дополнительные ручки по поводу лимита размера для inline и тому подобное - да, не дёргаю. И так не плохо.
Не думаю, что -O2 должна сильно поменять ситуацию.

Цитата(n_bogoyavlensky @ Jun 23 2009, 13:19) *
И ещё по поводу стандарта.
У вас -std=c++98, у меня не знаю что Code::Blocks компилятору подсовывает sad.gif
Там оно вроде бы закомментировано, так что будет использоваться умолчание (gnu++98 для С++)
koluna
Цитата(ReAl @ Jun 23 2009, 14:44) *
Самая правильная оптимизация для AVR
Вот за всякие дополнительные ручки по поводу лимита размера для inline и тому подобное - да, не дёргаю. И так не плохо.
Не думаю, что -O2 должна сильно поменять ситуацию.


Виноват, буковку "s" не заметил.
Я сегодня совсем сплю sad.gif

Кстати, посмотрел на описание оптимизации (перевод книги по GCC), там, вроде бы, часть флагов компилятора для разных режимов оптимизации смешивается...
Допустим, -Os включает -O3 и добавляет свои флаги...
-O3 включает -O2 и добавляет свои флаги...
-O2 включает -O и добавляет свои флаги...
А -O1 и -O вообще одно и то же...
Т. е., получается, что совместно использовать, например -O2 и -Os смысла никакого нет, т. к., -Os включает -O2 и добавляет свои флаги?
Кстати, опции -Oi фактически являются "обёртками", которые указывают на включение других дополнительных опций, как я понял?

Цитата
Там оно вроде бы закомментировано, так что будет использоваться умолчание (gnu++98 для С++)


Ага, этого я тоже не заметил... wassat.gif


Ещё вопросы...
ISR вызывается в контексте того процесса, который выполнялся при возникновении прерывания?
Как я понимаю, оптимальное содержимое ISR - инструкция перевода какого-либо эвента в сигнальное состояние?
А если в ISR модифицируются глобальные объекты, которые модифицируются так же в одном из процессов (или в нескольких), то необходимо использовать средства синхронизации для доступа к этим объектам (критические секции, семафоры)?
Причём, внутри ISR прерывания запрещены всегда и получается, что критические секции в ISR использовать бессмысленно, а семафоры вообще противопоказано... и средства синхронизации нужно использовать вне ISR в процессах, работающих с нашим глобальным объектом?
Помогите разобраться, пожалуйста, а то в голове каша smile.gif
koluna
Откомпилировал в WinAVR 2007 - не работает.
Откомпилировал в WinAVR 20090313 - не работает.
То, что Вы прислали - тоже не работает! sad.gif

Может, конечно, Proteus глючит... нету сейчас железки под руками проверить...
Странно.
Займусь сверкой ключей...

А Вы в выложенной мною программе ничего не меняли?
В протеусе я вижу на PC1 сигнал со скважностью отличной от двух... очень отличной.
А на PC2 - вообще нуль...
А Вы когда смотрели осциллографом видели на обоих выводах какие сигналы? smile.gif
koluna
Огромная просьба, если Вас не затруднит, то проверьте, пожалуйста, на своём макете работу той же программы, откомпилированной у меня (файл Prob.elf.hex). Так мы и моё компилирование проверим и протеус...

ATmega168.
8000000 MHz.
WinAVR20090313.
ReAl
Цитата(n_bogoyavlensky @ Jun 23 2009, 22:16) *
То, что Вы прислали - тоже не работает! sad.gif
Ну не знаю...
Цитата(n_bogoyavlensky @ Jun 23 2009, 22:16) *
А Вы в выложенной мною программе ничего не меняли?
Я же прицепил полный проект, который я собирал.
Не менял ничего, только приложил рядом сам scmRTOS и свои make-файлы
Цитата(n_bogoyavlensky @ Jun 23 2009, 22:16) *
А Вы когда смотрели осциллографом видели на обоих выводах какие сигналы? smile.gif
Меандры около 20мс и 60мс длительности уровня. 8MHz int RC в качестве тактирования. На время прошивки очередного варианта они пропадали :-)

Цитата(n_bogoyavlensky @ Jun 23 2009, 23:21) *
Огромная просьба, если Вас не затруднит, то проверьте, пожалуйста, на своём макете работу той же программы, откомпилированной у меня (файл Prob.elf.hex).
Ой, а это нескоро. С выходных до следующих выходных я уезжаю, а до этого не до того.
koluna
Цитата(ReAl @ Jun 24 2009, 20:43) *
Ой, а это нескоро. С выходных до следующих выходных я уезжаю, а до этого не до того.


Спасибо Вам большое за помощь! smile.gif
Нашёл железку. В четверг обязательно на ней сам проверю.
Скорее всего это глюки протеуса.
О результатах напишу...
koluna
Проверил в железе.
ATmega48P, 20 МГц, оба способа передачи управления.
Работает замечательно.

Обидно, что Proteus меня подвёл... sad.gif
Побегу жаловаться smile.gif

ReAL, это опции линкера, как я понял (из вашего мейка)?

Цитата
LDFLAGS += -Wl,--gc-sections
LDFLAGS += -Wl,--relax


А зачем -Wl два раза указан?
Сергей Борщ
Цитата(n_bogoyavlensky @ Jun 25 2009, 10:06) *
ReAL, это опции линкера, как я понял (из вашего мейка)?
Это опции, которые gcc передаст линкеру (ld).
Цитата(n_bogoyavlensky @ Jun 25 2009, 10:06) *
А зачем -Wl два раза указан?
Об этом можно прочитать в документации на gcc. -Wl "действует" до ближайшего пробела.
koluna
По поводу нашего давнего разговора в этой ветке о сокращении размера кода при компиляции...
Разобрался...
Для линкера надо было писать
-Wl,-Map=$(TARGET_OUTPUT_FILE).map,--cref,--gc-sections,--relax

Я писал:
-Wl,-Map=$(TARGET_OUTPUT_FILE).map,--cref
--gc-sections
--relax


Поэтому и не работало...

Цитата(Сергей Борщ @ Jun 25 2009, 11:22) *
Это опции, которые gcc передаст линкеру (ld).


Это понятно.
Я имею ввиду зачем две строчки с -Wl, если можно обойтись одной...
sevstels
Хотел попробовать запустить примеры для BF533.
К сожалению проект скомилировать не удаётся, ошибка такого плана:
".\Src\main.cpp", line 112: cc0167: error: argument of type
"void (*)(int, int, int)" is incompatible with parameter of type
"ex_handler_fn"
register_handler_ex(ik_timer, OS::SystemTimer_ISR, 1);
^

".\Src\main.cpp", line 113: cc0167: error: argument of type
"void (*)(int, int, int) C" is incompatible with parameter of type
"ex_handler_fn"
register_handler_ex(ik_ivg14, ContextSwitcher_ISR, 1);
^

2 errors detected in the compilation of ".\Src\main.cpp".
cc3089: fatal error: Compilation failed
ReAl
Цитата(n_bogoyavlensky @ Jun 25 2009, 10:25) *
Я имею ввиду зачем две строчки с -Wl, если можно обойтись одной...
Чтобы можно было закомментировать каждый ключ отдельно :-)


sevstels, я в режиме тормоза на старое ответил, по BF, увы, ничем помочь не могу
sevstels
уже решил заменой файлов из snapshot
мне только одно не понятно, почему-бы сразу не выкладывать корректную версию для скачивания
или надо чтоб народ для начала немного помучился?
dxp
Цитата(sevstels @ Oct 4 2009, 20:19) *
уже решил заменой файлов из snapshot
мне только одно не понятно, почему-бы сразу не выкладывать корректную версию для скачивания
или надо чтоб народ для начала немного помучился?

Дело в том, что в релизе лежит версия для VDSP 4.5 (и более старых), там прототип обработчика прерывания описывался с тремя аргументами типа int. Зачем так было сделано, не знаю. В версии VDSP 5.0 они, видимо, и сами это поняли, и убрали эти инты из прототипа. В соответствии с этим были внесены изменения, которые оперативно отразились в репе и в снапах. Но поскольку релиз еще не выпускался, то в архивах лежит версия для VDSP 4.5.

Видимо, надо придумать какую-то простую схему, указывающую для какой версии тулчейна предназначена та или иная версия порта. Кстати, раньше название и версия используемого тулчейна были прямо забиты в пути порта (например, директория порта прямо так и называлась /BF533/VDSP4.0, но это оказалось неудобным - каждый раз переименовывать директории в путях. Поэтому перешли к общему названию (BF533/VDSP). Самое простое писать в сопроводиловке, какой версии тулчейна соответствует порт.
sevstels
Это конечно удивительно, автор работает ещё 4.0 версией VDSP!
Надо иметь железные нервы... был в шоке.
Кстати потестил на BF561 (600/150) - всё аж летает smile.gif

При компиляции есть предупреждение:
".\scmRTOS\BF533\OS_Target_cpp.cpp", line 61 (col. 5): cc1746: {D} warning:
Externally defined variable Kernel, possibly used in constructor
before it has been constructed


Дык что тут думать? Проще не бывает.

scmRTOS BF533 vdsp 4.0
scmRTOS BF533 vdsp 4.5
scmRTOS BF533 vdsp 5.0

Или на php простенький скрипт, по какой ссылке кликнули, сервер соответствующие файлы в архив и закатал.

-
dxp
Цитата(sevstels @ Oct 5 2009, 20:41) *
Это конечно удивительно, автор работает ещё 4.0 версией VDSP!
Надо иметь железные нервы... был в шоке.

Вы на дату выхода релиза 3.05 посмотрите. На тот момент стабильной была версия 4.5, на ней все и тестилось. Поскольку совместимость между 4.0 и 4.5 была, то имя директории и не переименовывалось. В настоящее время автор работает на версии 5.0, не сомневайтесь - иначе откуда бы в репе и снапе взялась соответствующие VDSP 5.0 версии файлов.

Цитата(sevstels @ Oct 5 2009, 20:41) *
Кстати потестил на BF561 (600/150) - всё аж летает smile.gif

Это радует. smile.gif

Цитата(sevstels @ Oct 5 2009, 20:41) *
При компиляции есть предупреждение:
".\scmRTOS\BF533\OS_Target_cpp.cpp", line 61 (col. 5): cc1746: {D} warning:
Externally defined variable Kernel, possibly used in constructor
before it has been constructed

Есть такая буква. Формально компилятор прав, хотя по факту ничего опасного там нет, все в порядке. Надо, конечно, пофиксить. Пока еще не решено, как именно сделать. Самое простое - объявить таблицу указателей процессов как статический член класса. В первой версии, кстати, так и было.

Цитата(sevstels @ Oct 5 2009, 20:41) *
Дык что тут думать? Проще не бывает.

scmRTOS BF533 vdsp 4.0
scmRTOS BF533 vdsp 4.5
scmRTOS BF533 vdsp 5.0

Или на php простенький скрипт, по какой ссылке кликнули, сервер соответствующие файлы в архив и закатал.

-

Я не знаток веб технологий. Но есть кое-какие ограничения. Например, по правилам sourceforge.net нельзя на сайте хранить файлы для закачки. Все, что подлежит скачиванию, должно быть размещено на download серверах. А там все по релизам.
sevstels
Уважаемый dxp, подскажите плиз, где "подкрутить".
Перенёс папку отлаженого scmRTOC из одноядерного варианта BF561 в основной проект в раздел CoreA и подключил. Rtos будет работать на A. Всё библитеки A, B собрались нормально без ошибок. Линкер при сборке главного проекта пишет:

----------------Configuration: sml3 - Debug----------------
Project is up to date.
----------------Configuration: sml2 - Debug----------------
Project is up to date.
----------------Configuration: coreB - Debug----------------
Creating library...
Build completed successfully.
----------------Configuration: coreA - Debug----------------
Creating library...
Build completed successfully.

----------------Configuration: MAIN_BF561 - Debug----------------
Linking...

[Error li1021] The following symbols referenced in processor 'p0' could not be resolved:
'ContextSwitcher_ISR [_ContextSwitcher_ISR]' referenced from 'corea.dlb[main_core_a.doj]'
'OS_Start [_OS_Start]' referenced from 'corea.dlb[main_core_a.doj]'

Linker finished with 1 error
cc3089: fatal error: Link failed

ADI Help проблему разрешить не помогает.
Файлы вроде все в пути добавлены.
Символы функций - глобальные.
Секцию под код указал .. не пойму что линкер хочет.

-
dxp
Цитата(sevstels @ Oct 6 2009, 10:45) *
----------------Configuration: MAIN_BF561 - Debug----------------
Linking...

[Error li1021] The following symbols referenced in processor 'p0' could not be resolved:
'ContextSwitcher_ISR [_ContextSwitcher_ISR]' referenced from 'corea.dlb[main_core_a.doj]'
'OS_Start [_OS_Start]' referenced from 'corea.dlb[main_core_a.doj]'

Linker finished with 1 error
cc3089: fatal error: Link failed

Я не работал с двухядерником, нюансов, связанных с ним, не знаю. Но по сообщению линкера похоже, что в объектники не попали потроха из ассемблерного файла "OS_Target_asm.sbf" - обе функции, которые не найдены, описаны в этом файле. Если собираете оболочкой, то проверьте, транслируется ли этот файл. Оболочка, помнится, не признавала для асмовых файлов никаких расширений, кроме .s, .asm и .dsp. Поменяйте расширение, попробуйте.
sevstels
Расширение давно поменял, файл OS_Target_asm.asm
Проект отлично собирался и работал в железке, пока был для одного ядра...

-
dxp
Цитата(sevstels @ Oct 6 2009, 14:43) *
Расширение давно поменял, файл OS_Target_asm.asm
Проект отлично собирался и работал в железке, пока был для одного ядра...

Тем не менее, проблема именно из-за асмового файла. У вас есть еще другие ассемблерные файлы в проекте? Проверьте, транслируется ли сам файл - от него должны оставаться следы - OS_Target_asm.doj. Включается ли этот объектный файл в процесс сборки (линковки)? Если объектные файлы заключаются в библиотеку - я понял, что на двухядернике все объектные модули для одного ядра собираются в библиотеку, - посмотрите ее содержимое (утилитой elfar с ключом -р), содержится ли этот файл в ней. Где-то он потерялся.
sevstels
Да, asm есть для MPEG-4 енкодера.
Они тоже выдают аналогичную ошибку при подключении заголовка <scmRTOS>.
Завтра буду копать по этому плану, сегодня всё. Спасибо за подсказку. smile.gif
sevstels
Накопал...
Не обратил внимание на warning по поводу отсутствия хедера для asm файла.
Суппорт VDSP ответил, что это не влияет на результат сборки. Но реально - проект не работал.
Оказалось, что пути к хедерам для asm файлов нужно прописывать отдельно от c/cpp, не знал этого...
Вылечилось добавлением путей в Project options\Assemble\Additional include\
meister
Безопасно ли использовать setjmp и longjump в scmRTOS для ARM7TDMI (LPC2xxx)? Мне "исключение" бросить надо. Спасибо.
vzuravlo
Добрый день.
Я новичок в программировании, не судите строго.
у меня есть задача, которая одновременно должна ждать три события.
Одно от системного твика и возможны 2 сообщения от разных источников.
Получается, что я не могу использовать ни Sleep(N) ни Message.wait()
Ведь по осутствию первого же из этих событий задача передаст управление операционке и не проверит остальные.
Или я где-то путаю?
dxp
Цитата(vzuravlo @ Jan 24 2010, 03:31) *
у меня есть задача, которая одновременно должна ждать три события.
Одно от системного твика и возможны 2 сообщения от разных источников.
Получается, что я не могу использовать ни Sleep(N) ни Message.wait()
Ведь по осутствию первого же из этих событий задача передаст управление операционке и не проверит остальные.
Или я где-то путаю?

Вы можете использовать message<...>::wait(timeout). Задаете таймаут ожидания и все. Если пришло какое-то событие раньше таймаута, то функция вернет true, и обрабатываете событие, если события не пришли до истечения таймаута, то получаете результат функции false, и обрабатываете этот вариант. Процесс будет в любом случае "разбужен" либо по приходу события, либо по таймауту.
ReAl
Цитата(dxp @ Jan 24 2010, 12:48) *
Вы можете использовать message<...>::wait(timeout). Задаете таймаут ожидания и все. Если пришло какое-то событие раньше таймаута, то функция вернет true, и обрабатываете событие, если события не пришли до истечения таймаута, то получаете результат функции false, и обрабатываете этот вариант.
Дополнение:
Если "таймерная" сетка нужна более-менее фикисрованная (пусть с дрожанием, но без накопления ошибки), то её вести в самом процессе через GetTickCount(), беря при старте процесса текущее значение и добавляя к нему период. После каждого просыпания (точнее, перед каждым вызовом wait() ) смотреть опять по GetTickCount() - сколько осталось времени и этот остаток передавать в message<...>::wait(timeout), по достижении снова добавлять период к локальноq переменной.
Её при этом, кстати, не обязательно делать DWORD, если просыпаться нужно каждые, к примеру, 10 тиков, то локальная копия системного тика вполне может быть 1-байтовой.
kurtis
Возник небольшой вопрос при использовании scmRTOS.

Как в файле scmRTOS_CONFIG.h задавать общее количество процессов через макрос (и можно ли вообще)? Т.е. как-то так
Код
#include "Priority.h"

#define  scmRTOS_PROCESS_COUNT              TOTAL_PROCESS_NUMBER
, где TOTAL_PROCESS_NUMBER задается в файле Priority.h который выглядит следующим образом
Код
#ifndef _BSP_MRTP4AN_PRIORITY_H
#define _BSP_MRTP4AN_PRIORITY_H

#include <scmRTOS.h>

#define ANMEAS_PRI  (OS::pr0)
#define UART0_PRI   (OS::pr1)
#define UART1_PRI   (OS::pr2)
#define TECHNO_PRI  (OS::pr3)
#define PERIPH_PRI  (OS::pr4)

#define TOTAL_PROCESS_NUMBER (5)

#endif /* _BSP_MRTP4AN_PRIORITY_H */


При попытке компилировать, вылазят такие ошибки
CODE
In file included from ../../bsp/scmRTOS/AVR/OS_Target.h:121,
from ../../bsp/scmRTOS/Common/scmRTOS.h:52,
from ../../bsp/MRTP4an/Priority.h:19,
from ./src/scmRTOS_CONFIG.h:56,
from ../../bsp/scmRTOS/AVR/OS_Target_asm.S:51:
../../bsp/scmRTOS/Common/scmRTOS_defs.h:73:2: error: #error "Error: Config macro scmRTOS_SYSTIMER_NEST_INTS_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:82:2: error: #error "Error: Config macro scmRTOS_SYSTEM_TICKS_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:92:2: error: #error "Error: Config macro scmRTOS_SYSTIMER_HOOK_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:101:2: error: #error "Error: Config macro scmRTOS_IDLE_HOOK_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:110:2: error: #error "Error: Config macro scmRTOS_CONTEXT_SWITCH_SCHEME must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:120:2: error: #error "Error: Config macro scmRTOS_PRIORITY_ORDER must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:239:14: error: #error "Invalid Process Count specification! Must be from 1 to 31."
In file included from ../../bsp/scmRTOS/AVR/OS_Target.h:121,
from ../../bsp/scmRTOS/Common/scmRTOS.h:52,
from ../../bsp/MRTP4an/Priority.h:19,
from ./src/scmRTOS_CONFIG.h:56,
from ../../bsp/scmRTOS/AVR/OS_Target_asm.S:51:
../../bsp/scmRTOS/Common/scmRTOS_defs.h:73:2: error: #error "Error: Config macro scmRTOS_SYSTIMER_NEST_INTS_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:82:2: error: #error "Error: Config macro scmRTOS_SYSTEM_TICKS_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:92:2: error: #error "Error: Config macro scmRTOS_SYSTIMER_HOOK_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:101:2: error: #error "Error: Config macro scmRTOS_IDLE_HOOK_ENABLE must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:110:2: error: #error "Error: Config macro scmRTOS_CONTEXT_SWITCH_SCHEME must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:120:2: error: #error "Error: Config macro scmRTOS_PRIORITY_ORDER must be defined!"
../../bsp/scmRTOS/Common/scmRTOS_defs.h:239:14: error: #error "Invalid Process Count specification! Must be from 1 to 31."
make: *** [obj/OS_Target_asm.o] Ошибка 1

Без моих модификаций проект собирается нормально.
Используется avr-gcc 4.3.3
Сергей Борщ
перенесите определение #define TOTAL_PROCESS_NUMBER (5) до включения <scmRTOS.h>:
Код
#ifndef _BSP_MRTP4AN_PRIORITY_H
#define _BSP_MRTP4AN_PRIORITY_H

#define TOTAL_PROCESS_NUMBER (5)

#define ANMEAS_PRI  (OS::pr0)
#define UART0_PRI   (OS::pr1)
#define UART1_PRI   (OS::pr2)
#define TECHNO_PRI  (OS::pr3)
#define PERIPH_PRI  (OS::pr4)

#include <scmRTOS.h>

#endif /* _BSP_MRTP4AN_PRIORITY_H */
kurtis
не помогло, те самые ошибки
Сергей Борщ
Цитата(kurtis @ Feb 26 2010, 20:43) *
не помогло, те самые ошибки
Я попробовал скомпилить свой проект, вставив
Код
#define TOTAL_PROCESS_NUMBER (5)
#define  scmRTOS_PROCESS_COUNT              TOTAL_PROCESS_NUMBER
в scmRTOS_CONFIG.h. Все скомпилилось. А, понял - у вас нарушен порядок включения заголовочных файлов. Вам нужно убрать #include <scmRTOS.h> из Priority.h
Priority.h сам включается в scmRTOS.h через scmRTOS_CONFIG.h
kurtis
Спасибо!))
Теперь получилось.
Embedder74
Начал разбираться с scmRTOS.3.10. Ответьте, плз. на несколько вопросов.
1) смотрю пример 1-EventFlag, описание процесса:
typedef OS::process<OS::pr0, 120, 32> TProc1;
Что означает 32? В доке на V2.0 такого параметра нет.

2) Существует ли проблема локальных переменных, объявленных в разных процессах?
Когда происходит прерывание текущего процесса более приоритетным, тогда есть опасность порчи локальных переменных, ведь они формируются компилятором из кучи. Как быть? Объявлять их static? Чего-то я недопонимаю. Сильно не пинайте.
jorikdima
Цитата(Embedder74 @ Mar 24 2010, 13:18) *
2) Существует ли проблема локальных переменных, объявленных в разных процессах?
Когда происходит прерывание текущего процесса более приоритетным, тогда есть опасность порчи локальных переменных, ведь они формируются компилятором из кучи. Как быть? Объявлять их static? Чего-то я недопонимаю. Сильно не пинайте.

из стека, если вы не пользуетесь динамическим выделением. А стек у каждой задачи свой, следовательно проблемы нет.
AHTOXA
Цитата(Embedder74 @ Mar 24 2010, 15:18) *
1) смотрю пример 1-EventFlag, описание процесса:
typedef OS::process<OS::pr0, 120, 32> TProc1;
Что означает 32?


Это размер стека возвратов. IAR для AVR использует два стека.
Embedder74
Цитата(jorikdima @ Mar 24 2010, 14:14) *
из стека, если вы не пользуетесь динамическим выделением. А стек у каждой задачи свой, следовательно проблемы нет.

В стеке задачи сохраняются только регистры, при этом не факт, что компилятор назначит регистр какой-либо локальной переменной. Например, если в подпрограмме определяются несколько float - локальных переменных, то скорее всего они создадутся из кучи, т.е из ОЗУ. Вы никогда не пробовали (в программе без ОСи) в прерываниях определить несколько локальных переменных (не static)? И что из этого вышло?

Цитата(jorikdima @ Mar 24 2010, 14:14) *
из стека, если вы не пользуетесь динамическим выделением.

А что, разве существует какой-то другой тип распределения памяти компилятором? Как в IARe я могу изменить этот тип?
Научите меня, плз.
Сергей Борщ
Цитата(Embedder74 @ Mar 25 2010, 10:37) *
Например, если в подпрограмме определяются несколько float - локальных переменных, то скорее всего они создадутся из кучи, т.е из ОЗУ.
Локальные переменные выделяются на стеке. Всегда. Память из кучи выделяется функцией malloc() и подобными. В плюсах - оператором new. И никак иначе. Куча находится в ОЗУ точно так же, как и стек находится в ОЗУ. ОЗУ (RAM) != куча (heap).
Цитата(Embedder74 @ Mar 25 2010, 10:37) *
Вы никогда не пробовали (в программе без ОСи) в прерываниях определить несколько локальных переменных (не static)? И что из этого вышло?
Пробовали. Вышло именно то, что и должно было.


Цитата(Embedder74 @ Mar 25 2010, 10:37) *
А что, разве существует какой-то другой тип распределения памяти компилятором? Как в IARe я могу изменить этот тип?
Сначала опишите, что вы понимаете под "этим" способом. Это поможет определить, какие способы являются "другими".
jorikdima
Цитата(Embedder74 @ Mar 25 2010, 11:37) *
А что, разве существует какой-то другой тип распределения памяти компилятором? Как в IARe я могу изменить этот тип?
Научите меня, плз.

На самом деле, тут эффективнее всего вам какую-нибудь книжку прочитать про С/С++. К компилятору это отношение далекое имеет, это стандарт С. Почитайте в книжках про локальные, глобальные, статические переменные, судя по всему у вас пробел тут в знаниях.
a9d
atmega8
scmRTOS_SYSTIMER_NEST_INTS_ENABLE 1
scmRTOS_PROCESS_COUNT 2

Начал изучать эту ОС. Документацию прочитал.
Но не пойму. Почему в моем коде никогда не выполняется TProc2?

TProc1 ждет байт. Если пришел то отправить.
TProc2 постоянно шлет 'b'.
SystemTimerUserHook. постоянно отсылает 'v'.

На выводе постоянно фижу 'v' но никогда 'b'. Если отсылаю байт то он тут же возвращается.
Вывод TProc2 никогда не передается управление.

Код
int main()
{
    MyUart.init();
    // Start System Timer
    TCCR0 = (1 << CS01) | (1 << CS00);    // clk/64
    TIMSK |= (1 << TOIE0);

    //Запускаем ОС
    OS::Run();

    return 0;
}

//---------------------------------------------------------------------------
namespace OS {

template<> OS_PROCESS void TProc1::Exec()
{
    unsigned char c;

    for(;;)
    {
        c=MyUart.receiveByte();
                    MyUart.sendByte(c);
    }
} // TProc1::Exec()


template<> OS_PROCESS void TProc2::Exec()
{
    for(;;)
    {
        MyUart.sendByte('b');
        Sleep(50);
    }
} // TProc2::Exec()


} // namespace OS

void OS::SystemTimerUserHook()
{
#if  scmRTOS_SYSTIMER_NEST_INTS_ENABLE  &&  !PORT_TOGGLE_BY_PIN_WRITE
    TCritSect cs;
#endif
    MyUart.sendByte('v');
}
AHTOXA
А всё потому, что TProc1 имеет наивысший приоритет, и не отдаёт никому управление.
Вставьте в TProc1
Код
        MyUart.sendByte('b');
        Sleep(10);

и всё заработает.
А если всё делать по уму, то надо чтобы функция MyUart.receiveByte(); сама вгоняла вызвавший её процесс в спячку до прихода символа.
a9d
Т.е. я должен должен явно указывать какой процесс может отдать управление?

Если вставить в первый процесс Sleep(10) то ничего не изменится. Второй процесс не получит управления пока первый не уснет(т.е. пока не прийдет байт). По приходу байта, второй процесс получит управление отошлет байт и снова уснет, до тех пор пока снова не прийдет байт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.