This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

printf data abort - (again)

Hello,

I've problems with the printf() routine. I receive frames over the ethernet in a very short intervall. If I received a frame I set a flag in the ISR.

void ethernet_interrupt(void) __irq
{
        unsigned int status;
        AT91PS_EMAC pEmac = AT91C_BASE_EMAC;

        status = pEmac->EMAC_ISR;

        if (status & AT91C_EMAC_RCOM)                               /* Receive complete */
                Emac_Receive++;

        // clear receive status register
        pEmac->EMAC_RSR  &= ~(AT91C_EMAC_OVR | AT91C_EMAC_REC | AT91C_EMAC_BNA);
        AT91C_BASE_AIC->AIC_EOICR = 0;                               /* End of ISR */

}

In the main routine I ask if the flag is set -> if it is set, I use printf() to see via the usart that I get a new frame...

printf("h");

The problem is that I always get a data abort within the printf() routine..

Could it be that the ethernet frames came to close together (in a short time) so that the printf() routine has not finish to transmit the last character?

And after the ISR the printf() routine don't know what to do / what to send -> data abort??

If the printf-argument is much bigger - it is often so that I only can transmit one or two letter - but not the whole word...

e.g.

printf("hello world\n");

I only transmit "hel" - that's all...

best regards
Johannes

Parents Reply Children
  • I installed a variable i and insert a dummy instruction.

    Which register show me if I use nonexisting memory?

    R14(LR) = 0x10000890

    I have a external flash memory (16MB) from the base address 0x10000000.

    best regards
    Johannes

  • Just write something like:

    if (COM1_1 != AT91C_BASE_US1) {
        dummy_instruction;
    }
    

    And then set a breakpoint inside the if statement. If something has overwritten the COM1_1 pointer, then the debugger will stop at the breakpoint - before the data abort trap happens.

  • now I wrote:

    int COM1_1_sendchar(int ch)
    {
            unsigned int i=0;
    
            if (ch == '\n')  {                              /* Check for CR */
            while (!(COM1_1->US_CSR & AT91C_US_TXRDY));      /* Wait for Empty Tx Buffer */
            COM1_1->US_THR = '\r';
    
            if (COM1_1 != AT91C_BASE_US1) {
                    i++;
    }
    
            }
            while (!(COM1_1->US_CSR & AT91C_US_TXRDY));      /* Wait for Empty Tx Buffer */
            return (COM1_1->US_THR = ch);                        /* Transmit Character */
    }
    

    But the if-statement is never true - so I still have a data abort but the breakpoint (i++) was never reached.

    Johannes

  • Didn't you show the failure point a couple of lines before the point where you added the test?

    Do you think you should test if the pointer is valid before - or after - the point where you know that your application fails?

    What do you think your probabilities are of reaching this if statement, if the application has already failed?

  • code:

    init_usart();
    init_timer();
    init_ethernet();
    printf("ethernet init done\n"); //<- works

    while(1)
    { if(Emac_Receive >=1) // flag-bit set in ISR ethernet { printf("new frame\n"); //<- problem

    Emac_Receive--; }
    }

    Johannes