Altera_Forum
Honored Contributor
19 years agoCan't access the Main function!
Hi community:
Now i encounter a really strange problem. I develop a nios system. It contains SDram, Sram, Flash, and other module. There is no error while i compile it in SOPC and Quartus. When i start a Hello LED project in NIOS IDE, the Alt_main is the entry of the program, everything goes well. No matter i Debug this program in both of the Ram(Sram, SDram) , or i download the .elf to the FLASH and let the program start from FLASH, the LED program runs pretty well. BUT, when i start a new project HELLO WORLD, the main is the entry , trouble comes out!! (This HELLO WORLD project can only print a string "HELLO" using the stdout. ) The compile process finishes without any error. But after i press the DEBUG button, the program seems keeping "running" without stop in the Main function. And the "Step into, Step over, Step run" icon is gray that can't be pressed. I just wonder where is the current PC. So i press the "Suspend" button. The PC jump between alt_irq.h and alt_irq_handler.c over and over. In detail, the PC always jump from this section below in alt_irq.h static ALT_INLINE alt_u32 ALT_ALWAYS_INLINE alt_irq_pending (void) { alt_u32 active; NIOS2_READ_IPENDING (active); return active; } to this section below in alt_irq_hander.c void alt_irq_handler (void) { alt_u32 active; alt_u32 mask; alt_u32 i; /* * Notify the operating system that we are at interrupt level. */ ALT_OS_INT_ENTER(); /* * Obtain from the interrupt controller a bit list of pending interrupts, * and then process the highest priority interrupt. This process loops, * loading the active interrupt list on each pass until alt_irq_pending() * return zero. * * The maximum interrupt latency for the highest priority interrupt is * reduced by finding out which interrupts are pending as late as possible. * Consider the case where the high priority interupt is asserted during * the interrupt entry sequence for a lower priority interrupt to see why * this is the case. */ active = alt_irq_pending (); do { i = 0; mask = 1; /* * Test each bit in turn looking for an active interrupt. Once one is * found, the interrupt handler asigned by a call to alt_irq_register() is * called to clear the interrupt condition. */ do { if (active & mask) { alt_irq.handler(alt_irq.context, i); break; } mask <<= 1; i++; } while (1); active = alt_irq_pending (); } while (active); /* * Notify the operating system that interrupt processing is complete. */ ALT_OS_INT_EXIT(); } and once go over the if(active & mask) in loop do { if (active & mask) { alt_irq.handler(alt_irq.context, i); break; } mask <<= 1; i++; } while (1); the next time will go into the if(active & mask) and break. and now the pc return to the section i mentioned first time in alt_irq.h static ALT_INLINE alt_u32 ALT_ALWAYS_INLINE alt_irq_pending (void) { alt_u32 active; NIOS2_READ_IPENDING (active); return active; } So, here comes out a infinite loop. And the program will never go to the Main() function. Why? And how to fix it? I would like to offer some information further more. 1). The SDRAM, SRAM, FLASH works! Because in the HELLO_LED program, i let the program located in the SDRAM, SRAM and the program can run. 2). This situation is not all along. I mean the HELLO_WORLD program did work in the first time i debug it. But from i debug it in the next day till now, it is dead. Please give me some advice, or solution. I will reply the information you needed as soon as possible. Thanks all of U. http://forum.niosforum.com/work2/style_emoticons/<#EMO_DIR#>/smile.gif http://forum.niosforum.com/work2/style_emoticons/<#EMO_DIR#>/smile.gif Kevin.Lee