Easyelectronics.ru

Электроника для всех
Текущее время: 20 ноя 2017, 17:00

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 22 ] 
Автор Сообщение
 Заголовок сообщения: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 02:17 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
доброго времени суток!
сейчас я на отладчной плате гоняю мегу32 с RTOS взятой из статьи (точнее из примера)
http://easyelectronics.ru/avr-uchebnyj- ... rimer.html
на RTOSе сделал логику меню как в статье http://geektimes.ru/post/255020/
получил то что неплохо работает на данной стадии (в конце поста видео)
viewtopic.php?f=56&t=23957&p=426420#p426420

сейчас думаю и работаю над тем как реализовать приложения. то есть:
корневой каталог -> папка время и будильники -> приложение "редактировать время".
приложение запускается, переназначаются кнопки под программу, на экран выводится информация из приложения. поправье если напутал.
но это следующий шаг.
сейчас вопрос стоит такой:
допустим по событию (кнопка/пункт меню/символ уарта) запускается через диспетчер таймеров задачи мигать светодиодом
Код:
void Task1 (void)
{
    SetTimerTask(Task2,1000);
    LED_PORT  ^=1<<LED1;
   
}

void Task2 (void)
{
    SetTimerTask(Task1,1000);
    LED_PORT  &= ~(1<<LED1);
}

вопрос: как остановить выполнение этой задачи? это получается что надо сделть задачу противоположную SetTimerTask удаляющую задачи из очереди таймера. или не?


Последний раз редактировалось Arcanum 24 мар 2016, 13:02, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 10:12 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 мар 2014, 21:43
Сообщения: 61
лучше периписать всё на
http://we.easyelectronics.ru/AVR/avrasm ... ya-os.html

там API с блекджеком, таймерами и удалениями


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 11:37 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
Самое тупое решение - volatile переменная-флаг и в начало Task1/Task2 воткнуть "if (флаг) return;".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 11:41 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 мар 2014, 21:43
Сообщения: 61
зачем вы советуете новичку методы которые обычно используют профессионалы когда им лень?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 14:05 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
aamonster писал(а):
Самое тупое решение - volatile переменная-флаг и в начало Task1/Task2 воткнуть "if (флаг) return;".

Думал над этим. Да, светодиод гореть не будет но задачи никуда не денуться.

Отправлено с моего Boost IIse через Tapatalk


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 14:05 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
tehday писал(а):
лучше периписать всё на
http://we.easyelectronics.ru/AVR/avrasm ... ya-os.html

там API с блекджеком, таймерами и удалениями

Просплюсь и поковыряю. Спасибо

Отправлено с моего Boost IIse через Tapatalk


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 14:51 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2254
Откуда: Санкт-Петербург
Arcanum, у вас же задачи одноразовые, как я понимаю. Так что провисит оно ровно до запуска Task1 или Task2 - она сразу выйдет, не запланировав Task2/Task1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 18:16 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
aamonster писал(а):
Arcanum, у вас же задачи одноразовые, как я понимаю. Так что провисит оно ровно до запуска Task1 или Task2 - она сразу выйдет, не запланировав Task2/Task1.

а ведь действительно одноразовые. однако не охота целую переменную ради мыргания светиком добавлять.
надобы что-то поизящнее этого решения "в лоб"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 20 янв 2016, 18:20 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
tehday писал(а):
лучше периписать всё на
http://we.easyelectronics.ru/AVR/avrasm ... ya-os.html

там API с блекджеком, таймерами и удалениями

открыл, ассемблер, сохранил для другого проекта, закрыл. есть ли на Си?
=или просто уйти от ДиХальтовской РТОС на более продвинутый продукт.
Есть ли подобные RTOS ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 21 янв 2016, 03:06 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 мар 2014, 21:43
Сообщения: 61
для мелких 8 бит avr ничего лучше нет и быть неможет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Останов выполнения задачи в RTOS
СообщениеДобавлено: 15 фев 2016, 02:43 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
SGE писал(а):
Arcanum писал(а):
а ведь действительно одноразовые.
Если задача одноразовая, то зачем вообще её планировать отдельно в очередь ? Одна переменная в качестве флага для разового запуска и есть "в лоб".

задача одноразовая, но продолжительностью в N единиц времени.
а вообще
подумал и написал вот это:
Код:
/*
// функция удаления задачи из службы таймеров.
*/
void DelTimerTask(TPTR TS)
{
   u08      index=0;
   u08      nointerrupted = 0;

   if (STATUS_REG & (1<<Interrupt_Flag))          // Проверка запрета прерывания, аналогично функции выше
   {
      Disable_Interrupt
      nointerrupted = 1;
   }

   for(index=0; index!=MainTimerQueueSize+1; ++index)   //Прочесываем очередь таймеров
   {
      if(MainTimer[index].GoToTask == TS)            // Если уже есть запись с таким адресом
      {
         MainTimer[index].GoToTask = Idle;         // Заполняем поле перехода задачи пустышкой.
         MainTimer[index].Time = 0;
         if (nointerrupted)    Enable_Interrupt      // Разрешаем прерывания если не были запрещены.
         return;                              // Выходим. Раньше был код успешной операции. Пока убрал
      }
   }
   
   
}


вставлять в EERTOS.c использовать по вкусу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 30 мар 2016, 20:02 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3360
Откуда: Новосибирск
Arcanum писал(а):
...

Программные таймеры. Автоматное программирование. Два варианта. Принудительная установка состояния, через механизм сообщений.

Show Основной цикл выглядит примерно так:


Show Программные таймеры. soft_timers.h


Show Программные таймеры. soft_timers.c


Пример 8 независимых мигалок светодиодами.
Show Основной цикл:


Show proc_leds.h


