|
|
  |
mRTOS-кооперативная операционная система, порт CodeVision, порт WinAvr, mRTOS-кооперативная операционная система для AVR |
|
|
|
Jan 11 2010, 09:22
|

Участник

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

|
Сделал вариант для мелких AVR. Прерывания теперь имеют свой стек данных, что позволяет сделать глубины стеков данных задач оптимальными. Требования для малых стеков: FLASH: 20 байт переключение задач, 6 байт на опрос задачи, 12 байт инициализация задачи, 4-14 (+10 прерывания) байт на сохранение в стек локальных регистровых переменных при каждом переключении, того на три задачи 74 байта FLASH, если не считать сохранений при переключении ОЗУ: 2 байта на задачу, байт на прерывания , 2 байта на задачу для каждого стека задачи (т.к. возникновение прерывания случайно в любом из стеков) , того на три задачи 13 байт лишнего ОЗУ .
MyOS2.zip ( 8.41 килобайт )
Кол-во скачиваний: 317
|
|
|
|
|
Jan 12 2010, 13:10
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 10-10-05
Пользователь №: 9 463

|
Цитата(oleg_lwd @ Jan 11 2010, 14:22)  Сделал вариант для мелких AVR. Спасибо. Хотелось бы (для тупых) легонькое описание типа как у LVII.
|
|
|
|
|
Jan 13 2010, 12:24
|

Участник

Группа: Участник
Сообщений: 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 где то на форуме уже была.
|
|
|
|
|
Nov 7 2013, 13:14
|
Группа: Новичок
Сообщений: 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 таск есть разрывы между соседними "пачками"  - откуда вообще пачки ? В мануале о них не слова. выход по DISPATCH. 2. если запускаю таск с выходом WAIT(x). Идет повторение со скважностью "пачек". ситуация от изменения х не зависит. 3. запуск 2 и более тасков дает такой же результат . что с этим делать ? (сделано все по мануалу).
|
|
|
|
|
Nov 12 2013, 07:35
|
Группа: Новичок
Сообщений: 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 и более тасков дает такой же результат . что с этим делать ? (сделано все по мануалу).
|
|
|
|
|
Mar 4 2016, 10:22
|
Группа: Новичок
Сообщений: 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;
|
|
|
|
|
Mar 10 2016, 11:28
|
Группа: Новичок
Сообщений: 4
Регистрация: 1-10-15
Пользователь №: 88 657

|
Если об ОС от oleg_lwd, имхо (я сам учусь  ) Цитата(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
|
|
|
|
|
Mar 15 2016, 07:48
|
Группа: Новичок
Сообщений: 4
Регистрация: 1-10-15
Пользователь №: 88 657

|
Наконец-то, скачал этот mRTOS (на работе narod блокирован, дома - забываю  ) Мои наблюдения - поправьте, если не прав. Похоже, всё упрощено. (Имхо, можно ещё проще - simple task switcher) Цитата(arhiv6 @ Mar 10 2016, 00:09)  стек вызовов и локальные переменные Вход в задачу всегда в одной точке, так что стек вызовов - пустой? Локальные переменные, которые должны сохраняться между вызовами, должны быть статическими. Об этом сказано в документации.
Сообщение отредактировал gabd - Mar 15 2016, 07:49
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|