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

 
 
> mRTOS-кооперативная операционная система, порт CodeVision, порт WinAvr, mRTOS-кооперативная операционная система для AVR
LVII
сообщение Oct 30 2009, 11:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Предлагаю на рассмотрение уважаемым ембеддерам кооперативную операционную систему реального времени для малых и средних контроллеров AVR, правда никто не запрещает использовать ее для всех типов контроллеров. Существует два порта - под CodeVision и WinAVR.
Сразу же хочу оговориться, что понятие реального времени в случае кооперативных систем достаточно условно - это описано в статье на сайте и документации к ОС.
Используя эту систему начинаю разработку с проектирования ПО - используя упрощенную нотацию UML в бесплатном редакторе DIA.
Разрабатывать проекты получается быстрее, существенно легче стало обеспечивать модификацию, сопровождение и отладку программного обеспечения. Понятнее и прозрачнее стали тексты программ.

Адрес сайта - http://movilavn.narod.ru/

Зайти в раздел "Статьи", выбрать статью - "mRTOS - кооперативная операционная система для микроконтроллеров".
Для загрузки доступны сама ОС, документация и примеры использования.

Сообщение отредактировал LVII - Oct 30 2009, 11:58
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 58)
oll
сообщение Oct 30 2009, 12:25
Сообщение #2


Частый гость
**

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



Цитата(LVII @ Oct 30 2009, 16:53) *
Предлагаю на рассмотрение уважаемым ембеддерам кооперативную операционную систему реального времени

Спасибо уже опробовал - понравилось.
Go to the top of the page
 
+Quote Post
LVII
сообщение Oct 30 2009, 17:04
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Благодарствую за положительную оценку!
Буду рад увидеть Ваши мнения, пожелания и критику.
Стоит ли дорабатывать до preemptive версии?
Go to the top of the page
 
+Quote Post
alcosar
сообщение Oct 30 2009, 17:14
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598



Начинаем читать документацию, идущую в файле с mRTOS(стр. 2) :
Цитата
Всю приведенные ниже выкладки, рассуждения и оценки являются результатом личного опыта и знаний автора, поэтому обладают долей субъективизма и могут содержать ряд неточностей и спорных моментов.

А теперь прочитаем документацию к scmRTOS(стр. 7):
Цитата
Все приведенные ниже рассуждения, оценки, выводы основаны на личном опыте и знаниях автора и вследствие этого обладают известной долей субъективизма, что обуславливает наличие как неточностей, так и ошибок.

Ну и так далее - цельнотянутые куски из документации к scmRTOS.
crying.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 30 2009, 18:16
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(alcosar @ Oct 30 2009, 20:14) *
Ну и так далее - цельнотянутые куски из документации к scmRTOS.
crying.gif

И к тому же ось позиционируется как кооперативная, но от чего же такая пухленькая ? crying.gif
Go to the top of the page
 
+Quote Post
oll
сообщение Oct 31 2009, 05:08
Сообщение #6


Частый гость
**

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



Цитата(_Pasha @ Oct 30 2009, 23:16) *
И к тому же ось позиционируется как кооперативная, но от чего же такая пухленькая ? crying.gif

А чего "пухленькая"?
Простой пример из 4 задач:
AVR Memory Usage
----------------
Device: atmega8535
Program: 1660 bytes (20.3% Full)
(.text + .data + .bootloader)
Data: 72 bytes (14.1% Full)
(.data + .bss + .noinit)
Build succeeded with 0 Warnings...

Стоит ли дорабатывать до preemptive версии?
Стоит. Хотя и так вполне работает хорошо (у меня в реальном проекте).
Еще бы порт на IAR...
Go to the top of the page
 
+Quote Post
LVII
сообщение Oct 31 2009, 11:19
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Цитата(alcosar @ Oct 30 2009, 19:14) *
Ну и так далее - цельнотянутые куски из документации к scmRTOS.
crying.gif


До решения о написании собственной ОС, были изучены все доступные ОС, естественно и scmRTOS. Память у меня очень неплохая. Так, что ненароком повторил "цельнотянутые куски из документации к scmRTOS", но в документации это только общие слова(видно из вышеприведенных примеров). Но на всякий случай прошу прощения! Действительно важная, особенно техническая, часть документации - это эксклюзив. Это же касается идеи и кода.

Насчет "пухленькой" - были приняты меры для минимизации, но с тем, чтобы оставить необходимые возможности. Насколько я знаю, у всех подобных систем(кооперативная с приоритетным планированием) результаты немного хуже.

Насчет preemptive ОС - уже несколько раз брался. Но при решении конкретных задач(проектов), существующая ОС, удовлетворяла всем требованиям. Проекты включали подключение к TCP/P, используя WizNET 5100. Работа с GSM, через модули SIMCOM. Куча датчиков.
Но тем не менее, все это уже на этапе проектирования отлично вписывалось в mRTOS.
Да и само пректирование упрощалось.
Т.е. пока не вижу проекта для 8-ми битных микроконтроллеров с необходимостью preemptive ОС.
Может быть не прав. Поправьте.
Go to the top of the page
 
+Quote Post
alcosar
сообщение Nov 1 2009, 05:22
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598



Цитата(LVII @ Oct 31 2009, 15:19) *
До решения о написании собственной ОС, были изучены все доступные ОС, естественно и scmRTOS. Память у меня очень неплохая. Так, что ненароком повторил "цельнотянутые куски из документации к scmRTOS", но в документации это только общие слова(видно из вышеприведенных примеров). Но на всякий случай прошу прощения! Действительно важная, особенно техническая, часть документации - это эксклюзив. Это же касается идеи и кода.

Это не память хорошая и не ненароком. Брать чужое и выдавать за свое называется по-другому.
Документация к scmRTOS:
Цитата
Итак, в контексте текущего рассмотрения, операционная система – сово-
купность программного обеспечения (ПО), дающего возможность разбить поток
выполнения программы на несколько независимых, асинхронных по отношению
друг к другу процессов и организовать взаимодействие между ними. Т.е. внима-
ние обращено на базовые функции, оставляя в стороне такие вещи, присущие ОС
для больших машин, как файловые системы (т.к. и файлов-то никаких, обычно,
нет), драйверы устройств (которые вынесены на уровень пользовательского ПО) и
проч.

Документация к mRTOS:
Цитата
Итак, в контексте текущего рассмотрения, операционная система – совокупность
программного обеспечения (ПО), дающего возможность разбить поток выполнения
программы на несколько независимых, асинхронных по отношению друг к другу
процессов и организовать взаимодействие между ними. Т.е. внимание обращено на
базовые функции, оставляя в стороне такие вещи, присущие ОС для больших машин, как
файловые системы (т.к. и файлов-то никаких, обычно, нет), драйверы устройств (которые
вынесены на уровень пользовательского ПО) и прочее.


