5

私は奇妙な結果をもたらす非常に単純な C コードを持っています。Micaz モート用の単純なワイヤレス センサー ネットワーク アプリケーションを開発しています。ATmega128L 8 ビット AVR マイクロプロセッサを搭載しているようです。コードの作成とコンパイルには AVR スタジオを使用しています。

uint16_t myvariable;
uint16_t myresult;
myresult = myvariable*256;

myvariable が 3 のとき、myresult が常に 512 にリセットされることがわかりました。私の推測では、そのようなリテラル数 256 と uint16_t の混合が魔法のように問題を引き起こしているのです。しかし、理由はわかりません。誰かがこれについて詳細な説明をしてもらえますか? どんな助けにも感謝します!

より詳細なソースコードは次のとおりです。

static uint16_t myvariable[2];
static uint8_t AckMsg[32];
uint16_t myresult[MAX_SENDERS];

void protocol()  
{           
    if(thisnodeid != 5){   // sender nodes
      while (1)
      {         
        if(AckReceived && !MsgSent) {
          // If ACK received and a new message not sent yet,
          // send a new message on sending node.
        }

        else if(!AckReceived && MsgSent)
        {
            lib_radio_receive_timed(16, 32, AckMsg, 120);
            myvariable[0] = AckMsg[0];
            myvariable[1] = AckMsg[1];
            // Bug!!!, variable overflowed.
            myresult[thisnodeid] = 256*myvariable[1] + myvariable[0];  
        }

      }
    }           

}

私が本当に理解したいのは、コンパイラが次のコード行をどのようにコンパイルするかということです。これは、このコード行がバグの原因であることを知っているからです。事前に情報をありがとう!

myresult[thisnodeid] = 256*myvariable[1] + myvariable[0]; 

myvariable[1]=3、myvariable[0]=0 の場合、常に myresult[] = 512 になります。768 が常に 512 にリセットされるように見えます。理由はわかりません。

4

1 に答える 1

1

標準システムで問題なくこのコードを試しました:

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#define MAX_SENDERS 10
static uint16_t myvariable[2];
static uint8_t AckMsg[32];
uint16_t myresult[MAX_SENDERS];
main()
{
    AckMsg[0] = 0;
    AckMsg[1] = 3;
    myvariable[0] = AckMsg[0];
    myvariable[1] = AckMsg[1];
    myresult[0] = 256*myvariable[1] + myvariable[0];  
    printf("%d", (int)myresult[0]);
}

したがって、コードをデバッグするには、次の行を置き換えてみてください。

myvariable[0] = AckMsg[0];
myvariable[1] = AckMsg[1];
// Bug!!!, variable overflowed.
myresult[thisnodeid] = 256*myvariable[1] + myvariable[0]; 

に :

uint16_t tmp;
myvariable[0] = AckMsg[0];
myvariable[1] = AckMsg[1];
tmp = 256*myvariable[1] + myvariable[0]; 
myresult[thisnodeid] = 256*myvariable[1] + myvariable[0]; 
printf("%d %d\n", (int)(AckMsg[0]), (int)(AckMsg[1]));
printf("%d %d\n", (int)(thisnodeid), (int)(MAX_SENDERS));
printf("%d %d\n", (int)(myvariable[0]), (int)(myvariable[1]));
printf("%d %d\n", (int)(tmp), (int)(myresult[thisnodeid]));

これにより、問題の原因に関する有用な情報が得られる場合があります。

デバッガーで何かを印刷できない場合は、次のことを試すことができます。

uint16_t i = 0;
uint16_t n = 255;
myresult[thisnodeid] += myvariable[1];
while (i != n) {
    myresult[thisnodeid] += myvariable[1];
    i += 1;
}
myresult[thisnodeid] += myvariable[0]; 

遅くなりますが、255 を超える唯一の変数はmyresult.

于 2013-07-12T18:44:26.620 に答える