0

そのため、多次元の CHAR 配列を Arduino のプログラム メモリに格納しようとしていますが、それを機能させるのに問題があります。これが私が持っているものです...

typedef unsigned char RGBBitmap[8][8][3];
typedef prog_uchar ProgRGBBitmap[8][8][3]; // Have to use prog_uchar for stuff stored in progmem

ProgRGBBitmap Mailbox[3] PROGMEM = 
{
    ... // some initializing data
};

PROGMEM のドキュメントによると、ポインタを char データに戻すには、pgm_read_word 呼び出しを使用する必要があります。しかし、これを使って読み戻そうとすると...

RGBBitmap * pMailbox0 = (RGBBitmap*)pgm_read_word( &Mailbox[0] );

...私が返すのはゴミだけです。

PROGMEM 行をドロップし、RGBBitmap ポインターでのみ動作し、pgm_read_word をドロップすると、動作しますが、それは RAM 内にあり、私は外に出ています。

それで、私はここで何が欠けていますか?

4

1 に答える 1

0

配列は値のブロックです。このように、コードは値の連続ブロックを定義しています:

ProgRGBBitmap Mailbox[3] PROGMEM = {...};
... removing typedef is same as ...
prog_uchar Mailbox[3][8][8][3] = {...};

したがって、ポインターはそこに格納されていないため、プログラム メモリからポインターを読み取ることはできません。ブロックはすべてucharのものです。

すべての値はバイトであるため、そのブロックから値を読み取るには、次のようにします。

uc = (uchar)pgm_read_byte( someaddress );

ここで、4 次元配列のトリッキーな部分は、アドレス構文を正しく取得することです。

uc = (uchar)pgm_read_byte( &Mailbox[i][x][y][c] );

コンパイラは [i]...[c] にポインター演算を挿入しますが、これはループ内で無駄になる可能性があります。したがって、ポインターの一部を事前に計算できます。これは、達成しようとしている場所だと思います。このようなものは、いくつかのコードとクロックティックを節約します:

ProgRGBBitmap* ptrOneBox = &(Mailbox[i]);  // this will be pointer into block
for(x ...
  for(y ....
    uc = (uchar)pgm_read_byte( &(ptrOneBox[x][y][c]) ); // this indexes out one byte

ポインターと配列は、機能しないと頭がおかしくなることがあります。デバッガーのないプラットフォームで PROGMEM を投入します...

問題を単純なケースに落とし込み、元に戻します。

于 2014-08-30T02:27:02.253 に答える