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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> mRTOS-кооперативная операционная система, порт CodeVision, порт WinAvr, mRTOS-кооперативная операционная система для AVR
_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  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:48
Рейтинг@Mail.ru


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