|
Управление контекстом БЕЗ 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 28 2014, 16:07
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Nov 28 2014, 16:26
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Slash @ Nov 28 2014, 22:07)  Очень хотелось бы поверить. Но слишком много неизвестных - какой был компилятор (сейчас компиляторы совершенствуются), каков Ваш уровень мастерства как С++ программиста, каков уровень как С программиста, в каком конкретно месте была потеря скорости? Компилятор - CCS, cgtools - довольно свежие. И дело не в компиляторе. Плюсовой код порождал множественные вызовы функций, что страшное зло для DSP-циклов, плюс - как я понимаю из-за сложности для оптимизатора, он не мог правильно рассчитать кол-во проходов циклов, распараллелить обработку так как не мог просчитать зависимости переменных друг от друга и т.п. Потеря была во всех критичных местах - фильтрах, обработках массивов сэмплов и т.д.. Остальные места меня не интересовали. Цитата(Slash @ Nov 28 2014, 22:07)  Задач, где нужна оптимальность кода, не так много. Чаще пишется обычный, не критичный ко времени исполнения код, развесистая логика. Тут важнее читабельность исходников. И не только для автора. Мы вообще-то находимся в области embedded, где и размер кода и скорость его выполнения всегда будут важны, так как при улучшении этих показателей, позволяют впихнуть приложение в менее мощный, а значит - более дешёвый МК.
|
|
|
|
Сообщений в этой теме
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
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|