[ad_1]
プログラムが printf() でハングします。
void UART0_ISR(void) interrupt 4 { if (RI == 1) { RI = 0; TI = 1; Count = 444; datau = SBUF; // Read receive data SBUF = 0;// datau; // 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を使用してPCから通信しようとしています。 動作していますが、while ループ内の printf() 関数でスタックします。 私が犯した間違いが何なのか分かりません。
解決策 1
UART 割り込みルーティングを TI = 0 に設定すると、printf がクラッシュします。クラッシュを避けるために、sprintf 以下の uart_sendstring を使用して printf を置き換えます。 UART 割り込みルーティングで TI = 0 を設定しなかった場合、UART ボーレートの周波数で UART 割り込みが継続的に発生し、多数の UART 割り込みの処理に CPU の計算能力が浪費されます。
uint8_t xdata pbf[100];
sprintf(pbf, “\033[2J\033[H”);
uart_sendstring(pbf, strlen(pbf));
//—————————————————————
void Send_Data_To_UART0 (UINT8 c)
{
TI = 0;
SBUF = c;
while(TI==0);
}
//—————————————————————
void uart_sendstring(uint8_t* s, uint8_t cont)
{
while (cont) {
Send_Data_To_UART0(*s++);
cont–;
}
}
[ad_2]
コメント