Show proc_leds.c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 04 апр 2016, 12:21 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
demiurg1978 писал(а):
...

мда...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 04 апр 2016, 13:14 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3360
Откуда: Новосибирск
Arcanum писал(а):
demiurg1978 писал(а):
...

мда...

?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 06 апр 2016, 02:57 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
demiurg1978 писал(а):
Arcanum писал(а):
demiurg1978 писал(а):
...

мда...

?

мсье знает толк...

я посмотрел код. попытался понять. развидел ЭТО и нежно люблю диспетчер Ди.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 06 апр 2016, 12:03 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3360
Откуда: Новосибирск
Arcanum писал(а):
и нежно люблю диспетчер Ди.

Код быстро набросан для примера. 8 светодиодов, каждый мигает со своей частотой. В реальных проектах у меня вместо светодиодов модули.

Я уже писал про диспетчер Ди. У него заложена мина. Пусть задача мигнуть светодиодом. Поставили задачу мигнуть в очередь. И тут возникло событие, которое меняет режим. Задача мигнуть уже неактуальна. И спустя положенное время светодиодик исправно мигнет. Это самый безобидный случай. Как это решать? Придумывать киллеры задач? А откуда мы знаем, какие задачи прибивать в данный момент времени? Хорошо, пусть каждая задача - конечный автомат, где мигнуть светодиодом - состояние. Тогда теряется весь смысл использования диспетчера, задача которого тупо проворачивать задачи. То есть, тупо тратим такты на проворачивание.

В конечном автомате незапланированная задача мигнуть светодиодиком в принципе невозможна. Это если только будет ошибка программиста.
Show Пример основного цикла моего проекта.


Нет никаких диспетчеров. Состав оборудования: символьный дисплей, матричная клавиатура 4х4, 13 дискретных входов. 12 дискретных выходов. На плате всего предусмотрено: 24 дискретных входа, 16 выходов.

Против постановки задач в диспетчере у меня: принудительная установка состояний, как в примере светодиодов, события, условия.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 06 апр 2016, 13:00 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3360
Откуда: Новосибирск
SGE писал(а):
...

Какая основная проблема в программировании? Вовремя отслеживать условия, события. Если задачей считать "мигнуть светодиодом", то это всегда - заложенная мина. Если делать "мигнуть светодиодом" состоянием, то теряется смысл использования диспетчера от Ди и подобных. Давайте посмотрим критически, зачем использовать диспетчер? Единственная роль подобных диспетчеров - таймеры. Все.
Легкость использования этих диспетчеров - кажущаяся. Которая впоследствии чревата тем, что больше сидишь соображаешь, куда бы воткнуть Set_Task, чтобы все заработало как надо.
При автоматном программировании такого нет в принципе. Есть состояния. В одном состоянии одни условия, события и реакции, в другом состоянии уже другие условия, события. И входы, условия, события всегда читаются-проверяются перед выполнением чего-либо. К примеру, "Аварийный стоп". В этом выгода автоматного программирования. Огромная гибкость.
Кто-то скажет, а я на прерывание повешу и нет проблем. Есть! После прерывания программа возвращается к выполнению программы. И что это за место будет, что там будет выполняться, никто не знает.

Show Наглядный пример:


Как видите, при таком подходе нет изначально заложенных мин, как в диспетчере.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 06 апр 2016, 16:09 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 354
Проблемы упрощённых ос, где каждая задача просчитывается перепроцессором, и может занять единственное для неё место в стеке.
Дык юзайте взрослые ос, там нет проблем с созданием и удалением задач.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 06 апр 2016, 17:33 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3360
Откуда: Новосибирск
SGE писал(а):
[Не очень удачный пример, так как "Аварийный стоп" вообще не должен зависеть от МК (или других подобных сложных систем), в МК он должен поступать уже как факт остановки.
Исключения подобного возможны там, где нельзя обойтись без МК, но тогда нужно ставить дублирующий модуль с МК.

Я бы согласился с вами, если бы аварийный стоп был только программным. Аварийный стоп - обязательно должен быть аппаратным. Слаботочка, программно - по вкусу. Дополнительная группа контактов. Что в моем случае и есть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 07 апр 2016, 03:05 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
SGE писал(а):
Если есть шанс того, что событие может изменить свою актуальность в любое время, то именно внутри самой задачи этого события нужно проверять эту ситуацию. Тогда абсолютно не важно, стоит ли в очереди эта задача на момент потери актуальности.
Это есть правильный путь дзен программирования. ;)

и дополнив киллером задач получим желаемое.

а вообще - разговор ниочём.
каждой задаче - своё оптимальное решения. индивидуально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 07 апр 2016, 23:27 
Старожил

Зарегистрирован: 05 май 2010, 19:39
Сообщения: 687
Откуда: Вольгинский, 33
SGE писал(а):
согласен, если актуальность одноразовая, то да, задача больше не нужна в принципе.


ну меня так сделано моргание аварийным светодиодом:две функции с включение ивыключением светодиода вызывают друг друга раз в секунду. проблема решена а светодиод моргает. вот так я родил киллер тас. при вызове процедуры что убивает ошибку убивает и обе задачи в диспетчере таймера и светодиод гасит (если киллер таск отработал при горящем свеодиоде то никакая задача не погасит его)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: [решено]Останов выполнения задачи в RTOS
СообщениеДобавлено: 08 апр 2016, 08:43 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3360
Откуда: Новосибирск
Arcanum писал(а):
...

В этом и есть ваша главная ошибка. Мигнуть светодиодом - это ни в коем случае не самостоятельная задача. Тем более у вас две задачи. Включить светодиод, выключить светодиод. Все это должно быть частью модуля, который мигает светодиодом. А вы целый огород нагородили, и все это, чтобы мигнуть светодиодом.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB