3,6 → 3,92 |
#include <kernel/func.h> |
#include <ll/sys/ll/event.h> |
|
PID intr_server = NIL; |
|
#define MAX_INT_LIST 50 |
|
void *int_arg_table[16]; |
void *int_func_table[16]; |
|
int int_list[MAX_INT_LIST]; |
int next_free_int = 0; |
int next_execute_int = 0; |
|
/* FIFO add job */ |
int add_interrupt_job(int no) |
{ |
|
int_list[next_free_int] = no; |
next_free_int++; |
|
if (next_free_int == MAX_INT_LIST) next_free_int = 0; |
if (next_free_int == next_execute_int) { |
next_free_int--; |
return -1; |
} |
|
return 0; |
|
} |
|
/* FIFO get job */ |
int get_interrupt_job() |
{ |
|
int res = -1; |
|
if (next_free_int != next_execute_int) { |
res = int_list[next_execute_int]; |
next_execute_int++; |
if (next_execute_int == MAX_INT_LIST) next_execute_int = 0; |
} |
|
return res; |
|
} |
|
extern void linux_intr(int no); |
|
TASK Interrupt_Server(void *arg) |
{ |
|
int no; |
|
while(1) { |
|
no = get_interrupt_job(); |
if (no != -1) |
linux_intr(no); |
|
task_endcycle(); |
|
} |
|
} |
|
int shark_interrupt_server() { |
|
HARD_TASK_MODEL ht; |
int i; |
|
for(i=0;i<16;i++) { |
int_arg_table[i] = NULL; |
int_func_table[i] = NULL; |
} |
|
hard_task_default_model(ht); |
hard_task_def_wcet(ht,10000); |
hard_task_def_interrupt(ht); |
|
intr_server = task_create("Interrupt Server",Interrupt_Server,&ht,NULL); |
if (intr_server != NIL) |
return 0; |
else |
return -1; |
|
|
} |
|
void shark_internal_sem_create(void **sem, int init) { |
*sem = (void *)malloc(sizeof(internal_sem_t)); |
internal_sem_init((internal_sem_t *)(*sem),init); |
26,10 → 112,29 |
return event_delete(index); |
} |
|
int shark_handler_set(int no, void (*fast)(int), int pi, BYTE lock){ |
return handler_set(no, fast, (PID)pi, lock); |
void fast_call(int no) |
{ |
|
int res; |
|
res = add_interrupt_job(no); |
if (intr_server != NIL && res == 0) |
task_activate(intr_server); |
|
} |
|
int shark_handler_set(int no, void *fast, void *arg){ |
|
if (no >= 1 && no < 16) { |
int_arg_table[no] = arg; |
int_func_table[no] = fast; |
return handler_set(no, fast_call, NIL, TRUE); |
} else { |
return -1; |
} |
|
} |
|
int shark_handler_remove(int no){ |
return handler_remove(no); |
} |