|
Подскажите пожалуйста, про многозадачность. |
|
|
|
Oct 18 2006, 07:29
|
Местный
  
Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377

|
Есть несколько задач (программ) которые должны выполнятся с минимальным временем, можно организовать как линейный список функций, которые последовательно вызываются из главной функции main() при условии что время выполнения каждой функции ограничено т.е. внутри функции нет кода который задерживает выполнения (ожидает чего либо). Например одна функция обрабатывает принятый массив с USARTа. другая расшифровывает принятую команду и выполняет ее, подготавливает ответ к отправке (квитирование). Еще пару функций, которые что-то делают (обслуживают клавиатуру, исполнительные устройства). Получается все запутанно, если делать все функции в виде конечных автоматов с минимальным временем работы каждой. Хорошо было бы, если каждая функция выполнялась в виде задачи, ожидает, данные с параллельного потока пускай ждет, получила что хотела, выполняет. Есть задержка в функции скажем, на 20 секунд, пускай ждет, в это время выполняются другие функции. С операционными системами как-то все сложно, может планировщик задач да и все. Какие есть решение не сложные? Механизм взаимодействия функций друг с другом.
|
|
|
|
|
 |
Ответов
|
Oct 26 2006, 22:05
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
2vod Смотрел,хорошая оська,незнаю как насчет фунциональности,так как глубоко не копал, но написано стильно и понравились кое какие нестандартные приемы,в частности реализация косвенного перехода на подпрограмму (задачу) с маневрами со стеком и т.д. Оказывается не только я такой "экстремал-извращенец", хотя конечно вот это необязательно было делать Код ____INIT_THREAD_CONTEXT: std Y+CONST_THREAD_CONTEXT_SIZE+3,r24;save SPL std Y+CONST_THREAD_CONTEXT_SIZE+2,r25;save SPH std Y+CONST_THREAD_CONTEXT_SIZE+1,REG_OS_TEMP;save SREG std Z+CONST_THREAD_AMOUNT,Yh st Z+,Yl adiw Y,CONST_THREAD_MEM_SIZE RET ;------------------------------------------------ Для этого есть такая рееедко применяемая ,но всетаки существующая команда косвенного перехода на подпрограмму по Z icall .  Скажу чесно,оси никогда не цеплял,так как считаю что асм потеряет свои преимущества перед другими языками при ее применении. Но своебразную многозадачность реализовывал.Сами знаете ,частенько на асме проги небольшие выходят .Вот и захотельсь мне зделать многофункциональный девайс ,тоесть впихнуть несколько программ (которые были уже написаны) в один контроллер. Я не навязываю свой способ ,но я думаю будет интересен.Раскажу вкратце. 1 Заместь векторов в таблице указываем вызов планировщика Например заместь rjmp PROG rjmp INT0 rjmp INT1 ..... Пишем rcall PLAN_START rcall PLAN rcall PLAN ..... Я думаю догадались для чего заместь rjmp стоит rcall    Чтобы планировчик по стеку смог определить какой адресс вектора был у прерывания . 2 К этому адрессу плюсуем адрес начала векторов прерываний одной из программ который выбрал планировщик ,подвигаем стек,и переходим на вектор,ну а дальше как обычно. 3 Естественно в PLAN_START обнуляем память до RAMEND-1 ,последняя ячейка у нас для выбора программы,ну и т.д. Вот такие извращения.  Что нам это дает? Можно просто тупо соединять несколько программ,с сохранением абсолютно ВСЕХ прерываний для каждой программы без каких либо переделок,все что нужно если хотим программно перепрыгивать из одной программы в другую - дописать в нужном месте номер проги в последнюю ячейку и call PLAN_START  
|
|
|
|
|
Oct 27 2006, 03:42
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500

