|
|
  |
Управление контекстом БЕЗ RTOS |
|
|
|
Nov 21 2014, 08:04
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Я понимаю, что сейчас речь пойдет об изобретении велосипеда. Но мне это важно для понимания. В ОСРВах переключение между задачами осуществляется за счет переключения контекста. Мне интересно каким образом можно организовать такое переключения самостоятельно. Например, есть две функции ledBlinking1() и ledBlinking2(): Код void ledBlinging1 (vodi) { led1On(); delayms(1000); led1Off(); delayms(1000); }
void ledBlinging2 (vodi) { led2On(); delayms(1000); led2Off(); delayms(1000); } При размещении этих функций внутри задач rtos они будут моргать не влияя друг на друга. А если я озадачусь сделать тоже моргание без rtos, так чтобы они моргали независимо, то мне придется накидать витиеватый алгоритм запоминания предыдущего состояния и следить, сколько времени прошло, не пора бы потушить или зажечь... Но если я реализую функцию загрузки и выгрузки контекста функции, то такой алгоритм городить не придется. Пусть такая функция есть и называется она downloadContext (), а функция приостановки и сохранения контекста yeld(). Тогда, то же моргание без РТОС будет выглядеть следующим образом: Код void ledBlinging1 (void) { led1On(); timer1.setMs(1000); while (timer1.expired() == FALSE) yeld(); led1Off(); timer1.setMs(1000); while (timer1.expired() == FALSE) yeld();
}
void ledBlinging2 (void) { led1On(); timer1.setMs(1000); while (timer2.expired() == FALSE) yeld(); led2Off(); timer2.setMs(1000); while (timer2.expired() == FALSE) yeld(); }
int main (void) { while (1) { downloadContext (ledBlinging1); downloadContext (ledBlinging2); } } Может я чего неправильно сказал, но надеюсь смысл понятен. Вопрос: как сделать такое сохранение и загрузку контекста? Где про это можно почитать, посмотреть пример и т.п. Спасибо!
|
|
|
|
|
Nov 21 2014, 08:12
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(1113 @ Nov 21 2014, 13:09)  ваш main() это и есть диспетчер задач. таким образом ваше предположение "А если я озадачусь сделать тоже моргание без rtos" уже не верно. то что вы придумали - и есть RTOS. Ну пусть так, я же говорю - изобретение велосипеда. Мне интересно как это сделать - сохранить контекст функции, а потом восстановить, когда потребуется. В некоторых языка программирования это называется Coroutines кажется. Функция запоминающее свое предыдущее состояние.
|
|
|
|
|
Nov 21 2014, 08:41
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(scifi @ Nov 21 2014, 13:25)  Всё придумано до нас: protothreads. Извиняюсь за выражение, но просто Офигеть!  Это конечно не сохранение/загрузка контекста в том виде, в котором я думал, но тоже решение. Цитата(demiurg_spb @ Nov 21 2014, 13:36)  Этой штукой вообще безопасно пользоваться?
|
|
|
|
|
Nov 21 2014, 08:51
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(scifi @ Nov 21 2014, 13:42)  Хорошее решение. Широко применяется, позволяет получать отличные результаты. Названия макросов оставляют желать лучшего: заглавные буквы пестрят, длинные имена растягивают код вправо. А в остальном всё хорошо. РТОСина на 8 килобайт. Ох, сколько же килограмм кода можно было сэкономить с этой штукой, где Вы были раньше ))
|
|
|
|
|
Nov 21 2014, 08:59
|
Местный
  
Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041

|
Цитата(1113 @ Nov 21 2014, 13:53)  для такого типа "многозадачности" код в своих процессах должен быть прерываемым, типа state-машины. Ну да, я это понимаю. Просто я получилось так, что я спрашивал, как работать со контекстом функции, чтобы строить state-машины. А посоветовали готовое средство для них.  Правда я по-прежнему озадачен вопросом работы с контекстом для целей самообразования.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|