Документация к scmRTOS:
Цитата
Таким образом, исходя из того, что основная функция ОС – поддержка
параллельного асинхронного исполнения разных процессов и взаимодействия
между ними, встает вопрос о планировании (Scheduling) процессов, т.е. когда ка-
кой процесс должен получить управление, когда отдать управление другому про-
цессу и проч. Эта задача возлагается (хоть и не полностью) на часть ядра ОС, на-
зываемой планировщиком (Scheduler). По способу организации работы плани-
ровщики бывают:

Документация к mRTOS:
Цитата
Таким образом, исходя из того, что основная функция ОС – поддержка параллельного
асинхронного исполнения разных процессов и взаимодействия между ними, встает вопрос
о планировании (Scheduling) процессов, т.е. когда какой процесс должен получить
управление, когда отдать управление другому процессу и прочее. Эта задача возлагается,
хоть и не полностью, на часть ядра ОС, называемой планировщиком (Scheduler).
По способу организации работы планировщики бывают:

Ну и так далее.

В документация к mRTOS читаем следующее(стр.13):
Цитата
Data Stack используется для динамического хранения локальных
переменных, посредством его передаются параметры функций и сохраняются регистры во
время вызова функций обработки прерываний. В CodeVision для хранения адреса
вершины Data Stack используется Y-регистр (регистровая пара r28 и r29), в WinAVR
используется регистровая пара r24 и r25, а в ICCAVR регистровая пара r16 и r17.

У avr-gcc нет отдельного Data Stack, а есть единый стек для хранения адресов возврата и данных. Указатель на верхушку стека также хранится в регистровой паре Y. Через r24, r25 передаются параметры в функцию.
avr-libc
Цитата
Call-saved registers (r2-r17, r28-r29):
May be allocated by gcc for local data. Calling C subroutines leaves them unchanged. Assembler subroutines are responsible for saving and restoring these registers, if changed. r29:r28 (Y pointer) is used as a frame pointer (points to local data on stack) if necessary. The requirement for the callee to save/preserve the contents of these registers even applies in situations where the compiler assigns them for argument passing.

Цитата
* Function call conventions:
Arguments - allocated left to right, r25 to r8. All arguments are aligned to start in even-numbered registers (odd-sized arguments, including char, have one free register above them). This allows making better use of the movw instruction on the enhanced core.

If too many, those that don't fit are passed on the stack.
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 1 2009, 07:00
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



alcosar - по существу вопроса у Вас, что нибудь есть?
Это о функционировании и удобстве применения предложенной ОС.
То, что Вы "цельнотянуто" процитировали из документации по GCC, поверьте я знаю.
Это просто вопрос терминологии - что и как называть Data Stack в разных компиляторах.

Брать чужое, что? Беллетристику?
Почитайте на досуге - "Embedded Multitasking with small microcontrollers" Keith E. Curtis.
Там найдете те же самые слова, только по английски.

Хочу напомнить, что на рассмотрение было представлено ПО, а не учебник по написанию ОС для встроенных систем.
К самой mRTOS есть какие-то претензии? К коду?

Вообще в чем Вы меня обвиняете. В том, что опубликовал свою ОС для свободного использования, а подложил чужую документацию, не иначе как в каких-то темных целях?

На досуге подумаю как изменить документацию, так, чтобы сказать то же самое, только совсем другими словами.

Сообщение отредактировал LVII - Nov 1 2009, 07:40
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Nov 1 2009, 07:41
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Не буду разбираться кто где плагиатор. Вот попался линк на "Embedded Multitasking with small microcontrollers" Keith E. Curtis.
hчсp://rapidshare.com/files/123380312/Embedded_Multitasking_with_small_microcontrollers.rar


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 1 2009, 07:52
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(LVII @ Nov 1 2009, 12:00) *
Вообще в чем Вы меня обвиняете. В том, что опубликовал свою ОС для свободного использования, а подложил чужую документацию, не иначе как в каких-то темных целях?


Вас обвиняют в плагиате. И никакие благие цели типа "для свободного использования" этот плагиат не оправдывают.
Может вы и саму ОС откуда-то "одолжили"?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 1 2009, 11:56
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Один человек только протестировал!

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

Видимо по существу дела толковых мнений не дождусь.
Ну и да ладно - любое хорошее дело не должно остаться безнаказанным!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 1 2009, 12:05
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(LVII @ Nov 1 2009, 16:56) *
Один человек только протестировал!

А вы думали все прям ломанутся тестировать? С какой стати? Имхо, если человек не может описать своими словами, как работает его собственная операционка, то ничего хорошего от неё ждать не приходится.
Цитата
Общие фразы об устройстве ОС(плагиат) встречаются во многих учебниках посвященных операционным системам.
Кстати прежде чем бросаться словами надо понимать их значение. Плагиат подразумевает корыстные цели.

Не надо изворачиваться. Речь идёт не об общих фразах, а о передирании один-в-один, причём бездумном. Плагиат - он всегда плагиат, независимо от целей.
Цитата
Видимо по существу дела толковых мнений не дождусь.

Да уж, теперь вряд ли.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 1 2009, 12:16
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(LVII @ Nov 1 2009, 14:56) *
Один человек только протестировал!

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

Видимо по существу дела толковых мнений не дождусь.
Ну и да ладно - любое хорошее дело не должно остаться безнаказанным!

Не обижайтесь, просто принято перед использованием/тестированием чего-либо читать документацию. Поэтому первые вопросы возникли по документации. Если документация продукта "A" один в один повторяет документацию продукта "Б", то встаёт резонный вопрос. А чего такого в продукте "А"? По поводу "плагиата": лучше-бы вместо тупого копирования, сделали-бы просто ссылку "такой-то подход хорошо описан там-то". И написали только то, что касается вашего проекта (его особенности, плюсы и минусы, подходы, идеология, тесты, примеры использования и.т.п). И люди к вам потянутся =)
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 1 2009, 13:03
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Проверил сам - да действительно почти совпадают несколько вступительных фраз!
Дико прошу извинений! Посыпаю голову пеплом! И т.д. и т.п.
Обязательно сделаю ссылку на scmRTOS. Отличная, кстати говоря ОС. Но не захотела работать на CodeVision.
Также и на остальную литературу с которой работал:
1. Иртегов Д.В. Введение в операционные системы. – СПб.: БХВ-
Петербург, 2002. – 624 с.: ил.
2. Столлингс В. Операционные системы, 4-е издание.: Перев. с англ. – М:
Издательский дом «Вильямс», 2002. – 848 с.: ил.
3. Гордеев А.В., Молчанов А. Ю. Системное программное обеспечение. –
СПб.: Питер, 2002. – 736 с.: ил.
4. Олифер Н.А., Олифер В.Г. Сетевые операционные системы. – СПб.:
Питер, 2001. – 544 с.: ил.
5. Таненбаум Э. Современные операционные системы. 2-е изд. – СПб.:
Питер, 2002. – 1040 с.: ил.
6. Алгоритмы планирования процессорного времени. И.С. Гусев

