реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> NIOS + uc/OS-II + vic, не происходит прерывания запущенной нитки :(
sse
сообщение Aug 19 2011, 12:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 8-03-05
Из: Россия, Суздаль
Пользователь №: 3 159



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

более детальное описание:
есть 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


--------------------
Serj
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Aug 20 2011, 08:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(sse @ Aug 19 2011, 19:52) *
Когда подтыкаю внешний контроллер прерываний, и запускается нитка led_task(), прерывания блокируются до окончания её работы, т.е. пока снова не наткнется на Pend.
Если используется Внутренний Контроллер, то ВСЕ НОРМАЛЬНО.
Подскажите пож, что я забыл

какая версия квартуса? используется ли Qsys?
Go to the top of the page
 
+Quote Post
sse
сообщение Aug 21 2011, 18:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 8-03-05
Из: Россия, Суздаль
Пользователь №: 3 159



Цитата(vadimuzzz @ Aug 20 2011, 12:12) *
какая версия квартуса? используется ли Qsys?


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


--------------------
Serj
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 03:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016