2

問題

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に定義されています

4

2 に答える 2

4

bufferPattern は配列へのポインタです。bufferPattern[iRow] を記述すると、これは patternp のエントリ iRow へのポインタとして評価されません。[] 操作は、ポインターが指す配列ではなく、ポインターに対して作用します。あなたが書きたいと思われるのは &((*bufferPattern)[iRow]) です。

それは当面の問題を解決します。ただし、コードは少しわかりにくいです。配列を直接渡すことでコードが単純化される可能性があります (C は配列を値で渡さないため、配列をコピーしません。これを回避するために配列へのポインターを作成する必要はありません)。

于 2009-04-18T19:14:34.140 に答える
1

これ

&PATTERN_P[iRow]

&(PATTERN_P[iRow])

あなたの作業行がこれを与えるとき:

(&PATTERN_P)[iRow]
于 2009-04-18T19:21:14.233 に答える