私はATSAMW25チップを搭載したArduino MKR1000を持っており、私のコードでクラッシュバグをデバッグしようとしています。特定のアドレスでフラッシュリードがクラッシュするATSAMW25
これは問題の関数である:あなたがこれはフラッシュ・メモリ・ロケーションである出力から
Drawing 8AB1 (267, 14; 300, 41)
8AB1[0] =
を見ることができるようdata
からの読み取り
void GuiDisplay::drawBitmap(rect_t frame, const uint16_t *data, rgb565_filter filter) {
point_t origin = adjustPoint(frame.origin, _origin);
uint16_t x = origin.x;
uint16_t y = origin.y;
tft->setAddrWindow(x, y, x + frame.width() - 1, y + frame.height() - 1);
Serial.print("Drawing "); Serial.print((unsigned int)data, HEX); Serial.print(" ("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.print("; "); Serial.print(x + frame.width() - 1); Serial.print(", "); Serial.print(y + frame.height() - 1); Serial.println(")");
for (int ii = 0; ii < frame.width() * frame.height(); ii++) {
Serial.print(" "); Serial.print((unsigned int)data, HEX); Serial.print("["); Serial.print(ii); Serial.print("] = ");
uint16_t word = *(data + ii);
Serial.println(word);
tft->pushColor(word);
}
Serial.println("Done");
}
は、クラッシュの原因となります。 ATSAMW25は宣言を必要とせず、ただconst
です。
私が困惑しているのは、一部のメモリ範囲では失敗するように見えるだけです。
// Header
typedef struct bitmap_data_def {
size_tt size;
uint8_t count;
const byte *data;
} bitmap_data_t;
extern const bitmap_data_t projector_bitmap;
extern const bitmap_data_t power_bitmap;
extern const bitmap_data_t slides_bitmap;
extern const bitmap_data_t camera_bitmap;
... and so on.
// CPP file
const byte power_bitmap_data[] = { [very long string!] }
const bitmap_data_t power_bitmap = {
size_tt(26, 26),
1,
power_bitmap_data
};
彼らはすべて同じファイルで宣言されており、それらのほとんどが正常に動作:ように
Drawing 86A0 (199, 193; 224, 212)
86A0[0] = 0
86A0[1] = 65535
... and so on ...
86A0[519] = 0
Done
Drawing AB44 (199, 133; 224, 151)
AB44[0] = 0
AB44[1] = 38034
... and so on ...
AB44[493] = 0
Done
と私はこのような定義の数を持っています。
これまでのところ、0x8A00と0x8B00の間のメモリ位置と0x95BD周辺の位置のクラッシュが発生しています。上記からわかるように、これらの上下のメモリ位置は正常です。
宣言の一部を追加または削除して、コンパイラがそれらをメモリ内で並べ替えるようにすると、別の宣言が失敗します。それはクラッシュの原因となる上記のメモリ範囲内のいずれかに該当する可能性があります。
プログラムのメモリがどのように上書きされているかわかりませんが、読み込み中にクラッシュしてはいけません。私が逃した微妙なメモリコピーがありますか?そうであれば、32KBのSRAMの限界を超えているかもしれませんが、どこで/どのように起こるのかわかりません。
私は別のMKR1000を試してみて、まったく同じ結果を得ました。そのため、問題はハードウェア障害ではないようです。
ご協力いただければ幸いです!ありがとうございました。