問題
Flash で必要なパターンのアドレスを返す関数を使用しているときに、Flash メモリからデータを取得できません (以下の例では、1 つの定数のみ: PATTERN_P で簡略化されています)。
説明前のコード
タイプpatternp
は次のように定義されます。
typedef prog_uchar patternp[NUM_ROWS];
グローバル PATTERN_P 変数は、型 patternp の配列であり、次のように定義されます。
const patternp PATTERN_P PROGMEM = {
0b11110000 ,
0b10010000 ,
0b10010000 ,
0b10010000 ,
0b11110000 ,
0b10000000 ,
0b10000000 ,
0b10000000
};
getpattern():
const patternp * getPattern()
{
//...
return &PATTERN_P;
}
主要():
const patternp *bufferPattern = getPattern();
uint8_t rowPatternData[NUMBER_ROW_PER_MATRIX];
const patternp *bufferPattern = getPattern(s[iLetter]);
for(int iRow = 0; iRow<NUMBER_ROW_PER_MATRIX; iRow++)
{
rowPatternData[iRow]=pgm_read_byte( &PATTERN_P[iRow] ); // <--- WORK!
rowPatternData[iRow]=pgm_read_byte( bufferPattern[iRow] ); // Not Working!
}
説明
ご覧のとおり、コードはパターンを取得します (この例では、フラッシュ メモリからデータを取得するために pgm_read_byte を使用するよりも、毎回 PATTERN_P を返します。これは AVR pgmspace (以下のリンク) を使用します)。上記のコードは、テンプレート &PATTERN_P[iRow] の直接アクセスを使用すると機能しますが、bufferPattern[iRow] または &bufferPattern[iRow] を使用すると機能しません。
参考:pgm_read_byteはpgmspaceに定義されています