質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Q&A

解決済

2回答

3397閲覧

C言語のアドレス値(0x400000などの表記)から構造体にキャスト後に要素をアクセスするための相談・要件など

NEWBIEEBIEE

総合スコア62

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

0グッド

0クリップ

投稿2018/04/06 23:47

昔、WEB系のプログラムをやっていたもので、
最近、C言語とマイコンを使う仕事に就いたものです。

普段、仕事ではコンパイラはGHSのGreen hillsを普段使ってます。
Green Hills 以外使ったことがないのですが、
C言語のvolatileと構造体キャスティングを多用して
アドレス値からメモリ上のデータにアクセスしています。

(((volatile My_structure)(0x40520000))).child.register = 0

のように、アドレス値からキャスティングを行い、値を入力したいです。
個人の事情で正直、経験者からすると上記のコードが正しいとは言えないと思いますが、
ヘッダーファイルなどやdefineで定義したアドレス値から上記の構造体にアクセスできるでしょうか?

できたら、お手本と簡単な宣言とアクセスの仕方、
演習のため確認できたコンパイラなど教えてほしいです。

どうか何卒ご教授の方お願いします。
なんでもいいので返信お願いします。

では

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

それは普通に行われてることで、間違いでもなんでも無いです。
たとえば、Renesas のRXマイコンのメーカ提供の周辺デバイスアドレ定義ファイルは以下のようになっています

(一部抜粋)

C

1iodefine.h 2 3#define AD (*(volatile struct st_ad __evenaccess *)0x89800) 4#define BSC (*(volatile struct st_bsc __evenaccess *)0x81300) 5#define CAN0 (*(volatile struct st_can __evenaccess *)0x90200) 6#define CAN1 (*(volatile struct st_can __evenaccess *)0x91200) 7#define CAN2 (*(volatile struct st_can __evenaccess *)0x92200) 8#define CMT (*(volatile struct st_cmt __evenaccess *)0x88000) 9#define CMT0 (*(volatile struct st_cmt0 __evenaccess *)0x88002) 10#define CMT1 (*(volatile struct st_cmt0 __evenaccess *)0x88008) 11#define CMT2 (*(volatile struct st_cmt0 __evenaccess *)0x88012) 12#define CMT3 (*(volatile struct st_cmt0 __evenaccess *)0x88018) 13#define CRC (*(volatile struct st_crc __evenaccess *)0x88280)

これでたとえば、
CAN0.CTLR.BIT.CANM = 0;

と、レジスタにアクセスできます


追記
キーワード __evenaccess というのはルネサスコンパイラ特有のキーワードで、

変数宣言時に拡張機能の__evenaccess修飾子を付加すれば、宣言した型のサイズでアクセスする命令を出力します。

というものだそうです。

投稿2018/04/07 00:02

編集2018/04/10 03:28
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NEWBIEEBIEE

2018/04/07 00:14

参考にします。 ありがとうございました
NEWBIEEBIEE

2018/04/07 01:05

すみません、ちなみにユニットテストでもツールのユーザーコードでdefine で宣言しておけばこちらのアドレス参照した際にメモリ上の挙動と同じといって差し支えないでしょうか?
y_waiwai

2018/04/07 01:21

ちと意味がわかりませんが、実際にやってみて動作を確認してみてはいかがでしょう
guest

0

構造体ポインタ

アロー演算子を使ってください。

投稿2018/04/06 23:52

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

a_saitoh

2018/04/11 01:33

アクセスできるかどうかの質問に、コーディングのお作法の解答をしています
Zuishin

2018/04/11 01:49

アロー演算子が作法として優れているかどうかは知りません。読みにくいのであれば読みやすいように書けばいいのではないかという提案です。 アクセスできるかどうかなどやってみればすぐわかることが質問の本意とは思いませんでした。 しかし意図を読み違えていたのは確かなので低評価はもっともだと思います。
Zuishin

2018/04/11 01:52

以下質問からの引用 > できたら、お手本と簡単な宣言とアクセスの仕方、 > 演習のため確認できたコンパイラなど教えてほしいです。 > > どうか何卒ご教授の方お願いします。 > なんでもいいので返信お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問