Попробую поточнее выразиться. Событие генерируется по условию и времени. Скажем, подавление дребезга контактных датчиков и входов. Одни входы - это контактные датчики, другие - контактные группы пускателей. У пускателей свои времянки включения-выключения. И чтобы не произошло сбоя, нужно синхронизировать действия модулей. Повторяю, речь не быстро-быстро выполнить действия. А о синхронизации действий в заданных рамках. Возьмем за такую рамку и условие, к примеру, итерацию основного цикла. Обработали все времянки подавления дребезга, по условиям модуль генерирует событие (что-то). Другими модулями видится это что-то, и выполняются определенные действия. Скажем, за итерацию основного цикла. Прошла итерация, это что-то больше не выставлено. Главное условие, сохранить инкапсуляцию программных модулей.
Хмм... Как такая идея. Берем за временную засечку системный таймер и очередность выполнения модулей основной цикл. В обработчике системного таймера будет определена глобальная переменная флаг. Определенный модуль выставляет этот флаг. Определяем также еще одну переменную-флаг. Когда происходит прерывание системного таймера, мы сбрасываем первый флаг и выставляем следующий. В начале основного цикла, если установлен этот флаг, выполняем действия в пределах итерации основного цикла. При следующей итерации так как первый флаг сброшен, больше ничего не выставляется.
Подсмотрено у ЛИ.
Код
//----------------------------- Переменные: ----------------------------------
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); //обслуживание измерителя
}
}