4

リモート温度センサーから温度データを受信するために、xbee に接続された STM32f4 ディスカバリー ボードを使用しています。使用されるコードは、CMIS UART サンプル コードです。パケットデータを1バイトずつ受信します。つまり、UART 受信割り込みは、各バイトが受信されるたびに呼び出されます。完全なパケットを取得したら、温度データをコピーします。私の UART コールバック関数は問題なく動作します。しかし、数時間後、UART 受信割り込みが機能しなくなり、UART は何も受信できなくなります。ただし、UART 送信は引き続き機能します。ボーレート 115200 の UART1 を使用しています。UART 割り込み優先度を 0 に設定しましたが、この優先度を共有する割り込みは他にありません。他のすべての割り込み優先度は UART よりも低くなります。UART 割り込みがトリガーを停止する理由を教えてください。

#define PACKET_DELIMETER 0x7E

uint8_t g_frame_ok=0; //flag to indicate complete packet received
uint8_t g_index_of_aoBuf=0; //Index of receive buffer
uint8_t g_aoBuf_of_xbee[100]={0};//Receive Buffer
uint8_t r_byte=0; //Receiving byte 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *allUartHandle)
{
 __HAL_UART_FLUSH_DRREGISTER(allUartHandle); 

 if(HAL_UART_Receive_IT(allUartHandle, (uint8_t *)&r_byte, 1) == HAL_OK) //Interrupt occurs when each byte arrives
 {
    if(r_byte==PACKET_DELIMETER)
    {
        //start receiving packet
    }
    if( g_index_of_aoBuf>=g_aoBuf_of_xbee[2]+4)
    {
        g_frame_ok=1;
        BSP_LED_On(LED4);
    }           
   }
 }
4

2 に答える 2

3

コールバック関数と残りのプログラムの間で共有される変数は、コンパイラがコードを誤って最適化するのを防ぐために、volatile として宣言する必要があります。

また、そのような変数への書き込みと読み取りがアトミックであることを確認するか、セマフォで保護する必要があります。そうしないと、競合状態のバグが発生する可能性があります。

これら 2 つの古典的なバグのいずれかまたは両方が、説明した問題を引き起こす可能性があります。どちらも、再現が困難な断続的で予期しない動作を引き起こす傾向があります。

また、CPU が許可する場合は、割り込みイネーブル レジスタへの書き込みアクセスでトリガーされるブレークポイントを設定し、トレースを確認します。

于 2015-07-01T11:25:39.173 に答える