Apтём (05.08.2013 15:02, просмотров: 96) ответил mazur на Например, у меня таймерная служба. На асме я в файле таймерной службы создал макрос автоматического добавления порядкового номера таймера и автоматического добавления блока в ОЗУ. При компиляции создаются порядковые номера и очередь таймеров.
На плюсах можно что-то похожее замутить (или вам голый Си только годится?):
#define MAX_TIMER_NUMBER 10
class SoftTimer_t {
static SoftTimer_t * List[MAX_TIMER_NUMBER];
static unsigned char TimerCounter;
static void AddNewTimer(SoftTimer_t * new_timer) {
if (TimerCounter<(MAX_TIMER_NUMBER-1)) {
List[TimerCounter++]=new_timer;
}
else {
while (1) ;
}
}
public:
unsigned short TimerValue;
SoftTimer_t(unsigned short init_value) {
AddNewTimer(this);
TimerValue=init_value;
}
static void Exec() {
for (unsigned char i=0; i<TimerCounter; i++) {
if (List[i]->TimerValue) {
List[i]->TimerValue--;
}
}
}
void Restart(unsigned short new_timeout) {
TimerValue=new_timeout;
}
};
SoftTimer_t * SoftTimer_t::List[MAX_TIMER_NUMBER];
unsigned char SoftTimer_t::TimerCounter;
SoftTimer_t T1(10), T2(20);
ISR(TIMER1_COMPA_vect)
{
SoftTimer_t::Exec();
}
void Func1() {
//.....
T1.Restart(100);
//.....
}
void Func2() {
//.....
T2.Restart(10000);
//.....
}