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
  • You often post code that doesn't match your descriptive text - or text that doesn't match your code.

    Can we be sure that you really check if the UART is ready before you insert the character? The '\n' part is special, since you make two inserts in your function.

    If the first insert (the '\r') is done before the UART is ready, it may/will kill the character directly before the '\n' in the input string.

Reply
  • You often post code that doesn't match your descriptive text - or text that doesn't match your code.

    Can we be sure that you really check if the UART is ready before you insert the character? The '\n' part is special, since you make two inserts in your function.

    If the first insert (the '\r') is done before the UART is ready, it may/will kill the character directly before the '\n' in the input string.

Children