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

 
 
> Синхронное взаимодействие программных модулей
demiurg1978
сообщение Feb 7 2017, 12:47
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Подбросьте идей, как реализовать синхронность программных модулей. Организация программ на данный момент у меня следующая. Модульность. Никаких долгих циклов. Модули, задачи, процессы дробятся условиями, флагами, состояниями конечных автоматов. Итерация основного цикла выполняется с запасом за один системный тик. В основном системный тик у меня - 1 мс. Использую программные таймеры. То есть, у меня псевдопараллельность процессов.
Иногда бывают ситуации, когда несколько модулей после определенного события должны выполнить определенные действия. Речь идет не о быстром поочередном выполнении, а, скажем, в течении одной итерации основного цикла.

Сообщение отредактировал demiurg1978 - Feb 7 2017, 12:49
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
demiurg1978
сообщение Feb 7 2017, 14:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Попробую поточнее выразиться. Событие генерируется по условию и времени. Скажем, подавление дребезга контактных датчиков и входов. Одни входы - это контактные датчики, другие - контактные группы пускателей. У пускателей свои времянки включения-выключения. И чтобы не произошло сбоя, нужно синхронизировать действия модулей. Повторяю, речь не быстро-быстро выполнить действия. А о синхронизации действий в заданных рамках. Возьмем за такую рамку и условие, к примеру, итерацию основного цикла. Обработали все времянки подавления дребезга, по условиям модуль генерирует событие (что-то). Другими модулями видится это что-то, и выполняются определенные действия. Скажем, за итерацию основного цикла. Прошла итерация, это что-то больше не выставлено. Главное условие, сохранить инкапсуляцию программных модулей.

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

Подсмотрено у ЛИ.
Код
//----------------------------- Переменные: ----------------------------------

volatile bool fTick;               //флаг обновления системного таймера
static bool tick;                  //флаг начала нового системного интервала

//------------------ Инициализация системного таймера ------------------------

void Main_Timer_Init(void)
{
// bla-bla
  fTick = 1;                       //принудительное обновление
}

//--------------------- Проверка системного таймера: -------------------------

__monitor bool Main_GetTick(void)
{
  if(!fTick) return(0);            //проверка нового системного интервала
  fTick = 0;                       //очистка флага
  return(1);                       //новый системный интервал
}

//------------------- Прерывание системного таймера: -------------------------

#pragma vector = TIMER1_COMPA_vect
__interrupt void Timer(void)
{
  fTick = 1;                       //новый системный интервал
}

//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
//-------------------------- Основная программа: -----------------------------
//----------------------------------------------------------------------------

void main(void)
{  Main_Timer_Init();               //инициализация системного таймера
  __enable_interrupt();            //разрешение прерываний

  while(1)                         //основной цикл
  {
    tick = Main_GetTick();         //опрос системного таймера
    Meter_Exe(tick);               //обслуживание измерителя
  }
}


Сообщение отредактировал demiurg1978 - Feb 7 2017, 14:49
Go to the top of the page
 
+Quote Post



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

 


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


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