реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Управление контекстом БЕЗ RTOS
yanvasiij
сообщение Nov 21 2014, 08:04
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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);
    }
}


Может я чего неправильно сказал, но надеюсь смысл понятен. Вопрос: как сделать такое сохранение и загрузку контекста? Где про это можно почитать, посмотреть пример и т.п.
Спасибо!
Go to the top of the page
 
+Quote Post
1113
сообщение Nov 21 2014, 08:09
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658



ваш main() это и есть диспетчер задач. таким образом ваше предположение "А если я озадачусь сделать тоже моргание без rtos" уже не верно. то что вы придумали - и есть RTOS.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Nov 21 2014, 08:12
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(1113 @ Nov 21 2014, 13:09) *
ваш main() это и есть диспетчер задач. таким образом ваше предположение "А если я озадачусь сделать тоже моргание без rtos" уже не верно. то что вы придумали - и есть RTOS.


Ну пусть так, я же говорю - изобретение велосипеда. Мне интересно как это сделать - сохранить контекст функции, а потом восстановить, когда потребуется. В некоторых языка программирования это называется Coroutines кажется. Функция запоминающее свое предыдущее состояние.
Go to the top of the page
 
+Quote Post
1113
сообщение Nov 21 2014, 08:23
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658



в СИ такого нет. вам надо реализовать надстройку над СИ, которая периодически будет сохранять контексты процессов и менять их между собой. имхо простой способ понять эту кухню - изучить CooсoxOS. в ней всё сделано как в книжке.

если ваш процессор ARM, то есть несложные статьи на тему сохранения и замещения контекста процесса.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Nov 21 2014, 08:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Ну я вот думал, что мне предложат ассемблерный сохраняльщик контекста. CooCoxOS - это ртосина я так понимаю, в ее доках описан принцип работы ее планировщика? Да - процессор АRM
Go to the top of the page
 
+Quote Post
1113
сообщение Nov 21 2014, 08:25
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658



всё описано, даже на русском. а "сохраняльщик" там - на ассемблере.
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 21 2014, 08:25
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(yanvasiij @ Nov 21 2014, 11:04) *
витиеватый алгоритм запоминания предыдущего состояния

Всё придумано до нас: protothreads.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 21 2014, 08:36
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(1113 @ Nov 21 2014, 12:23) *
в СИ такого нет

https://ru.wikipedia.org/wiki/Setjmp.h


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Nov 21 2014, 08:41
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(scifi @ Nov 21 2014, 13:25) *
Всё придумано до нас: protothreads.


Извиняюсь за выражение, но просто Офигеть! blink.gif blink.gif blink.gif Это конечно не сохранение/загрузка контекста в том виде, в котором я думал, но тоже решение.

Цитата(demiurg_spb @ Nov 21 2014, 13:36) *

Этой штукой вообще безопасно пользоваться?
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 21 2014, 08:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(yanvasiij @ Nov 21 2014, 11:39) *
Извиняюсь за выражение, но просто Офигеть! blink.gif blink.gif blink.gif Это конечно не сохранение/загрузка контекста в том виде, в котором я думал, но тоже решение.

Хорошее решение. Широко применяется, позволяет получать отличные результаты. Названия макросов оставляют желать лучшего: заглавные буквы пестрят, длинные имена растягивают код вправо. А в остальном всё хорошо.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Nov 21 2014, 08:51
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(scifi @ Nov 21 2014, 13:42) *
Хорошее решение. Широко применяется, позволяет получать отличные результаты. Названия макросов оставляют желать лучшего: заглавные буквы пестрят, длинные имена растягивают код вправо. А в остальном всё хорошо.

РТОСина на 8 килобайт. Ох, сколько же килограмм кода можно было сэкономить с этой штукой, где Вы были раньше ))
Go to the top of the page
 
+Quote Post
1113
сообщение Nov 21 2014, 08:53
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 604
Регистрация: 24-02-06
Из: Москва
Пользователь №: 14 658



Цитата(yanvasiij @ Nov 21 2014, 11:41) *
Извиняюсь за выражение, но просто Офигеть! blink.gif blink.gif blink.gif Это конечно не сохранение/загрузка контекста в том виде, в котором я думал, но тоже решение.
для такого типа "многозадачности" код в своих процессах должен быть прерываемым, типа state-машины.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Nov 21 2014, 08:59
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(1113 @ Nov 21 2014, 13:53) *
для такого типа "многозадачности" код в своих процессах должен быть прерываемым, типа state-машины.


Ну да, я это понимаю. Просто я получилось так, что я спрашивал, как работать со контекстом функции, чтобы строить state-машины. А посоветовали готовое средство для них. sm.gif Правда я по-прежнему озадачен вопросом работы с контекстом для целей самообразования.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 21 2014, 09:08
Сообщение #14


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(yanvasiij @ Nov 21 2014, 11:51) *
РТОСина на 8 килобайт. Ох, сколько же килограмм кода можно было сэкономить с этой штукой, где Вы были раньше ))

RTOS-ина на 5KB. http://www.keil.com/pack/doc/cmsis_rtx/_technical_data.html
Ох!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 21 2014, 09:14
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



прерывание в этом не поможет? Собственно как в РТОсах и сделано
возникает прерывание вы влетаете в него
у вас есть адрес возврата (причем в стеке), и указатель стека.

теперь вы меняете указатель стека на другое место а адрес возврата тоже меняется на новую функцию.
Старое все сохраняете

со следующим влетом в прерывание сохраняете полученное, и восстанавливаете прошлое, так и получиться что будете по чуть чуть делать от каждой функции, и контекст (стек и адрес работы) перебрасывать... или я чего то не понял?
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016