Если кто-либо действительно прочел документацию до конца, то там понятна разница в подходе и реализации.
А если бы уже проверили на простеньком прилагающемся демо, ну наверное так совсем все ясно стало!

Сообщение отредактировал LVII - Nov 1 2009, 13:12
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 1 2009, 13:18
Сообщение #16


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



че за базар?
граждане? код смотрите который вам предлагают, не нравится используйте другое.
я книгу пишу по GNU tools for ARM, часть текста будет "как я перевел из ...." и примеры не все мною будут писаны! и че теперь я плагиатор?
цель - дать информацию в нужном виде для решения поставленной задачи
Go to the top of the page
 
+Quote Post
Petka
сообщение Nov 1 2009, 13:34
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(klen @ Nov 1 2009, 16:18) *
че за базар?
граждане? код смотрите который вам предлагают, не нравится используйте другое.
я книгу пишу по GNU tools for ARM, часть текста будет "как я перевел из ...." и примеры не все мною будут писаны! и че теперь я плагиатор?
цель - дать информацию в нужном виде для решения поставленной задачи

Спокуха. Вы же ссылки не забудете сделать? Есть ссылка - это уже не плагиат а цитата =) Ссылки нужны ещё для того, если возникнут вопросы, можно было заглянуть в первоисточник и узнать ошибка возникла в процессе перевода или так и задумано было...
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 1 2009, 14:43
Сообщение #18


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

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



Цитата(Petka @ Nov 1 2009, 15:34) *
Спокуха. Вы же ссылки не забудете сделать? Есть ссылка - это уже не плагиат а цитата =) Ссылки нужны ещё для того, если возникнут вопросы, можно было заглянуть в первоисточник и узнать ошибка возникла в процессе перевода или так и задумано было...
+1
Особенно учитывая то, что в "процитированных" фрагментах несколько раз повторяется слово "асинхронный", тогда как обсуждаемая ОС - кооперативка и там все переключения происходят синхронно.

Ну а по сути предложенных исходников

Мелочи, но сильно затрудняющие чтение - "исходные исходники" отформатированы так, как будто кто-то вставил цитату в форум без тега code. Понятно, что это исправляет один вызов indent или пара тыков в редакторе, но... "осадок остался"
А портированные на avr-gcc (с которых я начал) изобилуют маслом масляным комментариями вида
mRTOS_Tasks[mRTOS_InitTasksCounter].CurrentPriority = Priority; // установить текущий приоритет задачи
что тоже только затрудняет чтение.


Никак не могу понять смысла сохранения статусного регистра при синхронном переключении. Всё равно никакой компилятор не ждёт, что после возврата из любой функции (а не только кооперативного переключения) статусный регистр будет тот же, что и перед вызовом.

Ну и - это уже касается порта avr-gcc - обёртки ATOMIC_BLOCK(ATOMIC_RESTORESTATE) всё равно напрочь затирают сохранённое в блоке задачи и восстановленное значение тем, которое "получили в наследство" от той задачи, с которой идёт переключение. Тот, кто портировал - мог бы это и заметить и вместе с автором оси задуматься над смыслом проделываемых операций.

Хитрая хитрость с "приоритетами"... Что это даёт?
Пусть есть четыре задачи(с приоритетами)
A(10) B(3) C(3) В(3)
Тогда, при условии, что все задачи что-то молотят, не переходят в ожидание, вызовы будут идти так
AAAAAAABCDABCDABCD
Итого на начальном участке выполняется только задача А, а на конечном идёт так, как будто у неё приоритет такой же, как у всех.
Если "приоритет", означает "суммарное время, отданное задаче", то зачем так сложно?
А если
Цитата
Чем больше это число, тем чаще будет переходить управление к этой задаче
втрое более высокий приоритет означает более выскоую частоту вызова, то задача решена в объёме средней температуры по больнице.
К примеру, сначала AAAAAAA просто тупо прокуртится в if( !flag ) DISPATCH; а потом флаг взведётся, но сначала выполнятся все низкоприоритетные, и только потом вернётся управление к А, она не будет вызываться чаще на этом участке.
Тут бы
ABACADABACADABACADA
но это требует совсем другого подхода.

А в таком виде, как оно есть, на мой взгляд, не имеет смысла. Только ОЗУ и код даром выброшены.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
oll
сообщение Nov 1 2009, 17:23
Сообщение #19


Частый гость
**

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



Может "ОЗУ и код даром выброшены", но мне эта ос оказалась по силам для понимания (ну тупой - scmRTOS не осилил).
Показалось что удобно:
в одной задаче обслуживается семисегментный индикатор, в другой кнопки, в третей энкодер, в четвертой тиристор, в пятой шим для полевика и все это на одном таймере (остальные заняты). Может можно было и по другому сделать, но с использованием mRTOS получилось наглядно и главное работает. Использовал Кодевижн, хотя пробовал и GCC.

Да еще вопрос автору - в старых версиях Кодевижена почему-то не удалось запустить, только в версии 2.хх.

Сообщение отредактировал oll - Nov 1 2009, 17:32
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Nov 1 2009, 17:38
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
и все это на одном таймере

для чего этот таймер использовали?


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 1 2009, 19:11
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Цитата
Хитрая хитрость с "приоритетами"... Что это даёт?
Пусть есть четыре задачи(с приоритетами)
A(10) B(3) C(3) D(3)
Тогда, при условии, что все задачи что-то молотят, не переходят в ожидание, вызовы будут идти так
AAAAAAABCDABCDABCD


Не совсем так, точнее совсем не так. В документации нарисован алгоритм переключения. Он прост, но не до такой степени.
Будет так - ABACADABACADABACAD....... - именно когда все молотят. Т.е. задача А получит в три раза больше времени.
Проверьте в AVR Studio. Это просто.

