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

 
 
> Управление контекстом БЕЗ 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
 
Start new topic
Ответов
Golikov A.
сообщение Nov 28 2014, 15:04
Сообщение #2


Гуру
******

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



чего то я видать безнадежно устарел
Код
for (const Point & point : pointsArray)

вот это что за на?
Go to the top of the page
 
+Quote Post
Slash
сообщение Nov 28 2014, 16:07
Сообщение #3


Местный
***

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



Сколько не читал битв "C vs C++", почему то противники С++ "заставляют" его использовать в самых "тяжелых" проявлениях - RTTI, виртуальные функции (хотя они не тяжелые).
С++ можно использовать только за более жесткий контроль типов. И все.
Потом понять, что ссылки - это удобно и код становится чище.
Потом начать применять приведение типов static_cast(безопасное) и reinterpret_cast(опасное, на усмотрение программиста) вместо С-ного приведения типа (uint32_t *)var. Представьте, как легко найти в коде места, где вы приводите типы рискованно и которые надо проверить в случае ошибки.
Потом понять, что конструктор - это удобно. И их можно использовать в структурах.
Пространства имен.
Все эти возможности несут нулевой оверхед и делают код удобнее и понятнее.

Цитата(Golikov A. @ Nov 28 2014, 18:04) *
чего то я видать безнадежно устарел
Код
for (const Point & point : pointsArray)

вот это что за на?

Это нововведение стандарта С++ за 2011 год - "range-based for".
Отлично описано в этой статье

Цитата(jcxz @ Nov 28 2014, 18:34) *
Вся эта си-плюс-плюсная объектно-инкапсулированная хрень хороша только для тех, кто не заглядывает в файлы листинга компилятора.
А если Вы задумываетесь об оптимальности не исходников (как здесь), а результирующего кода (скорости выполнения и размера), то выбирайте наиболее стандартные конструкции, типа for (int i = 0; i < n; ++i). Оптимизаторы компиляторов на них наиболее "натасканы" и код будет оптимальным.

А не нужно туда заглядывать.
Задач, где нужна оптимальность кода, не так много. Чаще пишется обычный, не критичный ко времени исполнения код, развесистая логика. Тут важнее читабельность исходников. И не только для автора.
Разговоры "я пишу один и мне все понятно" в пользу бедных.

Цитата(jcxz @ Nov 28 2014, 18:34) *
Я, после опыта оптимизации по скорости DSP-кода, взял это себе за правило - если хочется чтобы код был наиболее оптимален после компилятора, конструкции в исходнном коде должны быть наиболее простыми.
На входе у меня был вот такой вот весь правильный С++ код, со всеми конструкторами/деструкторами и т.п. и при этом он безбожно тормозил и алгоритм не успевал обработать поток данных. После убиения всей этой плюсовой красоты и полного переписывания на простой си-код, скорость выполнения того-же самого алгоритма увеличилась в несколько сотен раз!
Потому что оптимизатор простой код сумел многократно распараллелить.

Очень хотелось бы поверить. Но слишком много неизвестных - какой был компилятор (сейчас компиляторы совершенствуются), каков Ваш уровень мастерства как С++ программиста, каков уровень как С программиста, в каком конкретно месте была потеря скорости?

Вот пример, который привел Александр, хороший с точки зрения проверки С vs C++, т.к. хорошо переводится на С++.

Сообщение отредактировал Slash - Nov 28 2014, 16:31
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 28 2014, 16:26
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Slash @ Nov 28 2014, 22:07) *
Очень хотелось бы поверить. Но слишком много неизвестных - какой был компилятор (сейчас компиляторы совершенствуются), каков Ваш уровень мастерства как С++ программиста, каков уровень как С программиста, в каком конкретно месте была потеря скорости?

Компилятор - CCS, cgtools - довольно свежие. И дело не в компиляторе.
Плюсовой код порождал множественные вызовы функций, что страшное зло для DSP-циклов, плюс - как я понимаю из-за сложности для оптимизатора, он не мог правильно рассчитать кол-во проходов циклов, распараллелить обработку так как не мог просчитать зависимости переменных друг от друга и т.п.
Потеря была во всех критичных местах - фильтрах, обработках массивов сэмплов и т.д.. Остальные места меня не интересовали.

Цитата(Slash @ Nov 28 2014, 22:07) *
Задач, где нужна оптимальность кода, не так много. Чаще пишется обычный, не критичный ко времени исполнения код, развесистая логика. Тут важнее читабельность исходников. И не только для автора.

Мы вообще-то находимся в области embedded, где и размер кода и скорость его выполнения всегда будут важны, так как при улучшении этих показателей, позволяют впихнуть приложение в менее мощный, а значит - более дешёвый МК.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- yanvasiij   Управление контекстом БЕЗ RTOS   Nov 21 2014, 08:04
- - 1113   ваш main() это и есть диспетчер задач. таким образ...   Nov 21 2014, 08:09
- - yanvasiij   Цитата(1113 @ Nov 21 2014, 13:09) ваш mai...   Nov 21 2014, 08:12
- - 1113   в СИ такого нет. вам надо реализовать надстройку н...   Nov 21 2014, 08:23
|- - demiurg_spb   Цитата(1113 @ Nov 21 2014, 12:23) в СИ та...   Nov 21 2014, 08:36
- - yanvasiij   Ну я вот думал, что мне предложат ассемблерный сох...   Nov 21 2014, 08:24
- - 1113   всё описано, даже на русском. а "сохраняльщик...   Nov 21 2014, 08:25
- - scifi   Цитата(yanvasiij @ Nov 21 2014, 11:04) ви...   Nov 21 2014, 08:25
|- - SSerge   Цитата(scifi @ Nov 21 2014, 15:25) Всё пр...   Nov 21 2014, 12:21
- - yanvasiij   Цитата(scifi @ Nov 21 2014, 13:25) Всё пр...   Nov 21 2014, 08:41
|- - scifi   Цитата(yanvasiij @ Nov 21 2014, 11:39) Из...   Nov 21 2014, 08:42
|- - 1113   Цитата(yanvasiij @ Nov 21 2014, 11:41) Из...   Nov 21 2014, 08:53
|- - demiurg_spb   Цитата(yanvasiij @ Nov 21 2014, 12:41) Эт...   Nov 21 2014, 09:36
- - yanvasiij   Цитата(scifi @ Nov 21 2014, 13:42) Хороше...   Nov 21 2014, 08:51
|- - ViKo   Цитата(yanvasiij @ Nov 21 2014, 11:51) РТ...   Nov 21 2014, 09:08
|- - 1113   Цитата(ViKo @ Nov 21 2014, 12:08) RTOS-ин...   Nov 21 2014, 09:34
- - yanvasiij   Цитата(1113 @ Nov 21 2014, 13:53) для так...   Nov 21 2014, 08:59
- - Golikov A.   прерывание в этом не поможет? Собственно как в РТ...   Nov 21 2014, 09:14
- - AlexandrY   Цитата(yanvasiij @ Nov 21 2014, 10:04) Мо...   Nov 21 2014, 10:08
- - MrYuran   А если немного подумать, может и не нужна никакая ...   Nov 21 2014, 12:46
|- - AlexandrY   Цитата(MrYuran @ Nov 21 2014, 14:46) А ес...   Nov 21 2014, 13:06
||- - MrYuran   Цитата(AlexandrY @ Nov 21 2014, 17:06) Не...   Nov 21 2014, 13:23
|- - scifi   Цитата(MrYuran @ Nov 21 2014, 15:46) А ес...   Nov 21 2014, 15:46
- - WitFed   Я лично после долгого знакомства с ОС2000 без отла...   Nov 27 2014, 14:04
|- - jcxz   Цитата(WitFed @ Nov 27 2014, 20:04) Также...   Nov 28 2014, 04:02
|- - AlexandrY   Цитата(WitFed @ Nov 27 2014, 16:04) Лучше...   Nov 28 2014, 07:04
|- - psL   Цитата(AlexandrY @ Nov 28 2014, 10:04) Эт...   Nov 28 2014, 08:12
||- - AlexandrY   Цитата(psL @ Nov 28 2014, 10:12) сложный ...   Nov 28 2014, 08:17
||- - psL   Цитата(AlexandrY @ Nov 28 2014, 11:17) За...   Nov 28 2014, 08:26
||- - AlexandrY   Цитата(psL @ Nov 28 2014, 10:26) Враги ук...   Nov 28 2014, 09:09
||- - psL   Цитата(AlexandrY @ Nov 28 2014, 12:09) Ни...   Nov 28 2014, 09:25
||- - AlexandrY   Цитата(psL @ Nov 28 2014, 11:25) откуда в...   Nov 28 2014, 09:57
||- - psL   Цитата(AlexandrY @ Nov 28 2014, 12:57) Т....   Nov 28 2014, 10:55
||- - AlexandrY   Цитата(psL @ Nov 28 2014, 12:55) ну ТС хо...   Nov 28 2014, 11:28
||- - psL   Цитата(AlexandrY @ Nov 28 2014, 14:28) А ...   Nov 28 2014, 11:48
||- - AlexandrY   Цитата(psL @ Nov 28 2014, 13:48) Указател...   Nov 28 2014, 11:58
||- - psL   Цитата(AlexandrY @ Nov 28 2014, 14:58) Во...   Nov 28 2014, 22:41
|- - Slash   Цитата(AlexandrY @ Nov 28 2014, 10:04) Эт...   Nov 28 2014, 14:38
- - Golikov A.   ага супер луп на конечных автоматах называется... ...   Nov 27 2014, 15:01
- - Golikov A.   ЦитатаНепонятно - почему не нужны критические секц...   Nov 28 2014, 07:49
|- - jcxz   Цитата(Golikov A. @ Nov 28 2014, 13:49) п...   Nov 28 2014, 11:06
- - Golikov A.   fsm->state можно и в прерывании сменить на ERRO...   Nov 28 2014, 09:11
|- - AlexandrY   Цитата(Golikov A. @ Nov 28 2014, 11:11) f...   Nov 28 2014, 09:18
- - Golikov A.   ЦитатаЭто верно только в одном частном случае - ко...   Nov 28 2014, 14:07
|- - jcxz   Цитата(Golikov A. @ Nov 28 2014, 20:07) К...   Nov 28 2014, 15:34
- - Golikov A.   вопрос в другом. Разве в С++ есть for без ;; ? for...   Nov 28 2014, 15:49
- - Golikov A.   ЦитатаСтоит отметить, что хоть range-based for и я...   Nov 28 2014, 16:15
- - yanvasiij   Чтобы внести конкретики. Зачем мне это надо и поче...   Dec 1 2014, 07:29
|- - scifi   Цитата(yanvasiij @ Dec 1 2014, 10:29) Зач...   Dec 1 2014, 07:55
- - yanvasiij   Цитата(scifi @ Dec 1 2014, 12:55) Кстати,...   Dec 1 2014, 08:12
- - scifi   Цитата(yanvasiij @ Dec 1 2014, 11:12) На ...   Dec 1 2014, 09:01


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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 15:09
Рейтинг@Mail.ru


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