Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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;
}
Esempio n. 4
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;
}