S.Soundar Ответов: 0

Получение прерывания Keil UART зависает в функции printf()


Программа зависает в printf ().

void UART0_ISR(void) interrupt 4
{
    if (RI == 1)
    {
            RI = 0;
            TI = 1;
            Count = 444;
            datau[temp] = SBUF;             // Read receive data
            SBUF = 0;// datau[temp];           // Send back same data on uart
            Count=1;
            if(temp < 10)
            {
                temp =temp+1;
            }
            if(temp >10)
            {
                temp=0;
            }
            uartreceive=1;
            Count = 444;
        }
    else TI = 0;
}

void main() {

        AUXR1|=0x00;
        PCON&=0x7F;
        SCON  = 0x50;         // SCON: mode 1, 8-bit UART, enable rcvr
        TMOD&=0xAF;
            TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit reload
        TH1   = 0xFA ;                // TH1:  reload value for 1200 baud @ 16MHz
            TR1   = 1;                  // TR1:  timer 1 run
            TI    = 1;                  // TI:   set TI to send first char of UART
        ES = 1;                             // Enable serial interrupt
        EA = 1;
        Count=123;
        temp=0;
    while(1)
    {
        Delay_ms(100);
        Count=102;
        printf("sss\n %u",Count); //My program is getting hangs here

        if(uartreceive==1)
        {
            uartreceive=0;
            Count=4;
            printf("Entire array is %s  %u\n",datau,temp);
            Count=105;
            printf("\nindex  %u %c  %c\n",temp,datau[0],datau[1]);
            Count=106;
            sprintf(datau," ");
            Count=107;
            temp=0;
            uartreceive=0;
            Count=104;
        }

        }
     }


Что я уже пробовал:

Я пытаюсь общаться с ПК с помощью UART. Он работает, но застрял в функции printf () внутри цикла while. Я не знаю, что это ошибка, которую я сделал.

barneyman

вы находитесь в середине процедуры прерывания обслуживания-вы должны выйти как можно быстрее и не делать никаких блокирующих вызовов

поместите данные в заранее выделенный буфер, и пусть другой, обычный поток что-нибудь с ними сделает

S.Soundar

Я проверил, сэр. Но прерывание работает нормально. Если я выну функцию Delay_ms(100), она будет работать нормально. Но если я использую задержку, программа зависает на printf ().

Вот мой код функции задержки:

void Delay_us(unsigned int us_count)
{
while (us_count!=0)
{
us_count--;

}
}

void Delay_ms(unsigned int ms_count)
{
while (ms_count!=0)
{
Delay_us(550); / / delay_us вызывается для генерации задержки 1 мс
ms_count--;
Кол-во=ms_count;
}

}

barneyman

вам нужна какая - то форма блокировки чтения/записи в этом буфере данных-в настоящее время он может измениться во время обхода printf


[no name]

Ли Е использовать UART для связи с хост-компьютера?

S.Soundar

Да, побрякушки.

[no name]

В этом, вероятно, и заключается проблема. Вы взяли на себя ISR UART.
Если устройство имеет два UART - используйте один для отладки / трассировки через printf, а другой-для вашего приложения.

0 Ответов