- ベストアンサー
[C言語]変数のアドレスを直接指定する構文
hashioogiの回答
定義が #define PD (*(volatile struct st_pd *)0xFFFF83A0) /* PD Address*/ に場合は、自分が書いたプログラムの中に struct st_pd a ; というようなものがあったとして、 PD = a ; とすれば構造体aの内容を全て書き込めて、 a = PD ; とすれば構造体aに全て読み込める訳です。 定義が #define PD ((volatile struct st_pd *)0xFFFF83A0) /* PD Address*/ となっている場合は *PD = a ; a = *PD ; となるだけの話です。 前者はあたかもPDという構造体の実態がどこかにあるかのようにコーディングできますけど、 後者はプログラマがPDはポインタであるという意識の下にコーディングすることになります。 どちらがプログラマにとって自然に感じられるかということではないでしょうか ?
関連するQ&A
- マイコンのプログラム(C言語)について
マイコンのサンプルプログラムの中に以下のような記述がありました。 ヘッダーファイル内 struct st_hudi { union { unsigned short WORD; struct { unsigned short TI:8; } BIT; }SDIR; }; #define HUDI (*(volatile struct st_hudi *)0xFFFE2000) そして、この構造体の使い方は HUDI.SDIR.WORD = 0; と、いった感じです。 通常は、構造体の宣言(struct st_hudi aなど)を行わないと使えないと思うのですが、以上のプログラムでエラーは出ません。 1.上記のような場合は、構造体の宣言はいらないのでしょうか? 現在は、#defineの部分でアドレスを指定してあるため、構造体の宣言はいらない、という認識を持っています。 2.volatileがなくても動きそうなのですが、これは必要なのでしょうか? アドレスを明記しているため、volatileがなくても正常に動きそうな気がします。 回答よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 共用体のアドレスを取得したい
SH7047のプログラムです。 何をしたいのかと言うと、P_PORTD.PDDRL.BIT.PD4DR等を関数の中で変化させたいのです。 うまく行かない理由はおそらく「P_PORTD.PDDRL.BIT.PD4DRのアドレスは渡すことが出来ない」だとおもいます。 まぁそれも当然な話だと思うのですが、どうにかならないでしょうか? 個人的には「unsigned short* port」→「bit* port」の様に出来れば理想的なのですが。 何か良い方法を教えてください。よろしくお願いします。 #define P_PORTD (*(volatile struct st_portd *)0xFFFF83A2)/* PORTD Address */ struct st_portd { /* struct PORTD */ union { /* PDDRL */ unsigned short WORD; /* Word Access */ struct { /* Bit Access */ unsigned short :7; /* */ unsigned short PD8DR:1; /* PD8DR */ unsigned short PD7DR:1; /* PD7DR */ unsigned short PD6DR:1; /* PD6DR */ unsigned short PD5DR:1; /* PD5DR */ unsigned short PD4DR:1; /* PD4DR */ unsigned short PD3DR:1; /* PD3DR */ unsigned short PD2DR:1; /* PD2DR */ unsigned short PD1DR:1; /* PD1DR */ unsigned short PD0DR:1; /* PD0DR */ } BIT; /* */ } PDDRL; /* */ }; /* */ void main(void) { output(&P_PORTD.PDDRL.BIT.PD4DR,0xff); output(&P_PORTD.PDDRL.BIT.PD5DR,0xff); output(&P_PORTE.PEDRL.BIT.PE12DR,0xff); } void output(unsigned short* port,int data) { P_PORTE.PEIORL.WORD = 0x3fff; P_PORTE.PEDRL.WORD = data & 0xff; *port = 1; *port = 0; P_PORTE.PEIORL.WORD = 0x3f00; }
- ベストアンサー
- C・C++・C#
- secが・・確認お願いできませんか?
秒数が出ないのですがどこが違うのでしょうか? #define TCNT0 (*(volatile unsigned int *)0xffff68) #define GRA0 (*(volatile unsigned int *)0xffff6a) #define GRB0 (*(volatile unsigned int *)0xffff6c) #define TCR0 (*(volatile unsigned char *)0xffff64) #define TIOR0 (*(volatile unsigned char *)0xffff65) #define TIER0 (*(volatile unsigned char *)0xffff66) #define TSR0 (*(volatile unsigned char *)0xffff67) #define TSTR (*(volatile unsigned char *)0xffff60) #define ITU_CLOCK8 3 #define ITU_CLEAR_GRA 32 #define ITU_IE_IMFA 1 #define DI asm( "orc.b #0xc0,ccr" ) #define EI asm( "andc.b #0x3f,ccr" ) void start_itu0(); void int_imia0(void) __attribute__ ((interrupt_handler)); int cnt = 0, sec = 0, min = 0, hour = 0; char str[] = "timer 00:00:00"; int main(void) { lcd_init(); lcd_puts(str); start_itu0(); EI; for(;;) { if (cnt >=100) { cnt = 0; sec++; if (sec >=60) { sec = 0; min++; if (min >= 60) { min = 0; hour++; if (hour >= 24) hour = 0; } str[6] = '0' + hour /10; str[7] = '0' + hour %10; str[9] = '0' + min /10; str[10] = '0' + min %10; str[12] = '0' + sec /10; str[13] = '0' + sec %10; lcd_home(); lcd_puts(str); } } } return 0; }
- ベストアンサー
- C・C++・C#
- C言語 #defineについて
C言語でどの様に考えれば良いか分からない事があるので、教えて下さい。 以下の様な行が出てきたのですが、どういう意味なのでしょうか? #define SYSTEM (*(volatile struct st_system *)0x80000) 現状分かっている事は 1.#define ABC 100 ならこれ以降で出てくるABCは100と読み替える。 2.volatileはコンパイラの最適化を抑制する様な意味。 とい事です。 以上、宜しくお願い致します。
- ベストアンサー
- C・C++・C#
- H8マイコン C言語でのプログラミング *((volatile unsigned char *)ってなんですか??
現在、ある参考書に載っている、マイコンを用いてマザーボード上のLEDを点滅させるCのプログラムを勉強のために見ています。 その中に、 #define P5DDR (*(volatile unsigned char *)0xfffc8) という一行があるんですが、この中の*(volatile unsigned char *)という表現を見たことがなくて困っております。これは簡単に言うと、 #define P5DDR *0xfffc8 と、『P5DDRを0xfffc8のポインタで置き換える』と言い換えていいのでしょうか??
- ベストアンサー
- C・C++・C#
- マイコンH8-3664 走行カー C言語プログラム改良
SW0がONで3秒間前進して停止 SW0がOFFの後、再度ONで3秒間前進して停止 するプログラムです! これを、 3秒間前進後、3秒右旋回(右モーターのみ回転)後、3秒間前進、3秒右旋回を繰り返し、元の位置に戻るというプログラムに改良せよ!というのですが? /**************************************************************/ #include <stdio.h> #include <sysio.h> /*タイマーA*/ #define TMA (*((volatile unsigned char *)0xFFA6) /*割り込み*/ #define IENR1 (*((volatile unsigned char *)0xFFF4)) #define IRR1 (*((volatile unsigned char *)0xFFF6)) #define PDR8 (*((volatile unsigned char *)0xFFDB)) #define PCR8 (*((volatile unsigned char *)0xFFEB)) long count = 0; long x = 0; void interrupt timer( ) { IRR1 &= ~0x40 ; if( count == 300 ) { x = 1 ; count = 0 ; } else { count++; } } void main( ) { unsigned char a; TMA = 0x03 ; IENR1 |= 0x40 ; PCR8 = 0x0f ; while(1){ a = PDR8 >> 4 ; if( x == 0 && a == 0x0e ) { PDR8 = 0x0a ; _ei( ) ; } else if( x == 1 ) [ PDR8 = 0x00; _di( ) : if (( PDR8 >> 4) == 0x0f) { x = 0 ; } } } } /**************************************************************/ 尚、SW はプルアップされている!
- ベストアンサー
- C・C++・C#
- I/Oレジスタアドレスを関数に引数として渡すには?
C言語について質問があるので投稿させていただきました。 現在Renesas製 RXマイコンにてポート制御のプログラムを作成しています。 そこで一点分らない点がありましたのでご教授いただければ幸いです。 現在I/Oポートレジスタの入出力設定を行っています。 レジスタ値を書き換えるだけであれば下記の通りかと思います。 #define PORTA (*(volatile unsigned char *)0x0008C00A) PORTA = 0x01; レジスタアドレスを引数として関数に渡し関数内でレジスタ値を書き換えるにはどうすれば よろしいでしょうか。 void main(void) { setPinMode(PORTA); PORTA.PODR.BIT.B0 = 0x01; while(1); } void setPinMode(uint32_t* portNumber) { *portNumber = 0x01; } としていますが上手くいきません。 型がおかしい? ポインタってものが分かってない? など色々考えてはみたのですが何分初心者なので解決に至っておりません。 よろしければご教授の程よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- H8 外部バスのデータアクセス
H8 外部バスのデータアクセス ルネサスのH8マイコン初心者です。(C言語も初心者です) 外部バスのCS1(0x200000)に512KBのSRAMが繋がっているのですが、 HEWのセクションを変更せず、直接SRAMに対して読み書きしたいと思っています。 バスコントローラは設定済みという前提で以下の(A)~(C)のように 宣言すればデータの読み書きは出来ると思うのですが、 (A)~(C)を配列や構造体として扱いたい場合、どのように宣言すれば 良いのでしょうか? (A) #define SRAM1 (*(volatile unsigned int*)(0x200000)) (B) #define SRAM2 (*(volatile unsigned int*)(0x200002)) (C) #define SRAM3 (*(volatile unsigned int*)(0x200004)) (D) SRAM1 = 1; (E) SRAM2 = 2; (F) SRAM2 = 3; よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- アドレスを設定した構造体への定数セット
アドレスを設定した構造体への定数セット 以下のような ソースで TESTDATA に対し定数をセットしたいのですが どのようにコーディングすれば良いのでしょうか? ※ 例1) のように宣言したデータを memcpy しない方法を知りたいです 設定したい定数値) { {"AAA",2}, {"BB",3}, {"CC",8} } struct stTEST { struct { char A[10]; int B; }DT[3] }; #define TESTDATA (*(volatile stTEST*)0x200000) ----------------------------- 例1) struct stTEST_A { char A[10]; int B; }; struct stTEST_A DT[3] = { {"AAA",2}, {"BB",3}, {"CC",8} }; よろしくお願いします。
- ベストアンサー
- C・C++・C#
- アドレス指定方法
お世話になります アドレス指定について教えてください 例えば、構造体の配列があります typedef struct { unsigned char m_bDat; unsigned char m_bTemp; }tTEST; tTEST tTest[ 10 ]; // tTESTの配列を作成 この、"tTest[ 10 ]"の先頭アドレスを指す際の方法について 1.tTest 2.&tTest[ 0 ] 3.&tTest コンパイルしてみると、どれも同じ結果となったので、間違っていないと思うのですが・・・ 1~3項について、詳しく御教授して下さい よろしくお願い致します
- ベストアンサー
- C・C++・C#
お礼
なるほど内側の*は型を記述するためのもので 外側の*は値にアクセスするためのものだったんですね これで初心者の問題になりました 助かりました
補足
すいません もうひとつ分からないことが出てきました #define使わないで書いた場合 unsigned char hoge = (*(volatile struct st_pd *)0xFFFF83A0).DR.BYTE.LL; 右辺は識別子の無い変数に見えるんですけどこういうのありえるんでしょうか?