Перейти к содержанию
    

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;

}

 

Изменено пользователем sse

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...