/*硬中断时候触发调用*/
void do_timer(void)
{
unsigned int task_id;
int ret;
static long tmp = 0;
/*扫描timer列表并处理timer对应的fn()*/
if (next_timer) {
next_timer->jiffies--;
while (next_timer && next_timer->jiffies <= 0) {
void (*fn)(void);
fn = next_timer->fn;
next_timer->fn = NULL;
next_timer = next_timer->next;
(fn)();
}
}
/*刷新所有任务的 sleep_time并将重新苏醒的任务的计数器设置为预算值。*/
refresh_sleep_time();
/*刷新当前任务的计数器*/
if( current->counter > 0 ) {
current->counter--;
}
/*找到下一个要执行的任务并刷新到current中*/
task_id = schedule();
current = &g_task_tbl[task_id];
current->stat_counter++;
return;
}
/*软中断时候触发调用*/
void do_syscall_timer(void)
{
unsigned int task_id;
task_id = schedule();
/*找到下一个要执行的任务并刷新到current中*/
current = &g_task_tbl[task_id];
current->stat_counter++;
return;
}
static void task0_timer(void)
{
add_timer(HZ, task0_timer );
}
void main_task(void)
{
int cbuf_addr;
cbuf_t *cbuf;
my_queue_t *cbuf_queue;
my_queue_t *mbuf_queue;
unsigned int sec, block, cyl, head;
int sect = 63;
int header = 16;
int hehe = 0;
/*Make sure interrupt pin is INTA*/
if ( g_card_init_ok == 0 && get_int_pin() == 1) {
set_intr_gate((32+get_int_line()), &pcnet32_call_interrupt);//10+32
outb(inb_p(0x21)&0xfb,0x21);
outb(inb_p(0xa1)&0xfb,0xa1);
cli();
pcnet32_open(g_io_address);
sti();
}
for(;;){
/*处理cbuf queue*/
cbuf_queue = ¤t->cbuf_queue;
while(( cbuf_queue->head != cbuf_queue->tail ) ) {
cbuf_addr = cbuf_queue->buf_list[cbuf_queue->tail];
cbuf = (cbuf_t *)cbuf_addr;
cbuf_queue->tail = (cbuf_queue->tail +1) &(MAX_CBUF_NUM-1);
}
/*处理mbuf queue*/
delay(HZ);/*1 second*/
}
}