sse 0 19 августа, 2011 Опубликовано 19 августа, 2011 (изменено) · Жалоба не происходит прерывания запущенной нитки когда подключен 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; } Изменено 19 августа, 2011 пользователем sse Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 20 августа, 2011 Опубликовано 20 августа, 2011 · Жалоба Когда подтыкаю внешний контроллер прерываний, и запускается нитка led_task(), прерывания блокируются до окончания её работы, т.е. пока снова не наткнется на Pend. Если используется Внутренний Контроллер, то ВСЕ НОРМАЛЬНО. Подскажите пож, что я забыл какая версия квартуса? используется ли Qsys? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sse 0 21 августа, 2011 Опубликовано 21 августа, 2011 · Жалоба какая версия квартуса? используется ли Qsys? версия 10.1 только SOPC билдер. попробовал даж использовать эклипс_11, но все так же Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться