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
この動作の理由は何ですか?