Сохранение статусного регистра позволяет произвести анализ состояния, которое было до выхода из процесса.
Существует такая необходимость.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 1 2009, 19:17
Сообщение #22


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

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



Цитата(oll @ Nov 1 2009, 19:23) *
Может "ОЗУ и код даром выброшены", но мне эта ос оказалась по силам для понимания (ну тупой - scmRTOS не осилил).
Причём тут это? Я где-то хоть слово сказал про то, что обсуждаемая ОС фигня, потому что не вытесняющая?
ОЗУ и код даром выброшены на вещи абсолютно не нужные (сохранение SREG в невытеснялке) и в данном исполнении при анализе на худший случай бесполезные ("кагбе" приоритеты)

Цитата(oll @ Nov 1 2009, 19:23) *
Показалось что удобно:
в одной задаче обслуживается семисегментный индикатор, в другой кнопки, в третей энкодер, в четвертой тиристор, в пятой шим для полевика и все это на одном таймере (остальные заняты). Может можно было и по другому сделать, но с использованием mRTOS получилось наглядно и главное работает.
Ну так и скажите - что будет хуже, если из обсуждаемой ОС убрать то, про что я сказал, что на него даром выброшены ресурсы. Неужели данные "приоритеты" так Вам помогли? Расскажите, какие они были и что это дало.
Возможно, всего два приоритета - "высокий" и "низкий" - два массива задач, задачи из второго вызываются по одной по очереди после полного прокрута первого массива - было бы ничем не хуже, ОЗУ было бы потрачено меньше, кода тоже, переключение быстрее.
А может и одного массива хватило бы, искать тех, кто дождался события (точно так же, как это сделано сейчас), при отсутствиии таковых продолжать топать по кругу по массиву.

Цитата(LVII @ Nov 1 2009, 21:11) *
Будет так - ABACADABACADABACAD....... - именно когда все молотят.
Проверьте в AVR Studio. Это просто.
Хм. Я просто смотрел код. Может чего недосмотрел, гляну позже ещё.

Цитата(LVII @ Nov 1 2009, 21:11) *
Сохранение статусного регистра позволяет произвести анализ состояния, которое было до выхода из процесса.
Существует такая необходимость.
Например?


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 1 2009, 19:18
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Цитата(oll @ Nov 1 2009, 19:23) *
Да еще вопрос автору - в старых версиях Кодевижена почему-то не удалось запустить, только в версии 2.хх.


Странно. Разрабатывалась на версии 1.25.3.
И еще человек 5 работают в 1-ой версии.
Я конечно проверил и на 2-ой версии, тоже было все хорошо.
Но сам до сих пор сам сижу на 1.25.9.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Nov 2 2009, 00:24
Сообщение #24


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

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



Цитата(klen @ Nov 1 2009, 21:18) *
я книгу пишу по GNU tools for ARM, часть текста будет "как я перевел из ...." и примеры не все мною будут писаны! и че теперь я плагиатор?

Для исключения подобного рода недоразумений, должны быть обязательно ссылки на первоисточник!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 2 2009, 00:39
Сообщение #25


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

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



Цитата(ReAl @ Nov 1 2009, 21:17) *
Я просто смотрел код. Может чего недосмотрел, гляну позже ещё.
Да, пропустил с наскоку то, что текущая задача на время поиска следующей принудительно переводится в suspend а после поиска назад в active.

