Jump to content

    

NIOS + uc/OS-II + vic

не происходит прерывания запущенной нитки когда подключен VIC :(

 

более детальное описание:

есть 2 прерывания (по нажатию 2 кнопок) key0_irq() и key1_irq(). Каждое из прерываний внутри мигает лампочкой и key0_irq() ещё выставляет флаг ф-й OSFlagPost(), который ждет ф-й OSFlagPend() нитка led_task() и долго внутри крутится в цикле со счетчиком.

 

Когда подтыкаю внешний контроллер прерываний, и запускается нитка led_task(), прерывания блокируются до окончания её работы, т.е. пока снова не наткнется на Pend.

Если используется Внутренний Контроллер, то ВСЕ НОРМАЛЬНО.

Подскажите пож, что я забыл

 

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;

}

 

Edited by sse

Share this post


Link to post
Share on other sites
Когда подтыкаю внешний контроллер прерываний, и запускается нитка led_task(), прерывания блокируются до окончания её работы, т.е. пока снова не наткнется на Pend.

Если используется Внутренний Контроллер, то ВСЕ НОРМАЛЬНО.

Подскажите пож, что я забыл

какая версия квартуса? используется ли Qsys?

Share this post


Link to post
Share on other sites
какая версия квартуса? используется ли Qsys?

 

версия 10.1 только SOPC билдер.

попробовал даж использовать эклипс_11, но все так же

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this