Ещё один программный таймер

Решил тоже поучаствовать в конкурсе «у кого таймер проще» :)
Это даже не велосипед, а так, самокат :)

Времени расписывать особо нет, поэтому буду краток.
Да и пояснять особо нечего.
typedef enum eTimerStatus
{
	etsTimerIDLE = 0,
	etsTimerCount,
	etsTimerEvent
} eTimerStatus;

typedef struct stTimer
{
	volatile ShortTimer *Count;
	volatile eTimerStatus Status;
} stTimer;

Это базовые определения. Теперь функционал:

#include "Timers.h"

/**
*	\brief Пул таймеров
*/
static ShortTimer volatile TimersPool[eTimersNumber];
static eTimerStatus volatile TimersStatusPool[eTimersNumber];

void TickTimers()
{
	for(int i=0; i < eTimersNumber; i++)
	{
		if(TimersPool[i] > 0)
		{
			TimersPool[i] --;
			if(0 == TimersPool[i])
			{
				TimersStatusPool[i] = etsTimerEvent;
			}
		}
	}
}

void StartTimer(eTimerIndex timer, ShortTimer period_ms)
{
	TimersPool[timer] = period_ms;
	TimersStatusPool[timer] = etsTimerCount;
}

eTimerStatus GetTimerStatus(eTimerIndex timer)
{
	if(etsTimerEvent == TimersStatusPool[timer])
	{
		TimersStatusPool[timer] = etsTimerIDLE;
		return(etsTimerEvent);		
	}
	else
	{
		return(TimersStatusPool[timer]);
	}
}

ShortTimer GetTimerCount(eTimerIndex timer){
	return(TimersPool[timer]);
}


Ну и пример использования.
typedef unsigned int ShortTimer;

typedef enum eTimerIndex
{
	eADC1Timer = 0,
	eADC2Timer,
	eADC3Timer,
	eADCProcessTimer,
	eChanDiapSwitchDelayTimer,
	eModbusTimer,
	eTimersNumber
} eTimerIndex;

void SysTick_Handler(void){

	TickTimers();
}

void main(){
    ...
    StartTimer(eADCProcessTimer, 5);

    while (1){
	...
	if(etsTimerEvent == GetTimerStatus(eADCProcessTimer)){
	    ProcessADC();
	    StartTimer(eADCProcessTimer, 5);
	}
        ...
    }
}


Если что непонятно (что вряд ли), спрашивайте, добавлю.
Главное удобство в простоте использования. Нужен ещё один таймер — добавили имя в enum eTimerIndex и можно пользоваться.

PS: Сейчас глянул ещё раз — а зачем мне вообще stTimer? Наверно, изначально что-то другое задумывал. Ну да ладно.
  • 0
  • 28 июня 2016, 12:57
  • MrYuran

Комментарии (10)

RSS свернуть / развернуть
Почему-то в голову лезет анекдот. Не в обиду топикстартеру!

Некий довольно-таки амбициозно настроенный клиент подзывает официанта:
— А чё это у Вас за зарубки такие по краю стола? Я постоянно за них рукавом цепляюсь…
— Да, понимаете… вчера у нас братва отдыхала…
— Ичо?
— Да, вот… после полуночи решили помериться…
— Силой?
— Не-е, длиной… Ну, у кого длиннее…
— Ха! Слабаки! Дак у меня всяко длиннее, — расстегивает ширинку.
— Извините… Вы не поняли — они мерились от того края стола…
-1
Ну таки TickTimers должен из прерывания вызываться или же из основного цикла по флагу, а у меня вообще такой функции нет)
0
еще минус: eTimersNumber — нужно считать/следить за количеством этих структур. А у меня структура может быть просто локальной)
0
Не нужно, тупо воткнул новый индекс и забыл.
Расходы — по одному элементу в двух массивах плюс одна итерация в TickTimers()
Я раньше тоже делал, как у вас. А потом где-то наткнулся на такую идею и решил реализовать.
0
Если вдруг захочется сэкономить пару строчек, то вместо

    if(TimersPool[i] > 0)
    {
        TimersPool[i] --;
        if(0 == TimersPool[i])
        {
            TimersStatusPool[i] = etsTimerEvent;
        }
    }

можно написать

    if(TimersPool[i] && --TimersPool[i] == 0)
    {
        TimersStatusPool[i] = etsTimerEvent;
    }
0
Сломается если выключить ленивые булевы вычисления. Ну и менее понятно.
0
а где это их выключить можно?
0
Честно говоря, я не помню, что говорит стандарт на С на эту тему, но отключаемые lazy boolean expressions я встречал, как минимум, в Delphi.
0
Честно говоря, я не помню, что говорит стандарт на С на эту тему
По стандарту сокращенное вычисление булевых выражений обязательно. Так что в С/С++ не отключаются, да.
Привычка мультиязычника — не полагаться на то, что по разному работает в разных языках. Я и скобки предпочитаю поставить лишние, чем вспоминать табличку приоритета операторов для текущего языка.
0
а я вот скобки не люблю и из-за этого регулярно ловлю баги))
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.