Поскольку таки не в avr studio, а глазками по исходнику ходил - по дороге заметил, что
Код
        // Поиск задач в состоянии задержки.
        if (!tasks[i_shed].delay && tasks[i_shed].st == Wait) {
            pri = tasks[i_shed].current_pri;
.delay анализируется без запрета прерываний и без явного специального порядка чтения старшего-младшего байта. Могут быть глюки.
Вроде бы ж я не пропустил нигде cli, хоть уже и почти три часа ночи smile.gif

Кстати, мелочь, но в среднем
Код
        if (tasks[i_shed].st == Wait && tasks[i_shed].delay == 0)  {
будет отрабатывать быстрее (даже если забыть на время про неатомарность доступа к delay), так как для не-ожидающих задач не будет зря зачитываться и проверяться delay. Да и логика понятнее -
если задача ожидает - то посмотрим, не пора ли её по таймеру проснуться
а не
если таймер занулился - то надо ещё глянуть, важно ли это
Аналогично с поиском по приоритету - да какая разница какой он, если задача не в active

Цитата(ReAl @ Nov 1 2009, 21:17) *
Например?
А вот для чего может быть нужно сохранять статусный регистр процессора при переключении задач в кооперативной ОС - всё таки хотелось бы услышать. Тем более, что в avr-gcc варианте он восстанавливается.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
oll
сообщение Nov 2 2009, 04:56
Сообщение #26


Частый гость
**

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



для чего этот таймер использовали?
Это я про системный таймер 0.

Ну так и скажите - что будет хуже, если из обсуждаемой ОС убрать то, про что я сказал, что на него даром выброшены ресурсы. Неужели данные "приоритеты" так Вам помогли? Расскажите, какие они были и что это дало.
Я только за, просто хотел сказать, что использовал эту ОС как есть и меня это устраивает. Буду рад если Вы поможете автору усовершенствовать его ОС.
Это моя первая проба ОС. Исходник не изучал - попробовал пример. До этого делал без ОС - динамическая индикация на прерывании таймер 0, знкодер на int 0, кнопки в общем цикле. С ОС приоритет индикатора самый высокий, далее энкодер, потом кнопки и прочее. Знкодер используется без int 0 - пропусков нет, индикатор не мигает.
Хотелось бы, чтобы из одной задачи можно было остановить другую - типа STOP(N)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 2 2009, 06:28
Сообщение #27


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(oll @ Nov 2 2009, 08:56) *
С ОС приоритет индикатора самый высокий, далее энкодер, потом кнопки и прочее. Знкодер используется без int 0 - пропусков нет, индикатор не мигает.

Это же совсем простая программа. А как быть, если одну из задач нагрузить на 1-WIRE ? wink.gif
Go to the top of the page
 
+Quote Post
oll
сообщение Nov 2 2009, 07:20
Сообщение #28


Частый гость
**

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



Цитата(_Pasha @ Nov 2 2009, 11:28) *
Это же совсем простая программа. А как быть, если одну из задач нагрузить на 1-WIRE ? wink.gif

Согласен - 1-WIRE трудновато. У меня там используется KTY. Придется поставить дополнительную Tiny13 biggrin.gif (шутка).
Кстати, это из другой темы (к ОС не имеет отношения), может подскажете, для 1-WIRE :
есть прерывания для обслуживания 7-сегментного индикатора,
есть датчик DS18B20,
для 1-WIRE нужны точные временные интервалы (задаю delay_us()),
прерывания делают временные интервалы непредсказуемыми,
как Вы решили бы подобную проблему?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 2 2009, 07:25
Сообщение #29


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(oll @ Nov 2 2009, 10:20) *
для 1-WIRE нужны точные временные интервалы (задаю delay_us()),
прерывания делают временные интервалы непредсказуемыми,
как Вы решили бы подобную проблему?

Там критично только начало слота, первые 10-20 мкс.
На это время прерывания можно и отключить. А окончание слота довольно расплывчатое, там лишний десяток мкс роли не играет.
Если, конечно, в прерывании не стоит delay_us(), или ещё круче, delay_ms()

А если есть лишний УАРТ - то на него повесить - святое дело. И забыть микросекунды, как страшный сон.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 2 2009, 07:28
Сообщение #30


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(oll @ Nov 2 2009, 10:20) *
как Вы решили бы подобную проблему?

1. Миллисекундные задержки строгому контролю не подлежат.
2. Для микросекундных помещаю текст приема /передачи бита в ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
3. После отработки одного бита не спешу переходить к следующему - вызываю idle() или отдаю управление, если использую protothread-подобную организацию сопрограмм, итд итп.

MrYuran: "А окончание слота довольно расплывчатое" - кстати да, это тоже за пределы ATOMIC_BLOCK выносится.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 2 2009, 07:32
Сообщение #31


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



По теме:
Подробно не смотрел, времени особо не было, да и АВР как-то неактуален пока.
Какие есть сервисы межпроцессного взаимодействия? (сообщения, очереди и т.д.)
При беглом осмотре не нашёл упоминания. (кроме эвентов)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 2 2009, 11:34
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



ОС была намеренно минимизирована. Чтобы уместилась даже на малые AVR типа 2313. Поэтому средства межпроцессорного взаимодействия такие, как сообщения, очереди, mailbox отсутствуют. В документации есть упоминание о том, как используя event организовать все это самостоятельно.

Асинхронно, синхронно. Асинхронно формируются(могут формироваться) event(прерывание). Синхронно передается управление. Это кооперативная операционная система - это + код вносят некоторые возможности RTOS.

Приоритеты. Кооперативная операционная система это сама ОС + прикладной код. Только тогда она может в какой мере заменить preemtive систему. Мой подход к проектированию таков - предположим есть 4 задачи. Есть период времени T приблизительно определенный суммой приоритетов процессов. Одна (первая) главная, вторая за период T может сгенирить 3 события, третья 2, четвертая 1. Назначаем приоритеты 1-ой 200, 2-ой 150, 3-ей 100, 4-ой 50. За время T каждой равномерно будет передано управление исходя из приоритетов. Приведенная схема проектирования упрощена. Но даже так работает!

Сохранение и восстановление статусного регистра. Сохраняем состояние процесса. Даже синхронно передавая управление, процесс может остаться в разных состояниях. При возврате анализируем статусный регистр. Иначе для сохранения состояния пришлось использовать статическую переменную. Экономия - не знаю? Но работает. Накладные расходы на это ничтожны. А возможность использования остается.

Сообщение отредактировал LVII - Nov 2 2009, 11:37
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 2 2009, 11:50
Сообщение #33


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(LVII @ Nov 2 2009, 14:34) *
Даже синхронно передавая управление, процесс может остаться в разных состояниях. При возврате анализируем статусный регистр.

Да не нужен он, поскольку состояния описываются однозначно набором локальных переменных и счетчиком команд. Передача управления реализуется в точках, доступных на уровне сишного текста и прерывать выполнение сишного выражения никто не будет. А также глобально разрешать /запрещать прерывания и отдавать управление, не выходя из критической секции - такая свобода действий не нужна задачам.
Для preemptive -версии он только нужен - также, как и сохранять все регистры, РС и указатель стека.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 2 2009, 12:24
Сообщение #34


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

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



Цитата(LVII @ Nov 2 2009, 13:34) *
Асинхронно, синхронно. Асинхронно формируются(могут формироваться) event(прерывание). Синхронно передается управление.
О чём я и говорю - управление передаётся только синхронно на верхнем уровне функций процессов, поэтому кроме точки возврата ничего не надо сохранять, статусный регистр в том числе.

Цитата(LVII @ Nov 2 2009, 13:34) *
Сохранение и восстановление статусного регистра. Сохраняем состояние процесса. Даже синхронно передавая управление, процесс может остаться в разных состояниях. При возврате анализируем статусный регистр. Иначе для сохранения состояния пришлось использовать статическую переменную. Экономия - не знаю? Но работает. Накладные расходы на это ничтожны. А возможность использования остается.
Я прошу конкретный пример, а не "есть возможность".

А теперь смотрим код:
Код
// Макрос - контекст текущей задачи                  
#define CPU_STATE (tasks[current_task].cpu_state)
// Макрос - переключатель задач
#define DISPATCH dispatch_task(CPU_STATE);
...
// Номер текущей задачи
extern char current_task;
// Массив структур TCB
extern struct TCB tasks[MAXTASKS];
Перед вызовом dispatch_task(switch_buf cpu_state) надо вычислить адрес начала массива cpu_state типа switch_buf.
Код
tasks[current_task].cpu_state
для чего в регистры будет загружено значение переменной current_task, умножено на sizeof(struct TCB) и сложено с адресом начала массива tasks и смещением offsetof(struct TCB, cpu_state).
Таким образом, при входе в dispatch_task в регистре SREG всегда будут флаги, оставшиеся от этих вычислений, а не мифическое "состояние процесса". Я думал, что после критического замечания "по сути", которое Вы просили, Вы сможете сами критически глянуть на свой код.
Ещё понятно было бы, если бы dispatch_task() не принимал аргументов (какая разница - всё равно макрос берёт их из тех же глобальных параметров, кстати, это тоже несколько уменьшило бы код), тогда действительно в SREG был бы результат последних операций процесса перед вызовом диспетчера. Ну и как это применать? Так, чтоли?
Код
    c = a + b;
    DISPATCH;
    if( SREG & (1<<SREG_Z) ) {
         // c присвоен 0 перед вызовом диспетчера
    }


Цитата
Накладные расходы на это ничтожны
Байт на задачу, при 4 задачах - больше 3% ОЗУ упомянутой tiny2313


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 2 2009, 18:01
Сообщение #35


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(LVII @ Nov 2 2009, 12:34) *
ОС была намеренно минимизирована

Я бы хотел ось, которая поддерживает все. Опциями конечно, а не все сразу. Например, последовательные порты, работа с файловой системой, с ммс, с флешью, с озу, с индикаторами и т.д. А в урезанных осях против "своего цикла" я смысла не вижу.
Go to the top of the page
 
+Quote Post
plus
сообщение Nov 2 2009, 21:22
Сообщение #36


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 13-08-05
Из: Сталинград
Пользователь №: 7 605



Цитата(sensor_ua @ Nov 1 2009, 10:41) *
попался линк на "Embedded Multitasking with small microcontrollers" Keith E. Curtis.
hчсp://rapidshare.com/files/123380312/Embedded_Multitasking_with_small_microcontrollers.rar

Тогда уж и волшебное слово впридачу к нему: mbandala


--------------------
"Не дождётесь!" (С) Старик Рабинович.
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 2 2009, 22:48
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Цитата(ReAl @ Nov 2 2009, 14:24) *
Таким образом, при входе в dispatch_task в регистре SREG всегда будут флаги, оставшиеся от этих вычислений, а не мифическое "состояние процесса". Я думал, что после критического замечания "по сути", которое Вы просили, Вы сможете сами критически глянуть на свой код.
Ещё понятно было бы, если бы dispatch_task() не принимал аргументов (какая разница - всё равно макрос берёт их из тех же глобальных параметров, кстати, это тоже несколько уменьшило бы код), тогда действительно в SREG был бы результат последних операций процесса перед вызовом диспетчера. Ну и как это применать? Так, чтоли?
Код
    c = a + b;
    DISPATCH;
    if( SREG & (1<<SREG_Z) ) {
         // c присвоен 0 перед вызовом диспетчера
    }


Байт на задачу, при 4 задачах - больше 3% ОЗУ упомянутой tiny2313


Вы были полностью правы. Непростительная небрежность с моей стороны. Как при написании, так и при тестировании.
Также правы в том, что это никому не надо. Пообщался с народом использующим mRTOS и уже наклепавших кучу проектов, проектиков. Так они даже и не знали о сохранение и восстановлении SREG - потому как оно им совершенно не нужно! И как использовать тоже не понимают. У них и так все хорошо работало и работает.
Когда я писал этот код, то как приверженец автоматного стиля программирования для микроконтроллерных систем считал, что сохранение состояния процесса в момент передачи управления - это хороший стиль. Но в данном случае - действительно ни к чему.
Переписал, протестировал. Экономия небольшая - откомпилировал последний проект на ATMega162.
Старая версия - 2997 words 36.6% Flash
Новая версия - 2989 words 36.5% Flash
Но убран лишний код.

Перепаковал и залил на сайт. Доступно по прежней ссылке.

Благодарю за конструктивную критику!
Go to the top of the page
 
+Quote Post
RA3WUM
сообщение Nov 3 2009, 10:58
Сообщение #38


Частый гость
**

Группа: Участник
Сообщений: 163
Регистрация: 22-02-07
Пользователь №: 25 578



Цитата(sensor_ua @ Nov 1 2009, 10:41) *
Не буду разбираться кто где плагиатор. Вот попался линк на "Embedded Multitasking with small microcontrollers" Keith E. Curtis.
hчсp://rapidshare.com/files/123380312/Embedded_Multitasking_with_small_microcontrollers.rar

Спасибо, очень полезная книга smile.gif

Сообщение отредактировал RA3WUM - Nov 3 2009, 10:59


--------------------
Мужество есть лишь у тех, кто ощутил сердцем страх!
В. Кипелов, Беги за солнцем.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 3 2009, 11:31
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(RA3WUM @ Nov 3 2009, 14:58) *
Спасибо, очень полезная книга smile.gif

А вы могли-бы выложить её в этом топике?
С рапиды доступно скачивание только преиум-пользователям по этому скачать не получилось.

Вопрос снят - с работы удалось зайти и скачать smile.gif

To plus спасибо за волшебное слово smile.gif

Сообщение отредактировал mempfis_ - Nov 3 2009, 11:57
Go to the top of the page
 
+Quote Post
LVII
сообщение Nov 3 2009, 11:38
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 13-05-08
Пользователь №: 37 469



Цитата(Огурцов @ Nov 2 2009, 20:01) *
Я бы хотел ось, которая поддерживает все. Опциями конечно, а не все сразу. Например, последовательные порты, работа с файловой системой, с ммс, с флешью, с озу, с индикаторами и т.д. А в урезанных осях против "своего цикла" я смысла не вижу.

ОС создает скелетон кода. Далее подключайте необходимые драйвера. Для последовательных портов, параллельной и последовательной FLASH, параллельной и последовательной ОЗУ, индикаторами, разнообразными дачиками написал сам. Драйвера для контроллера Ethernet предоставляются фирмой-производителем. На просторах Интернета огромное количество разнообразных открытых библиотек, особенно под компилятор WinAVR, просто портируемых на CodeVision. Если очень упрощенно, то далее так - для отдельного устройства(драйвера), отдельный процесс(ы) с приоритетом(и), установленным по степени важности событий происходящим на этом устройстве.

"Embedded Multitasking with small microcontrollers" Keith E. Curtis. - http://www.onlinedisk.ru/file/257940/

Сообщение отредактировал LVII - Nov 3 2009, 11:44
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 3 2009, 14:00
Сообщение #41


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(LVII @ Nov 3 2009, 12:38) *
На просторах Интернета огромное количество разнообразных

А то я не знаю. Но вот собрать все вместе, оттестировать и опубликовать (бесплатно!) желающих не видно - место вакантно, занимайте. И в минусе не останетесь - найдутся желающие на заплатить за бесплатное, но адаптированное специально под них.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 3 2009, 15:34
Сообщение #42


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Огурцов @ Nov 3 2009, 17:00) *
место вакантно, занимайте.

Давайте не будем забывать о качестве хлама кода, болтающегося по просторам инета. Место Сизифа всегда вакантно sad.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 3 2009, 17:08
Сообщение #43


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

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



Цитата(Огурцов @ Nov 2 2009, 20:01) *
Я бы хотел ось, которая поддерживает все. Опциями конечно, а не все сразу. Например, последовательные порты, работа с файловой системой, с ммс, с флешью, с озу, с индикаторами и т.д. А в урезанных осях против "своего цикла" я смысла не вижу.
Nut/OS (ethernut), если если говорить о кооперативных ОС. Но она "тяжёлая" в том смысле, что в мелкий кристалл всё равно не полезет.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Nov 3 2009, 21:20
Сообщение #44


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Так и не надо в мелкий. Надо мало секса с этими камнями и осями.

Цитата(_Pasha @ Nov 3 2009, 15:34) *
Давайте не будем забывать о качестве хлама кода, болтающегося по просторам инета.

Так и я о том же. Достойно будет собрать под одним, а не говорить, что де мол поищи оно в инете.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Nov 3 2009, 22:46
Сообщение #45


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

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



Цитата(Огурцов @ Nov 3 2009, 23:20) *
Так и не надо в мелкий. Надо мало секса с этими камнями и осями.
Ну так вещь вроде как проверенная временем. Даже платы продаются в терре и у нас в имраде, но схемы открыты все и ось открыта.
Я давно смотрел, по железу там только два варианта, кажется, было (ethernut1 на мега103 с последующим апгрейдом на мегу128 и ethernut2 на атмеловском АРМ at91r4008, если не путаю), сейчас больше.
Управление памятью, система драйверов к железу, разные дополнительные платки, включая mp3-шную на VS1001
Всё подробно описано.
www.ethernut.de

Хотелось как-то посмотреть поплотнее, так как это хороший и большой пример того, что я плохо понимаю (если уж каждой задаче выделен свой стек - чего такого сильно экономит кооперативка по сравнению с вытеснялкой). Но как-то не срослось.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 3 2009, 23:19
Сообщение #46


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ReAl @ Nov 4 2009, 01:46) *
если уж каждой задаче выделен свой стек - чего такого сильно экономит кооперативка по сравнению с вытеснялкой.

Только прыгать от задачи к задаче может чаще, пмсм, ввиду меньшего переключаемого контекста.
Go to the top of the page
 
+Quote Post
defunct
сообщение Nov 3 2009, 23:27
Сообщение #47


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(ReAl @ Nov 4 2009, 00:46) *
если уж каждой задаче выделен свой стек - чего такого сильно экономит кооперативка по сравнению с вытеснялкой

время программиста экономит при межзадачном взаимодействии, за счет простого обращения с общей памятью.
не нужно ни локов, ни крит секций.
Go to the top of the page
 
+Quote Post
oleg_lwd
сообщение Dec 18 2009, 09:34
Сообщение #48


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



Посмотрел mRTOS, решил до кучи написать свою переключалку задач под CVAVR (1.25.3) кооперативная, карусельная со своими стеками. Прикрепленный файл  MyOS.zip ( 4.18 килобайт ) Кол-во скачиваний: 257
Go to the top of the page
 
+Quote Post
oleg_lwd
сообщение Dec 21 2009, 08:22
Сообщение #49


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



В процессе отладки реального проекта, пришлось немножко все облагородить. Вроде работает.Прикрепленный файл  MyOS.zip ( 8.1 килобайт ) Кол-во скачиваний: 289
Go to the top of the page
 
+Quote Post
oleg_lwd
сообщение Jan 11 2010, 09:22
Сообщение #50


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



