|
|
  |
вытясняющая многозадачность, чистый С без ОС |
|
|
|
Nov 30 2011, 02:23
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата И где тут вытесняющая многозадачность? Переключатель задач по таймеру прерывает процесс. Участие в этом действии со стороны процесса - не требуется. Это определение вытесняющей многозадачности. Хотя процесс и имеет возможность прервать сам себя... И это не противоречит вытесняющей многозадачности. Но вытеснив процесс, мой планировщик ничего особенного не плапнирует, а просто запускает следующий по порядку процесс. Порядок определяется исключительно расположением в списке процессов. --- Что такое setjump узнал только сейчас. (Я Си специально не изучал никогда). Может и можно. Но по-моему быстрее скопипастить два десятка ассемблерных строк переключателя, чем разбираться в том, что именно на самом деле делают упоминаемые функции Си. -- В том плане, что к примеру для АРМ там надо ж сохранять контекст в режиме работы процесса...Т.е. setjump должен из режима прерывания сохранить контекст другого режима (режима задачи). Что-то сомневаюсь, что он это делает. Ибо такая функция будучи универсальной должна как-то разбираться в конкретных режима процессора... Что все сильно усложняет... А меня, лично, сложное всегда сильно пугает.
Сообщение отредактировал DpInRock - Nov 30 2011, 02:54
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Nov 30 2011, 04:42
|

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

|
Цитата(Zelepuk @ Nov 29 2011, 17:55)  спасибо, можно немного подробнее? Каждый обработчик прерывания - независимый процесс, который обрабатывается по некоему событию в соответствии с установленным приоритетом, изменяемым или жестко заданным, в зависимости от аппаратной реализации. Переключение контекста выполняется автоматически средствами языка си. Преимущества - минимализм, отсутствие поллингов и ненужных циклов благотворно сказывается на потреблении и ЭМС. Общий стек на все задачи. Недостатки - жесткая привязка к аппаратной платформе, необходимость тщательного планирования и аккуратной реализации, неочевидность.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Nov 30 2011, 07:53
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Zelepuk @ Nov 29 2011, 21:40)  А вообще, когда становится понятно, что нужно городить огород из планировщиков, семафоров, мьютекcов...(вот сколько красивых слов по теме нашёл)?... буду краток: ось, планировщики (и т.д.) нафик не нужно в МК. Это Вы ребята подсознательно хотите как у "больших" типа. зачем тягаться в той весовой категории где МК вообще все плюсы сольёт. Чем будет отличаться то? тем что на борту у него есть аппаратная реализация то, что у "больших" на матери? всё? по мне: единственный плюс разработки с юзаньем оси - командная разработка (типа просче дробить, тестировать, изолировать и т.п.), и скорость в счёт качества(подсобрать всякую тучу кривых библиотек и сапотить энным кол-вом работников). всё. конечно же это чисто мой взгляд на вещи. холивар не хочу разводить. приводить свой опыт не буду - это уже из разряда измерений линейкой всяких органов... удачи вам (круглый)
|
|
|
|
|
Nov 30 2011, 08:25
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(MrYuran @ Nov 30 2011, 07:42)  Каждый обработчик прерывания - независимый процесс, который обрабатывается по некоему событию в соответствии с установленным приоритетом, изменяемым или жестко заданным, в зависимости от аппаратной реализации. похоже это то что я ищу, но пока не понимаю как конкретно в контексте "С" выглядят конструкции: - установка и обработка приоритета для события, - сам процесс переключения событий и "прерывание" низкоприоритетных событий высокоприоритетными, при сохранении состояния первых а вообще вы нечто вроде этого имели ввиду?:
Сообщение отредактировал Zelepuk - Nov 30 2011, 08:48
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 30 2011, 09:01
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(MrYuran @ Nov 30 2011, 11:52)  1. зависит от контроллера прерываний. Например, в MSP430 приоритеты заданы железно и поменять их не удастся. 2. не ваша забота. Компилятор сам все сохранит. Главное, чтобы были разрешены вложенные прерывания (то есть возможность прерывания текущего прерывания более приоритетным) спасибо. говоря о приоритетах прерываний в MSP430 вы скорее всего имели ввиду аппаратные прерывания, но как быть, если мне нужно отреагировать на программное событие (накопился блок данных АЦП например). С "суперлупой" это организуется циклическим опросом флагов.
|
|
|
|
|
Nov 30 2011, 09:59
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Суперлуп организовывать труднее. Так чтоб он работал как надо. Это громадье автоматов на автомате. Чуть где зависло - привет вишневому саду. А вот с осью-переключателем - в принципе можно не думать об этом. Пиши напрямую. Думать конечно все равно надо. Например, писать на SD хотят все процессы, а контроллер-то один, да и карта одна. Типа, пишешь процесс (к примеру), который собирает задания из очереди и пишет данные в разные файлы. Типа, тетенька в окошке...
Или все отладку хотят выдать через уарт.... Ну и так далее.
Вот мне дяденька добрй дал задание. Сделай, говорит, маленькую радиостанцию, каналы, то, се. (Вроде как задачка для авр...). А заодно, говорит, присобачь для комплекта ФМ-радио, МР3 плеер, фоторамку. И чтоб цветно было и 3D. И вот громоздить суперпупер лупы - даже предположить опасаюсь...
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Nov 30 2011, 10:02
|

