static bool_t timer_handler(void *arg) { milandr_mil1553_t *mil = arg; if (mil->urgent_desc.raw != 0) { //debug_printf("urgent_desc "); //int i; //int wc = (mil->urgent_desc.words_count==0?32:mil->urgent_desc.words_count); //for(i=0;i<wc;i++) { // debug_printf("%04x ", mil->urgent_data[i]); //} //debug_printf("\n"); mil->urgent_desc.reserve = 1; // Признак того, что идёт передача вне очереди start_slot(mil, mil->urgent_desc, mil->urgent_data); } else if (mil->cur_slot == mil->cyclogram) { if (mil->cur_slot != 0) { start_slot(mil, mil->cur_slot->desc, mil->cur_slot->data); } } mil->tim_reg->TIM_STATUS = ARM_TIM_CNT_ZERO_EVENT; arch_intr_allow(mil->tim_irq); return 1; }
void mutex_attach_irq (mutex_t *m, int irq, handler_t func, void *arg) { mutex_irq [irq].irq = irq; mutex_attach_swi(m, &mutex_irq [irq], func, arg); arch_intr_bind (irq); arch_intr_allow (irq); }
static int system_timer_irq_handler(void* arg) { debug_printf("timer irq, TIM_CNT = %d\n", ARM_TIMER2->TIM_CNT); counter++; ARM_TIMER2->TIM_STATUS = 0; arch_intr_allow(15); return 0; }
/* * Быстрый обработчик прерывания от интервального таймера. * Аргумент вызова не используется. */ static bool_t timer_handler (void *arg) { /* Снимаем бит прерывания. */ MC_ITCSR &= ~MC_ITCSR_INT; /* Заново открываем маску прерывания. */ arch_intr_allow (TIMER_IRQ); /* Вычисляем время. */ timer_msec += MSEC_PER_TICK; if (timer_msec >= 500) { timer_msec = 0; mutex_activate (&timer_half_sec, 0); if (++timer_hsec >= 2) { timer_hsec = 0; if (++timer_sec >= 60) { timer_sec = 0; if (++timer_min >= 60) { timer_min = 0; timer_hour++; } } } } /* Меняем приоритеты вычислительных задач. * Одна из задач (по циклу) получает приоритет 2, остальные - 1. */ if (t1->prio == 2) { t1->prio = 1; t2->prio = 2; } else if (t2->prio == 2) { t2->prio = 1; t3->prio = 2; } else if (t3->prio == 2) { t3->prio = 1; t4->prio = 2; } else { /* очевидно t4->prio == 2 */ t4->prio = 1; t1->prio = 2; } /* Устанавливаем флаг: необходимо сменить текущую задачу. */ task_need_schedule = 1; /* Возвращаем 1: прерывание полностью обработано. */ return 1; }