Fri 13 Nov 2009 02:59:32 PM UTC, comment #17:
It's been quite a long time since this
thread was started. So far the only
discussion was about how to implement the timers.
I can confirm that nosys.c and nosys.h, sent by
Frederic work perfect for me with only one
difference: Added
if( time_diff < 0 ) {
/* the '> 0' is an easy wrap-around check: the big gap at the wraparound step is simply ignored... */
time_diff = 0;
last_time = cur_time;
}
before the if (time_diff > 0) check.
Otherwise when the tick counter overflows the value
0xFFFF0000, the (time_diff > 0) check will fail
for the next 65.535 seconds! This happens, as you know,
every 49 days. Not a big deal but may be irritating.
This is all I can say about the timers.
Now the timeouts:
I implemented a nosys framework with a small array
of timeout structs (12 bytes):
struct nosys_timeout_s {
u32_t time;
nosys_timeout_handler h;
void *arg;
};
struct nosys_timeout_s nosys_timeouts[NOSYS_TIMEOUTS_NUM];
The following functions are defined:
void nosys_timeouts_init(void);
void nosys_timeout(u32_t msecs, nosys_timeout_handler h, void *arg);
void nosys_untimeout(nosys_timeout_handler h, void *arg);
void nosys_tout_timers(void);
u8_t nosys_getfreetouts(void);
#if 1 /* Test nosys_timeouts implementation */
void test_nosys_timeouts(void);
#endif
They work exactly as the sys_* cousins.
The timers are one-shot, but there is no problem
to request the timeout inside itself. This is
how it can becomes periodic like the others in
timers_table[];
There is also a test_nosys_timeouts() function
that proofs everything works as expected.
If you accept this, the following should be added to opt.h:
#ifndef NOSYS_TIMEOUTS_NUM
#define NOSYS_TIMEOUTS_NUM 5 /* Define how many simultaneous timeout can be active*/
#endif
#ifndef NOSYSTO_DEBUG
#define NOSYSTO_DEBUG LWIP_DBG_OFF
#endif
This is the log when the test is started:
nosys_timeouts_init(): Ready
starting test_nosys_timeouts...
Reg TO @ idx 0, time 1000, h 0x00037538, arg 0x40006A0C
Reg TO @ idx 1, time 2000, h 0x000375B4, arg 0x40006A10
Reg TO @ idx 2, time 3000, h 0x00037658, arg 0x40006A14
nosys_tout_timers: Starting TO @ idx 0, handler 0x00037538, arg 0x40006A0C
my_timeout1 fired, arg = 0 <--
nosys_tout_timers: Finished TO @ idx 0 <--
nosys_tout_timers: Starting TO @ idx 1, handler 0x000375B4, arg 0x40006A10
my_timeout2 fired, arg = 1 <--
Reg TO @ idx 0, time 2000, h 0x000375B4, arg 0x40006A10
nosys_tout_timers: Finished TO @ idx 1 <--
nosys_tout_timers: Starting TO @ idx 2, handler 0x00037658, arg 0x40006A14
my_tout3a fired, arg = 1 <--(free: 4)
Reg TO @ idx 1, time 2000, h 0x00037708, arg 0x40006A14
nosys_tout_timers: Finished TO @ idx 2 <--
nosys_tout_timers: Starting TO @ idx 0, handler 0x000375B4, arg 0x40006A10
my_timeout2 fired, arg = 2 <--
Reg TO @ idx 0, time 2000, h 0x000375B4, arg 0x40006A10
nosys_tout_timers: Finished TO @ idx 0 <--
(file #19043, file #19044, file #19045, file #19046)
|