Участник

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358

|
Цитата(Zelepuk @ Nov 30 2011, 12:25)  похоже это то что я ищу, но пока не понимаю как конкретно в контексте "С" выглядят конструкции: - установка и обработка приоритета для события, - сам процесс переключения событий и "прерывание" низкоприоритетных событий высокоприоритетными, при сохранении состояния первых
а вообще вы нечто вроде этого имели ввиду?: а я в очередь ставлю через шаг. 1 3 5 7. и у меня 3 приоритета. 0- это реального времени, при возникновении прерывания задача полностью отрабатывается. (ком по пдп набил буфер, и по прерыванию его сразу обработала задача) 1- это быстрое, задача ставится в очередь, в ближайший свободный шаг. если выполняется задача 5, то ставится в очередь на 6 место. (ком по пдп набил буфер, и по прерыванию, поставил задачу на обработку буфера в очередь) 3 - обычные задачи. задача ставится в хвост очереди. на 9 место
Сообщение отредактировал Warlockwolf - Nov 30 2011, 10:07
|
|
|
|
|
Nov 30 2011, 13:12
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(Warlockwolf @ Nov 30 2011, 14:02)  а я в очередь ставлю через шаг. 1 3 5 7. и у меня 3 приоритета.
0- это реального времени, при возникновении прерывания задача полностью отрабатывается. (ком по пдп набил буфер, и по прерыванию его сразу обработала задача) 1- это быстрое, задача ставится в очередь, в ближайший свободный шаг. если выполняется задача 5, то ставится в очередь на 6 место. (ком по пдп набил буфер, и по прерыванию, поставил задачу на обработку буфера в очередь) 3 - обычные задачи. задача ставится в хвост очереди. на 9 место очень интересно, а можно увидеть кусок кода где задаётся приоритет в очереди и как он идентифицируется? если я правильно понял, то задачи помещаютс я в кольцевой буфер и положение в кольцевом буфере (в очереди ) определяется приоритетом.
Сообщение отредактировал Zelepuk - Nov 30 2011, 13:32
|
|
|
|
|
Nov 30 2011, 15:36
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Да вы сначала реализуйте просто по очереди. Тут все просто как в зоопарке.
Есть одна ячейка памяти А. По прерыванию от таймера обработчик использует значение содержащееся в этой ячейке, как адрес, куда он будет сохранять текущий контекст. (По завершению обработки прерывания из этой же ячейки будет браться адрес для восстановления контекста). После чего этот обработчик вызывает сишную. процедуру. Назовите ее планировщиком, если хотите. Этот планировщик делает что хочет, но одно сделать обязан - подсунуть в эту ячейку А адрес контекста задачи, которую хочет возобновить. Если ничего не поменяет - просто продолжит работу текущая задача.
Подсунуть адрес из списка - по очереди, по какому-то принципу, по черту лысому - дело вкуса. Так же этот планировщик может заниматься по мелочи обработкой событий от клавиатуры, последовательного порта и прочей мелочи. (Типа, если зависнет планировщик - это однозначно все убивает, а если зависнет задача, то ввод-вывод останется живым).
Вот и вся ОС. Наращивать и усложнять алгоритм подсовывания нужного адреса - это развлечение на всю жизнь. Мой опыт говорит, что мегагерцы растут быстрее, чем разум разработчика, посему можно сильно не париться, а взять проц по-быстрее... Конечно, и быстрый можно затормозить...
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Nov 30 2011, 17:47
|

Участник

Группа: Участник
Сообщений: 50
Регистрация: 17-06-08
Пользователь №: 38 358

|
хидер Код typedef void (*pFunction)(void); #define DefaultAddress 0x00000000UL соурсе Код vu8 DNA_head=0; vu8 DNA_teil=0; pFunction DNAQeue[0x100];
void Ribosoma() { pFunction Application; pFunction* DNAQeue_teil=&DNAQeue[0x0]; while(1){ if((*DNAQeue_teil)!=DefaultAddress){Application=*DNAQeue_teil; *DNAQeue_teil=DefaultAddress; DNAQeue_teil=&DNAQeue[++DNA_teil]; Application();}; }; }
void DNA_Next() //spec pustishka { return; }
void InDNA(pFunction Thread) { DNAQeue[DNA_head++]= Thread; DNAQeue[DNA_head++]=(pFunction)DNA_Next; }
void InDNA_rapid(pFunction Thread) { u16 vtem; u16 DNA_i; for(DNA_i=0;DNA_i!=16;DNA_i++){vtem=(DNA_teil+DNA_i); if(DNAQeue[vtem]==(pFunction)DNA_Next){ DNAQeue[vtem]=Thread;goto meett;}; if(DNAQeue[vtem]==DefaultAddress){ InDNA(Thread);goto meett;} }; meett: {}; }; Коментарии я почти не пишу. так что разбирайтесь как есть. InDNA()- в очередь в конец. InDNA_rapid()-в очередь в пустое место, если 16 ближайших заняты, тогда в конец. Код int main(void) { InDNA(&initARM); //-- первая задача Ribosoma(); }
Сообщение отредактировал Warlockwolf - Nov 30 2011, 17:48
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|