Сделал вариант для мелких AVR. Прерывания теперь имеют свой стек данных, что позволяет сделать глубины стеков данных задач оптимальными. Требования для малых стеков:

FLASH: 20 байт переключение задач, 6 байт на опрос задачи, 12 байт инициализация задачи, 4-14 (+10 прерывания) байт на сохранение в стек локальных регистровых переменных при каждом переключении, того на три задачи 74 байта FLASH, если не считать сохранений при переключении

ОЗУ: 2 байта на задачу, байт на прерывания , 2 байта на задачу для каждого стека задачи (т.к. возникновение прерывания случайно в любом из стеков) , того на три задачи 13 байт лишнего ОЗУ .
Прикрепленный файл  MyOS2.zip ( 8.41 килобайт ) Кол-во скачиваний: 317
Go to the top of the page
 
+Quote Post
oll
сообщение Jan 12 2010, 13:10
Сообщение #51


Частый гость
**

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



Цитата(oleg_lwd @ Jan 11 2010, 14:22) *
Сделал вариант для мелких AVR.

Спасибо. Хотелось бы (для тупых) легонькое описание типа как у LVII.
Go to the top of the page
 
+Quote Post
oleg_lwd
сообщение Jan 13 2010, 12:24
Сообщение #52


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 26-10-05
Пользователь №: 10 131



Даже не и знаю что тут объяснять

void OS_yeld(void) - Смена стеков Z-указывает на текущий своп стека.

Идея сохранения локальных регистровых переменных (ЛРП) основана на том, что CV(У меня 1.25.3 у новых CV не знаю) при входе в функцию сохраняет их в стек данных в последнюю очередь (до 6 регистров ), этот стек и используется для сохранения ЛРП при смене задач, но задачи и сопроцедуры теперь НЕ сохраняют ЛРП, эта задача теперь возложена на ВЫЗЫВАЮЩЮЮ задачу.
Код для сохранения восстановления в стеке ЛРП такой же, как у самого компилятора, но что делает компилятор автоматически при входе и выходе из функции, для смены задач приходится делать вручную (подсмотрев код для сохранения восстановления в стеке ЛРП в asm файле, для CV 1.25.3 - шесть вариантов).

пример допустим 4 ЛРП, Swp –своп стека.

#asm("adiw R28,4");#asm("rcall __SAVELOCR4"); - сохранили ЛРП (__SAVELOCR4-подсмотрели asm)

Swp; Z указывает на Swp (в CV 1.25.3 работает)

OS_yeld(); - переход

#asm("rcall __LOADLOCR4");-восстановили ЛРП

Попытался как-то это автоматизировать с помощью дефайнов.

Начальная инициализация свопов стеков и первого входа в задачи дело вкуса разработчика как у меня сделано мне не нравится неудобно.
Таймеры , события, mutex – тоже дело вкуса разработчика.

Передача данных задаче через R22R23, пример есть для варианта для mega128

Кстати подобная идея для IAR где то на форуме уже была.
Go to the top of the page
 
+Quote Post
rembas
сообщение Nov 7 2013, 13:14
Сообщение #53





Группа: Новичок
Сообщений: 2
Регистрация: 7-11-13
Пользователь №: 79 091



[quote name='LVII' date='Nov 3 2009, 15:38' post='671658']
ОС создает скелетон кода. Далее подключайте необходимые драйвера. Для последовательных портов, параллельной и последовательной FLASH, параллельной и последовательной ОЗУ, индикаторами, разнообразными дачиками написал сам. Драйвера для контроллера Ethernet предоставляются фирмой-производителем. На просторах Интернета огромное количество разнообразных открытых библиотек, особенно под компилятор WinAVR, просто портируемых на CodeVision. Если очень упрощенно, то далее так - для отдельного устройства(драйвера), отдельный процесс(ы) с приоритетом(и), установленным по степени важности событий происходящим на этом устройстве.

