Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

это карусельку что-ли примитивную ту? Не знаю, зачем, но вот

Отправлено DASM 11 декабря 2006 г. 01:30
В ответ на: DASM привет. Как то Ты тут вылаживал структуры таймеров. Можешь еще раз повторится? отправлено <font color=gray>Xanoy</font> 11 декабря 2006 г. 01:09

#include "timers.h"
#include "types.h"
// структура с информацией о таймере
typedef struct
{
UINT uiTime;
UINT uiID;
PTIMERPROC pTimerProc;
void *pvParam;
} TIMERSTRUCT;

// массив таймеров
TIMERSTRUCT aTimers[MAXTIMERS];

void InitTimers(void)
{
char i;
for (i = 0; i < MAXTIMERS; i++) {
aTimers[i].uiID = 0;
}
}


void SetTimer (PTIMERPROC CallBackProc, UINT uiTimeout, UINT uiID, void *pvParam)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if ((pTimer->uiID) == 0) {
// свободен
pTimer->uiID = uiID;
pTimer->pvParam = pvParam;
pTimer->uiTime = uiTimeout;
pTimer->pTimerProc = CallBackProc;
LEAVE_CRITICAL();
return;
}

} while (++pTimer < &aTimers[MAXTIMERS]);
// если дошли до сюда - таймеров больше нет
LEAVE_CRITICAL();

}

void KillGroupTimers(UCHAR ucID)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (((pTimer->uiID >> 8) & 0xff) == ucID) {
// ID совпал, чистим
pTimer->uiID = 0;
}
} while (++pTimer < &aTimers[MAXTIMERS]);
LEAVE_CRITICAL();

}
void KillTimer(UINT uiID)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (pTimer->uiID == uiID) {
// ID совпал, чистим
pTimer->uiID = 0;
}
} while (++pTimer < &aTimers[MAXTIMERS]);
LEAVE_CRITICAL();
}


BOOL IsTimerActive (UINT uiID)
{
TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (pTimer->uiID == uiID) {
// ID совпал
LEAVE_CRITICAL();
return TRUE;
}
} while (++pTimer < &aTimers[MAXTIMERS]);
LEAVE_CRITICAL();
return FALSE;
}


void TimersOnInterrupt()
{

TIMERSTRUCT *pTimer = aTimers;
ENTER_CRITICAL();
do {
if (pTimer->uiID != 0) {
// uid != 0 ->работает
if (pTimer->uiTime-- == 0) {
// досчитал
pTimer->pTimerProc(pTimer->pvParam);
pTimer->uiID = 0;
}
}

} while (++pTimer <= &aTimers[MAXTIMERS-1]);
LEAVE_CRITICAL();
}



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 4 пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru