2017-03-10 11 views
-1

私は、TIのチップで実行するコードを書いていますし、私のコードは、それは本当に問題でUART_readが何をdoesntの次のコード動的割り当てstucks

UChar* message; 
UChar* tempMessage; 
message = malloc(bytesOfMessage * sizeof(UChar)); 
int i = 0; 
while(true) 
{ 
    int rxBytes = UART_read(handle, rxBuf, 1); 

    //System_printf("%d \n", rxBuf[0]); 
    if(rxBuf[0] != 13) 
    { 
     message[i] = rxBuf[0]; 
     i++; 
     int l = 1; 

     if(i == bytesOfMessage) 
     { 
      System_printf("first Message: \n"); 
      for(l=0;l<bytesOfMessage;l++) 
      { 
       //System_printf("%c",message[l]); 
      } 
      System_printf("End of first Message\n"); 

      bytesOfMessage += 10; 
      //message = realloc(message, bytesOfMessage * sizeof(UChar)); 


      tempMessage = (UChar*)realloc(message, bytesOfMessage * sizeof(UChar)); 
      message = tempMessage; 
      tempMessage = NULL; 


      System_printf("Message2 %d: \n", bytesOfMessage); 
      for(l=0;l<bytesOfMessage;l++) 
      { 
       //System_printf("%c", message[l]); 
      } 
      System_printf("End of second Message\n"); 
     } 
     UART_write(handle, rxBuf, rxBytes); 
    } 
    else 
    { 
     rxBuf[0] = '\r'; 
     rxBuf[1] = '\n'; 
     rxBuf[2] = 'n'; 
     rxBuf[3] = 'e'; 
     rxBuf[4] = 'w'; 
     UART_write(handle, rxBuf, 5); 
    } 
} 

の間に立ち往生。

ただし、重要なことはrealloc機能です。

初めてこのコードにアクセスすると問題なく動作します。 しかし、それはちょうど立ち往生する2回目。 正常に動作するはずのコードで、問題はチップまたはオペレーティングシステムにありますか?

+0

malloc&coを使用したTiチップ。 ....... – LPs

+0

とにかく 'tempMessage'の背後にある理由は、' message(メッセージ) 'を上書きする前に' if(tempMessage!= NULL) 'をチェックすることです... – LPs

+1

Wordは賢明に言えば、 alloc'コールを呼び出します。また、 'realloc'の結果をテストしない場合は、一時変数には何の意味もありません。 – KevinDTimm

答えて

0

私は、コード全体を投稿するべきだと思います。 最初のループの前に "byteOfMessage"というサイズのメッセージバッファーを割り当てます。 しかし、最初のループでは、メッセージをより大きいサイズ(+10)で再割り当てします。 これはうまくいくかもしれませんが、システムが10バイト以上割り振ることができない場合はいつかできません。 したがって、realloc後にtempMessageをテストするようにしてください。 NULLになる可能性があります。

以下のコードは動作するはずです:

UChar* message; 
UChar* tempMessage; 
message = malloc(bytesOfMessage * sizeof(UChar)); 
int i = 0; 
while (true) 
{ 
    int rxBytes = UART_read(handle, rxBuf, 1); 

    //System_printf("%d \n", rxBuf[0]); 
    if (rxBuf[0] != 13) 
    { 
     message[i] = rxBuf[0]; 
     i++; 
     int l = 1; 

     if (i == bytesOfMessage) 
     { 
      System_printf("first Message: \n"); 
      for (l = 0; l<bytesOfMessage; l++) 
      { 
       //System_printf("%c",message[l]); 
      } 
      System_printf("End of first Message\n"); 

      bytesOfMessage += 10; 

      tempMessage = (UChar*)realloc(message, bytesOfMessage * sizeof(UChar)); 
      if (tempMessage == NULL) 
      { /* system can't realloc more bytes */ 
       tempMessage = malloc(bytesOfMessage * sizeof(UChar)); 
       memcpy(tempMessage, message, bytesOfMessage - 10); 
       free(message); 
      } 
      message = tempMessage; 
      tempMessage = NULL; 


      System_printf("Message2 %d: \n", bytesOfMessage); 
      for (l = 0; l<bytesOfMessage; l++) 
      { 
       //System_printf("%c", message[l]); 
      } 
      System_printf("End of second Message\n"); 
     } 
     UART_write(handle, rxBuf, rxBytes); 
    } 
    else 
    { 
     rxBuf[0] = '\r'; 
     rxBuf[1] = '\n'; 
     rxBuf[2] = 'n'; 
     rxBuf[3] = 'e'; 
     rxBuf[4] = 'w'; 
     UART_write(handle, rxBuf, 5); 
    } 
} 

また、あなたのコードをきれいにする必要があります。 幸運。

関連する問題