Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mRTOS-кооперативная операционная система, порт CodeVision, порт WinAvr
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
oll
Цитата(oleg_lwd @ Jan 11 2010, 14:22) *
Сделал вариант для мелких AVR.

Спасибо. Хотелось бы (для тупых) легонькое описание типа как у LVII.
oleg_lwd
Даже не и знаю что тут объяснять

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 где то на форуме уже была.
rembas
[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 и более тасков дает такой же результат .
что с этим делать ? (сделано все по мануалу).
rembas
HELP Уважаемый LVII проверил Ваш вариант mRTOS на Atmega 128. Собственно проект дергает 3-мя ножками с помощью 3-х тасков(инверсия пина). есть ряд вопросов:
1. если запускаю 1 таск есть разрывы между соседними "пачками" 05.gif 05.gif - откуда вообще пачки ? В мануале о них не слова. выход по DISPATCH.
2. если запускаю таск с выходом WAIT(x). Идет повторение со скважностью "пачек". ситуация от изменения х не зависит.
3. запуск 2 и более тасков дает такой же результат .
что с этим делать ? (сделано все по мануалу).
gabd
Цитата(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;

arhiv6
В образовательных целях решил попробовать разобраться, как устроена это ОС. В процессе изучения исходного кода появились пару вопросов:
1) Насколько я понимаю, у каждой задачи есть свой контекст (стек вызовов и локальные переменные), при переключении между задачами контекст текущей задачи должен сохраняться и, когда это потребуется, восстанавливаться. В других ОС обычно при создании задачи пользователем явно указывается размер выделяемой памяти для хранения её контекста, а в этой ОС такого нет - я не вижу. Как в этой ОС в памяти хранится стек и локальные переменные для каждой задачи?
2) В исходниках есть несколько функций, написанных на ассемблере - насколько я понял, в них проводятся какие-то манипуляции с указателями на вершину стека. А почему написано на ассемблере - это такая максимальная оптимизация по скорости или на СИ этого просто не сделать?
Заранее спасибо за ответы!
gabd
Если об ОС от 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
arhiv6
gabd, нет, вопросы были о mRTOS.
gabd
Наконец-то, скачал этот mRTOS (на работе narod блокирован, дома - забываю sm.gif)
Мои наблюдения - поправьте, если не прав.
Похоже, всё упрощено. (Имхо, можно ещё проще - simple task switcher)
Цитата(arhiv6 @ Mar 10 2016, 00:09) *
стек вызовов и локальные переменные

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