volatile uint32_t * sdramData = (volatile uint32_t *)0x30000100;
#define WIDTH 800
volatile uint32_t * im[WIDTH/4] = (volatile uint32_t **)sdramData;
3行目はエラーが発生した行です。sdramDataの場所から始まるintポインターの配列を作成しようとしています。無効な初期化エラーを言っています。助けてくれてありがとう。
イニシャライザ表記は中かっこで囲む必要があり、中かっこ内の値は定数である必要があります。
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];
これは、望ましい効果としてより妥当に見えます。それでも完全に良いわけではありませんが、比較的きれいです。
あなたが求めているのは次のようなものである可能性があります。
volatile uint32_t (*im)[4] = (volatile uint32_t (*)[4])sdramData;
sdramData
少なくともWIDTH
uint32_t値を指している場合、これはim[0..WIDTH/4 - 1][0..3]
有効なアクセスを行います。