Мой код
в основной программе
Uart0PutChar(0x30); прерывание проходит
Uart0PutStr("qwe"); тут как карта ляжет, программа зацикливается
....
while(*str){
Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {} // программа зацикливается
Как я понимаю, происходит изменение указателя а в это время возникает прерывание на TX и указатель Uart0Tx.PtrRdByte принимает значение Uart0Tx.PtrWrByte
-----------------------------------------
Модуль Uart.c
Код
#pragma vector=USART0TX_VECTOR
__interrupt void irq_Uart0_Tx(void)
{
if (Uart0Tx.PtrWrByte != Uart0Tx.PtrRdByte){
Uart0Tx.PtrRdByte = ++Uart0Tx.PtrRdByte & UART_BUFFER_MASK;
TXBUF0 = Uart0Tx.Buffer[Uart0Tx.PtrRdByte];
} //
else{
//
// флаг на завершение Tx и необходимости переключится на прием
//
// if (EventFlags & fwRxWaitTime){
// //bSwitchTxToRx = 1; // EventFlags |= fwSwitchTxToRx;
// pRS485Tx = 0; // приемопередатчик на Rx
// }
}
#pragma vector=USART0RX_VECTOR
__interrupt void irq_Uart0_Rx(void)
{
volatile char dummy;
unsigned char RxData;
if ( FE+PE+OE+BRK+RXERR ){ // overflow or framing error -
URCTL1 &= ~ (FE+PE+OE+BRK+RXERR); // Clear error flags
dummy = RXBUF0; // dummy read to clear RXE flag
}
else{
RxData = RXBUF0; // Read the received data
if ((Uart0Rx.PtrWrByte + 1) != Uart0Rx.PtrRdByte){
Uart0Rx.PtrWrByte = ++Uart0Rx.PtrWrByte & UART_BUFFER_MASK;
Uart0Rx.Buffer[Uart0Rx.PtrWrByte] = RxData;
}
}
}
void Uart0PutChar(unsigned char TxData)
{
Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {
//
// Сброс сторожевого таймера
//
} // Wait for incomming data
Uart0Tx.Buffer[Uart0Tx.PtrWrByte] = TxData;
if ((IFG1 & UTXIFG0) != UTXIFG0) // UART0_ENABLE_TX_INTERRUPT;
IFG1 |= UTXIFG0;
}
void Uart0PutStr(unsigned char *str)
{
// while(*str) Uart0PutChar(*str++); //*s++=Tmpchar;
while(*str){
Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {} // Wait for incomming data
Uart0Tx.Buffer[Uart0Tx.PtrWrByte] = *str++;
if ((IFG1 & UTXIFG0) != UTXIFG0) //UART0_ENABLE_TX_INTERRUPT;
IFG1 |= UTXIFG0;
}
}
__interrupt void irq_Uart0_Tx(void)
{
if (Uart0Tx.PtrWrByte != Uart0Tx.PtrRdByte){
Uart0Tx.PtrRdByte = ++Uart0Tx.PtrRdByte & UART_BUFFER_MASK;
TXBUF0 = Uart0Tx.Buffer[Uart0Tx.PtrRdByte];
} //
else{
//
// флаг на завершение Tx и необходимости переключится на прием
//
// if (EventFlags & fwRxWaitTime){
// //bSwitchTxToRx = 1; // EventFlags |= fwSwitchTxToRx;
// pRS485Tx = 0; // приемопередатчик на Rx
// }
}
#pragma vector=USART0RX_VECTOR
__interrupt void irq_Uart0_Rx(void)
{
volatile char dummy;
unsigned char RxData;
if ( FE+PE+OE+BRK+RXERR ){ // overflow or framing error -
URCTL1 &= ~ (FE+PE+OE+BRK+RXERR); // Clear error flags
dummy = RXBUF0; // dummy read to clear RXE flag
}
else{
RxData = RXBUF0; // Read the received data
if ((Uart0Rx.PtrWrByte + 1) != Uart0Rx.PtrRdByte){
Uart0Rx.PtrWrByte = ++Uart0Rx.PtrWrByte & UART_BUFFER_MASK;
Uart0Rx.Buffer[Uart0Rx.PtrWrByte] = RxData;
}
}
}
void Uart0PutChar(unsigned char TxData)
{
Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {
//
// Сброс сторожевого таймера
//
} // Wait for incomming data
Uart0Tx.Buffer[Uart0Tx.PtrWrByte] = TxData;
if ((IFG1 & UTXIFG0) != UTXIFG0) // UART0_ENABLE_TX_INTERRUPT;
IFG1 |= UTXIFG0;
}
void Uart0PutStr(unsigned char *str)
{
// while(*str) Uart0PutChar(*str++); //*s++=Tmpchar;
while(*str){
Uart0Tx.PtrWrByte = ++Uart0Tx.PtrWrByte & UART_BUFFER_MASK;
while (Uart0Tx.PtrWrByte == Uart0Tx.PtrRdByte) {} // Wait for incomming data
Uart0Tx.Buffer[Uart0Tx.PtrWrByte] = *str++;
if ((IFG1 & UTXIFG0) != UTXIFG0) //UART0_ENABLE_TX_INTERRUPT;
IFG1 |= UTXIFG0;
}
}