1
volatile uint32_t * sdramData = (volatile uint32_t *)0x30000100;


#define WIDTH  800


volatile uint32_t * im[WIDTH/4] = (volatile uint32_t **)sdramData;

3行目はエラーが発生した行です。sdramDataの場所から始まるintポインターの配列を作成しようとしています。無効な初期化エラーを言っています。助けてくれてありがとう。

4

2 に答える 2

1

イニシャライザ表記は中かっこで囲む必要があり、中かっこ内の値は定数である必要があります。

volatile uint32_t * im[WIDTH/4] = { sdramData };

これにより、配列の最初の要素がsdramData定数の場合(用語の意味の範囲外)に初期化され、他の要素はゼロのままになります。

本当に200個の連続した4バイトの場所が必要な場合(これについては疑問があります。以下を参照)、リストを初期化するために200個の値を生成する必要があります(標準Cにはまだ繰り返し回数オプションがないため)悲しいことに、配列初期化子の場合— GCCは拡張機能としてそうします)。

#define SDRAMBASE 0x30000100

#define INIT_x(x)  (SDRAMBASE + (x) * sizeof(uint32_t))
#define INIT_5(x)  INIT_x(x+0), INIT_x(x+1), INIT_x(x+2), INIT_x(x+3), INIT_x(x+4)
#define INIT_10(x) INIT_5(x+0), INIT_5(x+5)
#define INIT_50(x) INIT_10(x+0), INIT_10(x+10), INIT_10(x+20), INIT_10(x+30), INIT_10(x+40)

volatile uint32_t *im[WIDTH/4] =
{
    INIT_50(  0),
    INIT_50( 50),
    INIT_50(100),
    INIT_50(150),
};

きれいではありませんが、多くのタイピングを節約できます。(volatile uint32_t *)必要に応じて、拡張にキャストを挿入できINIT_xます—おそらくそうします。


別の解釈

一方、おそらく、SDRAMBASEを使用して配列なしでジョブを実行する式を記述できますim

#define im_ARRAY(i)  (*(volatile uint32_t *)(SDRAMBASE + (i) * sizeof(uint32_t)))

今、あなたは書くことができます(正方形の代わりに丸括弧):

uint32_t x = im_ARRAY(43);

それ以外の:

uint32_t x = im[43];

実際、次のものを使用することもできます。

#define im_ARRAY   ((volatile uint32_t *)SDRAMBASE)

そして、あなたは書くことができます(いつものように角かっこ):

uint32_t x = im_ARRAY[43];

これは、望ましい効果としてより妥当に見えます。それでも完全に良いわけではありませんが、比較的きれいです。

于 2012-10-16T23:31:10.277 に答える
0

あなたが求めているのは次のようなものである可能性があります。

volatile uint32_t (*im)[4] = (volatile uint32_t (*)[4])sdramData;

sdramData少なくともWIDTHuint32_t値を指している場合、これはim[0..WIDTH/4 - 1][0..3]有効なアクセスを行います。

于 2012-10-17T00:10:30.657 に答える