1

ATmega 328p (Arduino イーサネット) を使用して Wiznet W5100 イーサネット コントローラーを制御しようとしています。私が使用しているライブラリはテスト済みで動作しますが、私にとってはそうではありません。問題を追跡したのは次のとおりです。

W5100 が受信したデータのバイト数を示す 2 つのレジスタを読み取ろうとしています。

uint16_t readTest() 
{
    uint16_t res = W5100.read(0x0426);
    res = (res << 8) + W5100.read(0x0427);
    return res;                                             
}

しかし、データを送信していないにもかかわらず、main() から呼び出されたこの関数は、0 ではなく 1024 を返します。ここで奇妙な部分が発生します。静的キーワードを次のように追加すると、次のようになります。

static uint16_t readTest() 
{
    uint16_t res = W5100.read(0x0426);
    res = (res << 8) + W5100.read(0x0427);
    return res;                                             
}

その後、関数は想定どおりに突然 0 を返します。また、次のように変更することもできます。

uint16_t readTest() 
{
    return (W5100.read(0x0426) << 8) + W5100.read(0x0427);
}

これは、コンパイラが私をいじっているに違いありません。私は本当にそれを取得しません。コンパイルするには、標準の Arduino IDE を使用します。コマンドは次のようになります。

avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=22 -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/libraries/SoftwareSerial -I/home/xc317/sketchbook/libraries/serlcd -I/usr/share/arduino/libraries/SPI -I/usr/share/arduino/libraries/Ethernet -I/usr/share/arduino/libraries/Ethernet/utility /usr/share/arduino/libraries/Ethernet/Server.cpp -o/tmp/build1305752250561284982.tmp/Ethernet/Server.cpp.o

この動作の理由は何ですか?

4

0 に答える 0