??? 10/04/12 03:08 Read: times |
#188566 - Timers - Function Pointers |
Hi all
I would like to create an array of timer structs, that on expiration call a function - that's easy enough. But.... The functions that they call have differing argument types (void, through to pointers to other structs) I am using Raisonance compiler RC51 on a silabs F040 Here is my header typedef enum timer_types{ timer_one_shot =0, timer_periodic =1 }timer_type_t; typedef void (*func_pointer)(void *); typedef struct timer{ unsigned int reset_value; unsigned int current_value; unsigned char timer_priority; timer_type_t timer_type; func_pointer timeout_func; void *func_args; }s_timer_t; #define NUMBER_OF_TIMERS 10 extern s_timer_t timer_array[]; and here is my timer code (called on 1mSec tick) void TIMERS_sort_out_timers(void){ unsigned char i; for (i = 0; i < NUMBER_OF_TIMERS; i++){ //step through each of our timers if (timer_array[i].current_value != 0){ //see if we have already expired. timer_array[i].current_value --; //if not then decrement the timer toward 0 if (timer_array[i].current_value == 0){ //now see if we have timed out if (timer_array[i].timer_type == timer_periodic){ //if we run on a periodic timer timer_array[i].current_value = timer_array[i].reset_value; //reload the timer } timer_array[i].timeout_func(timer_array[i].func_args); //if we have timed out then perform the function in our callback. } } } } This is one of the timer functions that I would like to run, note that it has no arguments, this is the problem as the timer function is expecting to pas an argument of void *. void MAIN_blink(void){ RUN_LED = !RUN_LED; } for completeness, this is how I am initialising the timers void TIMERS_init_timers(void){ //start the timeout timer now timer_array[cctalk_msg_timeout].reset_value = CCTALK_MSG_TIMEOUT_MSEC; timer_array[cctalk_msg_timeout].current_value = 0; timer_array[cctalk_msg_timeout].timer_type = timer_one_shot; timer_array[cctalk_msg_timeout].timeout_func = UART_null_function; //start the timeout timer now timer_array[keep_alive_led].reset_value = KEEP_ALIVE_BLINK_RATE; timer_array[keep_alive_led].current_value = KEEP_ALIVE_BLINK_RATE; //this must be non 0 to start the timer running. timer_array[keep_alive_led].timer_type = timer_periodic; timer_array[keep_alive_led].timeout_func = MAIN_blink; timer_array[cctalk_char_timeout].reset_value = CCTALK_CHAR_TIMEOUT_MSEC; timer_array[cctalk_char_timeout].current_value = 0; timer_array[cctalk_char_timeout].timer_type = timer_one_shot; timer_array[cctalk_char_timeout].timeout_func = UART_null_function ; } so the question is, how do I correctly create a callback to a function with zero or more arguments? Thanks for the ideas. Regards Marshall |
Topic | Author | Date |
Timers - Function Pointers | 01/01/70 00:00 | |
Too much for a '51? | 01/01/70 00:00 | |
I Agree | 01/01/70 00:00 | |
Function Pointers... | 01/01/70 00:00 | |
you are violating KISS | 01/01/70 00:00 | |
Various Timer Functions | 01/01/70 00:00 | |
Thanks Michael | 01/01/70 00:00 | |
regardless, you are violating KISS | 01/01/70 00:00 | |
even on ARM | 01/01/70 00:00 | |
The timer simply increments | 01/01/70 00:00 | |
bug | 01/01/70 00:00 | |
more bugs | 01/01/70 00:00 | |
thanks | 01/01/70 00:00 |