Ответов много и все верный.. ну как же моих трех копеек ))...
#include "events.h"
static TTMyEvent t2_events[MAX_EVENT] = {
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE },
{ DISABLE, 0, NULL, DISABLE }
};
static int pause = DISABLE;
void event_Disable(void* event)
{
pause = ENABLE;
if (event == EVENT_ALL)
{
for (int i = 0; i < MAX_EVENT; i++)
t2_events[i].enabled = DISABLE;
}
else
{
for (int i = 0; i < MAX_EVENT; i++)
if (t2_events[i].event == event)
{
t2_events[i].enabled = DISABLE;
t2_events[i].event = NULL;
break;
}
}
pause = DISABLE;
}
void event_Init(void* event, uint32_t ms)
{
event_Disable(event);
for (int i = 0; i < MAX_EVENT; i++)
if (t2_events[i].event == NULL)
{
t2_events[i].event = event;
t2_events[i].ms = ms;
t2_events[i].cycle = 0;
t2_events[i].enabled = ENABLE;
break;
}
}
void event_InitCycle(void* event, uint32_t cycle)
{
event_Disable(event);
for (int i = 0; i < MAX_EVENT; i++)
if (t2_events[i].event == NULL)
{
t2_events[i].event = event;
t2_events[i].ms = cycle;
t2_events[i].cycle = cycle;
t2_events[i].enabled = ENABLE;
break;
}
}
void TIM2_IRQHandler(void)
{
if (pause == DISABLE)
for (int i = 0; i < MAX_EVENT; i++)
if (t2_events[i].enabled == ENABLE)
{
if (--t2_events[i].ms == 0)
{
if (t2_events[i].cycle)
t2_events[i].ms = t2_events[i].cycle;
else
t2_events[i].enabled = DISABLE;
if (t2_events[i].event != NULL)
((TFunc)t2_events[i].event)();
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
__ASM("nop");
__ASM("nop");
}
#ifndef EVENTS_H
#define EVENTS_H
#include "common.h"
#define MAX_EVENT 10
typedef void (*TFunc)();
typedef struct
{
uint32_t enabled;
uint32_t ms;
void* event;
uint8_t cycle;
} TTMyEvent;
#define EVENT_ALL NULL
void event_Disable(void* event);
void event_Init(void* event, uint32_t ms);
void event_InitCycle(void* event, uint32_t cycle);
#endif // EVENTS_H