|
to bodja74 Цитата(bodja74 @ Oct 27 2006, 05:05)  хотя конечно вот это необязательно было делать Код ____INIT_THREAD_CONTEXT: Этим вызовом я инициализирую 1. в стек задчи сохраняю адрес возврата (в д.с. стартовый адрес) 2. инициализирую соотв. ячейку в таблице указателей задач текущим указателем стека задачи после всей инициализации молча прыгаю в планировщик. там пусть сам выбирает [offtopic] Цитата(bodja74 @ Oct 27 2006, 05:05)  Для этого есть такая рееедко применяемая ,но всетаки существующая команда косвенного перехода на подпрограмму по Z icall .  Я пока "не догнал", как там "матеро" можно его использовать, но будем думать. Там еще проблема. Я регистр Z оставил для пользования прерываниям - такая специфика - надо каждые __256 тактов__ _гарантировано_ обновить ШИМ-регистр таймера. А все значения в таблице прописаны во флэш. таблица 1кб  Цитата(bodja74 @ Oct 27 2006, 05:05)  Скажу чесно,оси никогда не цеплял,так как считаю что асм потеряет свои преимущества перед другими языками при ее применении. ИМХО напрасно, если писать что-то тяжелее "эха" на уарте. Цитата(bodja74 @ Oct 27 2006, 05:05)  Но своебразную многозадачность реализовывал.Сами знаете ,частенько на асме проги небольшие выходят .Вот и захотельсь мне зделать многофункциональный девайс ,тоесть впихнуть несколько программ (которые были уже написаны) в один контроллер. Ну то что Вы копали, спасибо кстати, это и есть "реализация своеобразной многозадачности". про проги небольшие молчу - свою "ОС" пользую когда прога занимает от 1кб. [/offtopic] Цитата(bodja74 @ Oct 27 2006, 05:05)  Я не навязываю свой способ ,но я думаю будет интересен.Раскажу вкратце. ... Идею понял. Поздравляю, редкостное извращение  Я придерживаюсь тех позиций что прерывание должно отработать максимально быстро. И прерывания полностью отвязаны от процессов. пример кода к указанному выше требованию. Код MODULATOR_INT: ____OCR_REG_WRITE MOD_PWM;1 lds Zh,ADR_MOD_TABLE_HIGH;2 mov Zl,MOD_ADR ;1 lpm MOD_PWM,Z+ ;3 с инкрементом mov MOD_ADR,Zl ;1 cpse MOD_PWM,Zh ;1/2 хитрость RETI ;4 - 13 тактов SREG не портится, Z_reg портиться далее код перезагрузки указателей на следующий сигнал В реализиции "AVRasmOS.zip" на любой евент может быть назначена любая комбинация задач. ну а в прерывании ____EVENT_SET и в путь  просто лишний переход RCALL (как у Вас) и последющие вычисления требует (ИМХО навскидку) многовато тактов и не способствуют универсализиции, той что не потребует много накладных расходов.
|
|
|
|
|
Oct 27 2006, 20:13
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(yod @ Oct 27 2006, 06:42)  Я пока "не догнал", как там "матеро" можно его использовать, но будем думать. Там еще проблема. Я регистр Z оставил для пользования прерываниям - такая специфика - надо каждые __256 тактов__ _гарантировано_ обновить ШИМ-регистр таймера. А все значения в таблице прописаны во флэш. таблица 1кб  Ну например сделать свой программный стек и сохранять адресс возврата из прерваной задачи. Цитата ИМХО напрасно, если писать что-то тяжелее "эха" на уарте. Я про реалтайм,тяжко будет поцепить на такую ось допустим генератор тестового видеосигнала,где потребуется прервание через каждые 64 микросекунды с наивысшим приоритетом. Цитата Идею понял. Поздравляю, редкостное извращение  Я придерживаюсь тех позиций что прерывание должно отработать максимально быстро. И прерывания полностью отвязаны от процессов. пример кода к указанному выше требованию. Код MODULATOR_INT: ____OCR_REG_WRITE MOD_PWM;1 lds Zh,ADR_MOD_TABLE_HIGH;2 mov Zl,MOD_ADR;1 lpm MOD_PWM,Z+;3 с инкрементом mov MOD_ADR,Zl;1 cpse MOD_PWM,Zh;1/2 хитрость RETI ;4 - 13 тактов SREG не портится, Z_reg портиться далее код перезагрузки указателей на следующий сигнал В реализиции "AVRasmOS.zip" на любой евент может быть назначена любая комбинация задач. ну а в прерывании ____EVENT_SET и в путь  просто лишний переход RCALL (как у Вас) и последющие вычисления требует (ИМХО навскидку) многовато тактов и не способствуют универсализиции, той что не потребует много накладных расходов. Хе,ну я уже говорил,я легко вцепил к своему осцилу генератор видео,без лишних телодвижений. Вот "скоростной" вариант планировщика прерываний Код PLAN: pop R16 ;Сдвигаем стек ,старший адресс вектора прерывания нам не нужен ,все равно 00 pop R16 ;Сдвигаем стек и заносим младший в Р16 in R2,SREG ;Сохраням СРЕГ в регистре lds ZH,(ramend-1);Заносим адресс начала выбранной проги lds ZL,(ramend) adc ZL,R16 ;Складываем адресс программы и адресс вектора brcc (PC+2) ;если у нас флаг переноса значит ZH+1 inc ZH out SREG,R2 ;востанавливаем СРЕГ icall ;переходим на вектор прерывания Переход на подпрограмму фиксировано увеличивается на 16 тактов для любого прерывания и любой программы  Кто придумает короче поставлю пиво!!! В основной программе и подрограммах не используются R2,R16,Z в прерывания можно использовать в качестве промежуточных. В (ramend-1) и ,(ramend) заносится адресс выбранной программы,естественно при иницилизации стека (ramend-2) ЗЫ В принципе подобные подходы вравнивать ,тоже самое что сравнивать топор с колесом,но думаю кто интересуется многозадачностью будет из чего выбрать
|
|
|
|
|
Oct 31 2006, 11:16
|
Группа: Новичок
Сообщений: 12
Регистрация: 4-11-04
Пользователь №: 1 039

|
.def Zero = rxx ;любой регистр
clr Zero ; в инициализации нулевая константа часто используется
;adc ZL,R16 ;Складываем адресс программы и адресс вектора ; brcc (PC+2) ;если у нас флаг переноса значит ZH+1 ; inc ZH
;в первой строке ошибка !!!
add zl,r16 adc zh,Zero
Кто придумает короче поставлю пиво!!!
|
|
|
|
|
Oct 31 2006, 16:30
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(bodja74 @ Oct 31 2006, 13:02)  Цитата(trofim @ Oct 31 2006, 14:16)  Кто придумает короче поставлю пиво!!!
 ,  ,  Вместо adc нужно add В этом коде ,есть еще одна ошибка ,исправив ее,ускорим выполнение еще на 1такт.  Стек уже подправлен, поэтому надо вместо icall поставить ijmp. Выигрыш 1 такт. Короче, с вас пиво, вас за язык никто не тянул(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 31 2006, 16:40
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(=GM= @ Oct 31 2006, 19:30)  Цитата(bodja74 @ Oct 31 2006, 13:02)  Цитата(trofim @ Oct 31 2006, 14:16)  Кто придумает короче поставлю пиво!!!
 ,  ,  Вместо adc нужно add В этом коде ,есть еще одна ошибка ,исправив ее,ускорим выполнение еще на 1такт.  Стек уже подправлен, поэтому надо вместо icall поставить ijmp. Выигрыш 1 такт. Короче, с вас пиво, вас за язык никто не тянул(:-). Абсолютно верно,ДВА ПИВА!!!   ,  ,  ,
|
|
|
|
|
Oct 31 2006, 17:41
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(bodja74 @ Oct 31 2006, 16:40)  Абсолютно верно,ДВА ПИВА!!!   ,  ,  ,  Ну ладно, при случае(:-). А вы где территориально? Кстати, почему изначально 16 тактов было, должно вроде быть 17(:-). Вот еще подумал, используются три регистра, не гуд. А мы знаем, что первый pop r16 заносит гарантированный ноль. Если написать так Код [font=Courier New] PLANi: pop r2 ;старший байт адреса вектора не нужен pop r2 ;сдвигаем стек и заносим младший lds ZH,(ramend-1) ;адрес начала выбранной проги lds ZL,(ramend) in r2,SREG ;cохраням SREG sbiw zl,-vector(i) ;реальный адрес вектора out SREG,R2 ;востанавливаем SREG ijmp [/font=Courier New] то будет использоваться всего один регистр r2. Но, конечно, под каждое i-ое прерывание должна быть своя подрограмма PLANi и своя константа vector(i) (1, 2, 3, …)
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 31 2006, 19:27
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(=GM= @ Oct 31 2006, 20:41)  Ну ладно, при случае(:-). А вы где территориально? Украина,Бердичев Цитата Кстати, почему изначально 16 тактов было, должно вроде быть 17(:-). Команда brcc (PC+2) выполняется за 1 такт если условие не выполняется ,и за 2 если перепрыгивает. хотя если учесть, что заменяется в векторах jmp(rjmp) на call(rcall) тогда +1 Цитата Вот еще подумал, используются три регистра, не гуд. А мы знаем, что первый pop r16 заносит гарантированный ноль. Если написать так Код [font=Courier New] PLANi: pop r2 ;старший байт адреса вектора не нужен pop r2 ;сдвигаем стек и заносим младший lds ZH,(ramend-1);адрес начала выбранной проги lds ZL,(ramend) in r2,SREG ;cохраням SREG sbiw zl,-vector(i);реальный адрес вектора out SREG,R2 ;востанавливаем SREG ijmp [/font=Courier New] то будет использоваться всего один регистр r2. Но, конечно, под каждое i-ое прерывание должна быть своя подрограмма PLANi и своя константа vector(i) (1, 2, 3, …) Ну раз такая жара ,тогда в векторах ставим .org 0 jmp(rjmp) PLAN_START jmp(rjmp) PLAN1 jmp(rjmp) PLAN2 .... и сносим pop R2 в результате Код PLANi: lds ZH,(ramend-1);адрес начала выбранной проги lds ZL,(ramend) in r2,SREG ;cохраням SREG adiw zl,vector(i);реальный адрес вектора out SREG,R2 ;востанавливаем SREG ijmp Хотя перспектива включения такого кода для каждого прерывания меня не очень радует,но звание "сверхскоростного" он заслуживает.
|
|
|
|
|
Nov 1 2006, 11:07
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
GM Ну ладно, при случае(:-). А вы где территориально? bodja74 Украина,Бердичев Ясенько, вам пора музей контрабандистов открывать(:-). Еще вроде там венчание Бальзака было, в костеле...А Никольская церковь стоит? bodja74 Ну раз такая жара, тогда в векторах ставим .org 0 jmp(rjmp) PLAN_START jmp(rjmp) PLAN1 jmp(rjmp) PLAN2 .... и сносим pop R2 в результате Код PLANi: lds ZH,(ramend-1) ;адрес начала выбранной проги lds ZL,(ramend) in r2,SREG ;cохраням SREG adiw zl,vector(i) ;реальный адрес вектора out SREG,R2 ;востанавливаем SREG ijmp bodja74 Хотя перспектива включения такого кода для каждого прерывания меня не очень радует, но звание "сверхскоростного" он заслуживает  Ну раз пошла такая пьянка... Если хранить адрес проги не в памяти, а в регистрах (r5-r4), то получим суперсверхскоростной код(:-) Код PLANi: in r2,SREG ;cохраням SREG movw r30,r4 ;current program address adiw zl,vector(i) ;реальный адрес вектора out SREG,R2 ;востанавливаем SREG ijmp Ужоснах, если сравнивать с исходным кодом(:-). Всего 5 слов кода на прерывание, не так уж и много для вставки. Зато скорость удвоилась: 10 тактов по сравнению с 20 исходными! Это ж скока пива! Не, я стока не выпью(:-)
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 1 2006, 16:41
|
Знающий
   
Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984

|
Цитата(=GM= @ Nov 1 2006, 14:07)  GM Ну ладно, при случае(:-). А вы где территориально?
bodja74 Украина,Бердичев
Ясенько, вам пора музей контрабандистов открывать(:-). Еще вроде там венчание Бальзака было, в костеле...А Никольская церковь стоит? Ааа,бывали в наших краях,будете проезжать ,свистните,пивка попьем  Цитата Ну раз пошла такая пьянка... Если хранить адрес проги не в памяти, а в регистрах (r5-r4), то получим суперсверхскоростной код(:-) Код PLANi: in r2,SREG ;cохраням SREG movw r30,r4 ;current program address adiw zl,vector(i) ;реальный адрес вектора out SREG,R2 ;востанавливаем SREG ijmp Ужоснах, если сравнивать с исходным кодом(:-). Всего 5 слов кода на прерывание, не так уж и много для вставки. Зато скорость удвоилась: 10 тактов по сравнению с 20 исходными! Это ж скока пива! Не, я стока не выпью(:-) ПЬЕМ ПИВО ДАЛЬШЕ!!! Как вам такой вариант? Код .org 0 jmp PLAN_START ldi R16,$04 rjmp PLAN ldi R16,$08 rjmp PLAN ....
clr R17
....
PLAN: in r2,SREG ;cохраням SREG movw zl,r4 ;current program address add zl,r16 adc zh,r17 out SREG,R2 ;востанавливаем SREG ijmp Очередной изврат заключается в подмене в векторах одной команды jmp (4байта) на ldi и rjmp (по 2 байта) ,правда такой номер не пройдет для 8 и 8535 мег,но это не смертельно учитывая ,что у них не так немного памяти для размещение нескольких программ. Естественно планировщик в первых 2кило кода ,скорость таже,но зато не нужно дублировать PLAN для каждого прерывания  ЗЫ ГЫ,неслабая ось получилась  
|
|
|
|
Сообщений в этой теме
_Алекс Подскажите пожалуйста, про многозадачность. Oct 18 2006, 07:29 Сергей Б Ну для этого и придуманы прерывания, например для ... Oct 18 2006, 07:35 _Алекс Цитата(Сергей Б @ Oct 18 2006, 10:35) Ну ... Oct 18 2006, 07:42 Сергей Б Ну так ясное дело в прерывании, например для юарта... Oct 18 2006, 08:01 Alexander Storm Попробуй всеж чуток с операционками разобраться, п... Oct 18 2006, 19:24  Dog Pawlowa Осень. Пора, как все, лететь к RTOS.
Но я пока ... Oct 19 2006, 09:04   _Алекс Цитата(Dog Pawlowa @ Oct 19 2006, 12:04) ... Oct 19 2006, 09:26    Dog Pawlowa Цитата(_Алекс @ Oct 19 2006, 12:26) Поясн... Oct 19 2006, 09:48  osnwt Цитата(Alexander Storm @ Oct 18 2006, 22... Oct 19 2006, 14:09   AVR Цитата(osnwt @ Oct 19 2006, 18:09) Цитата... Oct 19 2006, 16:38 GinRider Цитата(_Алекс @ Oct 18 2006, 10:29) Получ... Oct 18 2006, 08:13 Сергей Б Цитата(GinRider @ Oct 18 2006, 12:13) Цит... Oct 18 2006, 08:27 rezident Можно и без вложенных прерываний в одном прерывани... Oct 18 2006, 08:37 GetSmart В винде вот красиво сделано. Там есть обработчики ... Oct 18 2006, 08:43 IgorKossak Наклёвывается необходимость применения RTOS.
По кр... Oct 18 2006, 08:52 GinRider Цитата(IgorKossak @ Oct 18 2006, 11:52) Н... Oct 18 2006, 09:28  µµC Цитата(GinRider @ Oct 18 2006, 13:28) Есл... Oct 18 2006, 09:47  SasaVitebsk Цитата(GinRider @ Oct 18 2006, 12:28) Цит... Oct 18 2006, 09:50   GinRider Цитата(SasaVitebsk @ Oct 18 2006, 12:50) ... Oct 18 2006, 11:29    µµC Цитата(GinRider @ Oct 18 2006, 15:29) Про... Oct 18 2006, 12:12     defunct Цитата(µµC @ Oct 18 2006, 15:12) Получает... Oct 18 2006, 13:48 _Алекс Есть функции, есть планировщик задач. Функции заци... Oct 18 2006, 11:18 Сергей Борщ Цитата(_Алекс @ Oct 18 2006, 14:18) Есть ... Oct 18 2006, 11:56 defunct Цитата(_Алекс @ Oct 18 2006, 10:29) Есть ... Oct 18 2006, 11:32 Михаил Горюнов Скромная попытка объяснить необъятное двумя словам... Oct 18 2006, 13:09 _Алекс Почитал по операционнкам, попроще получается коопе... Oct 19 2006, 08:06 Hz! Цитата(_Алекс @ Oct 19 2006, 11:06) Почит... Oct 19 2006, 09:20 Hz! ЦитатаЯсно, а кто задачи с приоритетами 2 и 3 дела... Oct 19 2006, 10:05 Alex B._ Автор jacOS высылает исходники по запросу, напишит... Oct 19 2006, 17:50 _Алекс Посмотрел ОС scmRTOS, jacOS, Salvo. многозадачност... Oct 20 2006, 05:52 osnwt Цитата(_Алекс @ Oct 20 2006, 08:52) Посмо... Oct 20 2006, 06:09 µµC Цитата(_Алекс @ Oct 20 2006, 09:52) Посмо... Oct 20 2006, 09:47  _Алекс Исходники можно взять для jacos, и повторю, нужны ... Oct 20 2006, 10:50   µµC Цитата(_Алекс @ Oct 20 2006, 14:50) А у в... Oct 20 2006, 11:19 Alex B._ >> Один минус: отсутствие исходников
Это не... Oct 20 2006, 12:39 osnwt Цитата(Alex B._ @ Oct 20 2006, 15:39) ... Oct 20 2006, 16:57 Alex B._ Согласен на полминуса.
Для того чтобы лучше понять... Oct 20 2006, 18:27 osnwt Поддержка - или платить постоянно за нее, или авто... Oct 20 2006, 18:33 haker_fox Цитата(_Алекс @ Oct 18 2006, 16:29) Есть ... Oct 21 2006, 03:26 yod У многих "универсальных" ОС основная про... Oct 24 2006, 10:18 Turion А ничего, что на сайте scmRTOS висит версия 2.04a-... Oct 25 2006, 11:59  Сергей Борщ Цитата(Turion @ Oct 25 2006, 14:59) А нич... Oct 25 2006, 12:13 µµC Цитата(yod @ Oct 24 2006, 14:18) Функция ... Oct 25 2006, 12:47  yod jacOS - это круто, потому что FSM (Finite State Ma... Oct 25 2006, 12:57   µµC Цитата(yod @ Oct 25 2006, 16:57) потому ч... Oct 25 2006, 13:14    yod Цитата(µµC @ Oct 25 2006, 20:14) В каком ... Oct 26 2006, 03:33     dxp Цитата(yod @ Oct 26 2006, 10:33) Цитата(µ... Oct 26 2006, 04:17      Dog Pawlowa Цитата(dxp @ Oct 26 2006, 07:17) А само ... Oct 26 2006, 06:06       osnwt Цитата(Dog Pawlowa @ Oct 26 2006, 09:06) ... Oct 26 2006, 06:39     µµC Цитата(yod @ Oct 26 2006, 07:33) "За... Oct 26 2006, 17:30           =GM= [quote name='bodja74' date='Nov 1 2006... Nov 1 2006, 18:01           =GM= Цитата(bodja74 @ Nov 1 2006, 16:41) ЗЫ ГЫ... Nov 2 2006, 15:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|