2016-12-15 7 views
2

私は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を試してみて、まったく同じ結果を得ました。そのため、問題はハードウェア障害ではないようです。

ご協力いただければ幸いです!ありがとうございました。

答えて

0

私は自分の問題を解決しました。私はこれが他の人にとってどれほど役に立つのかよく分かりませんが、1バイトまたは3バイト境界でメモリを読み込んでいたためにクラッシュが発生しました。これは、ARM Cortex M0 +プロセッサフ​​ァミリでは許可されていません。

この記事では、要件に対応するメモリを理解する上で非常に有用だった:

http://www.sumidacrossing.org/Musings/files/160606_Memory_and_the_Arduino.php

私は、実際の問題を解決するためにAdaFruitからの提案を使用:

https://learn.adafruit.com/adafruit-feather-m0-wifi-atwinc1500/adapting-sketches-to-m0#aligned-memory-access

基本的に私が交換違反行:

uint16_t word = *(data + ii); 

これには:

uint16_t word; 
memcpy(&word, &(data[ii]), 2); 
関連する問題