"Embedded Multitasking with small microcontrollers" Keith E. Curtis. - http://www.onlinedisk.ru/file/257940/


Уважаемый LVII проверил Ваш вариант mRTOS на Atmega 128. Собственно проект дергает 3-мя ножками с помощью 3-х тасков(инверсия пина). есть ряд вопросов:
1. если запускаю 1 таск есть разрывы между соседними "пачками" 05.gif 05.gif - откуда вообще пачки ? В мануале о них не слова. выход по DISPATCH.
2. если запускаю таск с выходом WAIT(x). Идет повторение со скважностью "пачек". ситуация от изменения х не зависит.
3. запуск 2 и более тасков дает такой же результат .
что с этим делать ? (сделано все по мануалу).
Go to the top of the page
 
+Quote Post
rembas
сообщение Nov 12 2013, 07:35
Сообщение #54





Группа: Новичок
Сообщений: 2
Регистрация: 7-11-13
Пользователь №: 79 091



HELP Уважаемый LVII проверил Ваш вариант mRTOS на Atmega 128. Собственно проект дергает 3-мя ножками с помощью 3-х тасков(инверсия пина). есть ряд вопросов:
1. если запускаю 1 таск есть разрывы между соседними "пачками" 05.gif 05.gif - откуда вообще пачки ? В мануале о них не слова. выход по DISPATCH.
2. если запускаю таск с выходом WAIT(x). Идет повторение со скважностью "пачек". ситуация от изменения х не зависит.
3. запуск 2 и более тасков дает такой же результат .
что с этим делать ? (сделано все по мануалу).
Go to the top of the page
 
+Quote Post
gabd
сообщение Mar 4 2016, 10:22
Сообщение #55





Группа: Новичок
Сообщений: 4
Регистрация: 1-10-15
Пользователь №: 88 657



Цитата(oleg_lwd @ Jan 13 2010, 17:24) *
Даже не и знаю что тут объяснять

Не знаю, актуален ли этот форум, тем более для oleg_lwd.
Но поинтересуюсь в целях повышения своей компьютерной безграмотности, что означает выделенное:
#define OS_DEF_TASK(n,x)Tswap x={ST_##n,DATA_ST_##n};char PST_##n @(ST_##n+1)

#define _YELD(x) {x;OS_yeld();}
, где x типа Tswap:
Код
typedef struct {
    #ifdef _STACK_ONE_BYTE_
    unsigned char sp;
    #else
    unsigned int sp;
    #endif
    #ifdef _DATA_STACK_ONE_BYTE_
    unsigned char dp;
    #else
    unsigned int dp;
    #endif
} Tswap;

Go to the top of the page
 
+Quote Post
arhiv6
сообщение Mar 9 2016, 19:09
Сообщение #56


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



В образовательных целях решил попробовать разобраться, как устроена это ОС. В процессе изучения исходного кода появились пару вопросов:
1) Насколько я понимаю, у каждой задачи есть свой контекст (стек вызовов и локальные переменные), при переключении между задачами контекст текущей задачи должен сохраняться и, когда это потребуется, восстанавливаться. В других ОС обычно при создании задачи пользователем явно указывается размер выделяемой памяти для хранения её контекста, а в этой ОС такого нет - я не вижу. Как в этой ОС в памяти хранится стек и локальные переменные для каждой задачи?
2) В исходниках есть несколько функций, написанных на ассемблере - насколько я понял, в них проводятся какие-то манипуляции с указателями на вершину стека. А почему написано на ассемблере - это такая максимальная оптимизация по скорости или на СИ этого просто не сделать?
Заранее спасибо за ответы!


--------------------
Go to the top of the page
 
+Quote Post
gabd
сообщение Mar 10 2016, 11:28
Сообщение #57





Группа: Новичок
Сообщений: 4
Регистрация: 1-10-15
Пользователь №: 88 657



Если об ОС от oleg_lwd, имхо (я сам учусь sm.gif)
Цитата(arhiv6 @ Mar 10 2016, 00:09) *
1) явно указывается размер выделяемой памяти

в main2.c
Код
// глубина стека данных
#define L_SD_MAIN 16
#define L_SD_1    16
#define L_SD_2    16
#define L_SD_3    16
// глубина стека
#define L_S_MAIN 16
#define L_S_1    16
#define L_S_2    16
#define L_S_3    16

(для реальной задачи 16 - маловато)
далее os2.h
Код
// абсолютные стеки      
#define DATA_ST_MAIN SRAM_BEGIN+_DATA_STACK
#define DATA_ST_1 DATA_ST_MAIN-L_SD_MAIN
#define DATA_ST_2 DATA_ST_1-L_SD_1
#define DATA_ST_3 DATA_ST_2-L_SD_2
#define DATA_ST_4 DATA_ST_3-L_SD_3
#define DATA_ST_5 DATA_ST_4-L_SD_4
#define DATA_ST_6 DATA_ST_5-L_SD_5

#define _STACK _HEAP_START_-1
#define ST_MAIN _STACK
#define ST_1 ST_MAIN-L_S_MAIN-2
#define ST_2 ST_1-L_S_1
#define ST_3 ST_2-L_S_2  
#define ST_4 ST_3-L_S_3  
#define ST_5 ST_4-L_S_4  
#define ST_6 ST_5-L_S_5
Go to the top of the page
 
+Quote Post
arhiv6
сообщение Mar 10 2016, 12:03
Сообщение #58


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



gabd, нет, вопросы были о mRTOS.


--------------------
Go to the top of the page
 
+Quote Post
gabd
сообщение Mar 15 2016, 07:48
Сообщение #59





Группа: Новичок
Сообщений: 4
Регистрация: 1-10-15
Пользователь №: 88 657



Наконец-то, скачал этот mRTOS (на работе narod блокирован, дома - забываю sm.gif)
Мои наблюдения - поправьте, если не прав.
Похоже, всё упрощено. (Имхо, можно ещё проще - simple task switcher)
Цитата(arhiv6 @ Mar 10 2016, 00:09) *
стек вызовов и локальные переменные

Вход в задачу всегда в одной точке, так что стек вызовов - пустой?
Локальные переменные, которые должны сохраняться между вызовами, должны быть статическими. Об этом сказано в документации.


Сообщение отредактировал gabd - Mar 15 2016, 07:49
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:08
Рейтинг@Mail.ru


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