не происходит прерывания запущенной нитки когда подключен VIC
более детальное описание:
есть 2 прерывания (по нажатию 2 кнопок) key0_irq() и key1_irq(). Каждое из прерываний внутри мигает лампочкой и key0_irq() ещё выставляет флаг ф-й OSFlagPost(), который ждет ф-й OSFlagPend() нитка led_task() и долго внутри крутится в цикле со счетчиком.
Когда подтыкаю внешний контроллер прерываний, и запускается нитка led_task(), прерывания блокируются до окончания её работы, т.е. пока снова не наткнется на Pend.
Если используется Внутренний Контроллер, то ВСЕ НОРМАЛЬНО.
Подскажите пож, что я забыл
CODE
static OS_FLAG_GRP *toLed_flGr;
//#define OSIntEnter_en
//===================================================================
//===================================================================
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
void key0_irq(void* context)
#else
void key0_irq(void* context, alt_u32 id)
#endif
{
for(alt_u32 te_co =0xff; te_co; te_co--)
IOWR_ALTERA_AVALON_PIO_SET_BITS(LED_BASE, 0x10); //led irq0 on
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY0_BASE, 1); //irq flag clear
#ifdef OSIntEnter_en
OSIntEnter();
#endif
alt_u8 err;
OSFlagPost( toLed_flGr,
1,
OS_FLAG_SET,
&err
);
IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(LED_BASE, 0x10); //led irq0 off
#ifdef OSIntEnter_en
OSIntExit();
#endif
}
//===================================================================
//===================================================================
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
void key1_irq(void* context)
#else
void key1_irq(void* context, alt_u32 id)
#endif
{
#ifdef OSIntEnter_en
OSIntEnter();
#endif
for(alt_u32 te_co =0xff; te_co; te_co--)
IOWR_ALTERA_AVALON_PIO_SET_BITS(LED_BASE, 0x20);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY1_BASE, 1);
IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(LED_BASE, 0x20);
#ifdef OSIntEnter_en
OSIntExit();
#endif
}
//===================================================================
//===================================================================
#define ledTaskStk_le 1024
OS_STK ledTaskStk[ledTaskStk_le];
void led_task(void *arg) //просто мигание первым светодиодом. Самая низкоприоритетная нитка.
{
while(1)
{
alt_u8 OSFlagPend_err;
alt_u8 flagActive;
flagActive = OSFlagPend( toLed_flGr,
1,
OS_FLAG_WAIT_SET_ANY + OS_FLAG_CONSUME,
0, //тиков до сработки (потом тут можно выставить ожидание для перехода на др канал)
&OSFlagPend_err
);
IOWR_ALTERA_AVALON_PIO_SET_BITS(LED_BASE, 0x1);
for(alt_u32 te_co =0x9fffff; te_co; te_co--)
IOWR_ALTERA_AVALON_PIO_SET_BITS(LED_BASE, 0x1);
IOWR_ALTERA_AVALON_PIO_CLEAR_BITS(LED_BASE, 0x1);
}//while(1)
}
//===================================================================
//===================================================================
int main()
{
alt_u8 OSFlagCreate_err;
toLed_flGr = OSFlagCreate(0, &OSFlagCreate_err);
OSTaskCreate(led_task, NULL, &(ledTaskStk[ledTaskStk_le -1]), 5);
alt_u32 te1;
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register( KEY0_IRQ_INTERRUPT_CONTROLLER_ID, KEY0_IRQ, key0_irq, &te1, 0 );
alt_ic_irq_enable( KEY0_IRQ_INTERRUPT_CONTROLLER_ID, KEY0_IRQ );
#else
alt_irq_register( KEY0_IRQ, &te1, key0_irq );
alt_irq_enable( KEY0_IRQ );
#endif
//разрешить в pio регистрах прерывания
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY0_BASE, 1);
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register( KEY1_IRQ_INTERRUPT_CONTROLLER_ID, KEY1_IRQ, key1_irq, &te1, 0 );
alt_ic_irq_enable( KEY1_IRQ_INTERRUPT_CONTROLLER_ID, KEY1_IRQ );
#else
alt_irq_register( KEY1_IRQ, &te1, key1_irq );
alt_irq_enable( KEY1_IRQ );
#endif
//разрешить в pio регистрах прерывания
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY1_BASE, 1);
OSStart();
return 0;
}
Сообщение отредактировал sse - Aug 19 2011, 12:57