Nios® V/II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® V/II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++

Interrupt handling

Altera_Forum
Honored Contributor II
1,883 Views

Hello guys, I got problems with my interrupt routines. One routine is for uart whitch means if a character comes in it'll be stored in a buffer array, the other one is for simple timer ticks.  

 

I wrote following for enabling the interrupts: 

 

alt_irq_enable (SYS_TIMER1_IRQ);  

alt_irq_enable (UART_IRQ);  

 

Next, I wrote the request routines: 

 

alt_irq_register (SYS_TIMER1_IRQ, pWORKINGVAR, ServiceRoutineTIMER); 

alt_irq_register (UART_IRQ, pWORKINGVAR, ServiceRoutineUART); 

 

When I debug my code I be able to see the STATUS register whitch holds the value 0x1 (Interrupts enabled) and the IENABLE register whitch holds the value 0x6 (2 for uart and 1 for timer). 

 

I think both are corrcet... Can you check my code about errors, do I need additional code for enabling interrupts ??? How can I proof that an interrupt occured ??? (register ect.) 

 

Thank's for helping... 

 

Maestro
0 Kudos
11 Replies
Altera_Forum
Honored Contributor II
928 Views

Hi, 

 

You don't need additional code to enable interrupt, alt_irq_register() routine enables the requested interrupt if ISR pointer is not NULL. 

 

You can check for IPENDING register in Nios II CPU for any pending interrupts. 

Hope this help. :) 

0 Kudos
Altera_Forum
Honored Contributor II
928 Views

Hi Iftan, thank's for your reply. 

My problem is very confuse. My ISR for the timer interrupt works perfect. I checked also the IPENDING register, if there is an incoming timer interrupt I can see 0x02 (for the timer interrupt flag), after that, the timer ISR enters.  

 

But my uart ISR doesn't work. I use HyperTerminal for communication. I checked the hardware with a simple polling routine. Every time I press an key the routine returns the character to HyperTerminal. Works fine but is laborious. I dont't see the changing of the IPENDING register, either. Could it be, that a hardware or software part blocks the uart interrupt request ???
0 Kudos
Altera_Forum
Honored Contributor II
928 Views

Hi, 

 

If you enable reduced device driver or small driver, it uses the polling instead of interrupt. That why you can't see any change for IPENDING. :)
0 Kudos
Altera_Forum
Honored Contributor II
928 Views

Oh oh, I have to mark "reduced device driver" because I haven't an external RAM therefore I currently debug from ONCHIP RAM. It isn't large enough to fit my design with large device drivers. Is there a possibility to circumvent this problem. I must say, two days ago the uart ISR works... after Re-compilation of my Quartus project and downloading to my system the ISR failed.

0 Kudos
Altera_Forum
Honored Contributor II
928 Views

by the way, you must use interrupt mode in UART? 

 

If "reduced device driver" or "small driver" is enabled, it uses polling mode in UART driver. Thus, it no call to alt_irq_register().  

 

There are few solutions for this: 

- Increase your on-chip memory size so that can set "reduced device driver" or "small driver" to false (but you need to check the HW spec). 

- Use external memory ("reduced device driver" = false) 

- "reduced device driver" = true, modify UART driver to use interrupt even if "reduced device driver" is enabled (I never try this before and not sure it can work or not and I'm not sure the code size can fit to your on-chip memory or not after this change). 

 

Good luck!
0 Kudos
Altera_Forum
Honored Contributor II
928 Views

I have one question about UART. If I use reduced device driver I will be unable to write my own ISR to use UART ?

0 Kudos
Altera_Forum
Honored Contributor II
928 Views

First, are you using your own UART driver or Altera provided UART driver? 

 

If "reduced device driver" or "small driver" is enabled, it doesn't use the ISR routine altera_avalon_uart_irq(). Instead, it will use the polling mode. For example, when you try to read or write something to UART, it will block the program (while loop), until it can send or receive any data from UART. 

 

You can try to read the source code for altera_avalon_uart_write() and altera_avalon_uart_read() routines under the# if defined(ALT_USE_SMALL_DRIVERS) || defined(ALTERA_AVALON_UART_SMALL). You can understand more.
0 Kudos
Altera_Forum
Honored Contributor II
928 Views

I see. So, I have second question. Can I replace original driver with my own, which is using interrupts ?

0 Kudos
Altera_Forum
Honored Contributor II
928 Views

Yes, you can. But you need to manage the ISR yourself, i.e registering ISR routine. 

 

Anyway, you can disable "reduced device driver" feature if you would like to use interrupt mode.
0 Kudos
Altera_Forum
Honored Contributor II
928 Views

For more information about developing device driver, please see Chapter 7:  

http://www.altera.com/literature/hb/nios2/n2sw_nii52005.pdf
0 Kudos
Altera_Forum
Honored Contributor II
928 Views

I am hereby submitting my interrupt driven UART API as an investment in good karma. Thanks to everyone on this forum who have provided suggestions to allow me to succeed. :) 

 

John Speth
0 Kudos
Reply