マイコンのプログラムを書いております。
やりたい事はC言語でフラッシュメモリの物理アドレスを直接指定してそのアドレスの値を1バイト読むことです。例えば0xF000番地のアドレスから1バイト読む場合、以下のソースコードで問題ありますでしょうか?なおアドレスは2バイトで表現されます。
unsigned char *p_value;
unsigned char value;
p_value=&value;
p_value=0xF000;
この時点で変数valueには0xF000番地の値が正確に代入されてますでしょうか?
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
> この時点で変数valueには0xF000番地の値が正確に代入されてますでしょうか?
根本的に間違っています。
やりたいことは、
value ← (0xf000)
でいいんですね。
だとすれば、次のようにします。
const unsigned char *p_value = (const unsigned char*)0xf000;
unsigned char value = *p_value;
p_value = 0xf000;とした場合、p_valueというポインタ変数に0xf000番地を格納することになり、valueの中身には影響を与えません。
ところで、フラッシュメモリとのことですが、普通にアドレス空間にマッピングされていますか?
そのフラッシュメモリ特有の手順で読み込まないといけない(例えばコンパクトフラッシュのような)場合には、こんなに単純にはいきません。
> 正確に代入されてますでしょうか?
「正確」かどうかは状況によります。上でも書いたように、特別な手順がある場合、フラッシュメモリの書き換え直後の場合、ハード的な不確定要素がある場合など、「正確」にならない可能性はいくらでも考えらます。
No.4
- 回答日時:
#3です。
一点見落としがありました。
> フラッシュメモリの物理アドレスを直接指定して
とのことですので、そのフラッシュメモリがどこにアサインされているかで、ポインタに格納すべき値が変わります(正確には、ポインタの値==CPUアドレスとは限りませんが、現実問題としては等価と考えてよいでしょう)。
例えば、フラッシュメモリが0x100000番地にアサインされているなら、物理アドレスが0xf000の値を読み込むには、p_valueに格納するのは0x10f000でなければなりません。また、MMUやバンク切り替えなどがある場合、そのハードウェアに応じたアドレス変換が必要になります。
No.2
- 回答日時:
p_value=&value;
p_valueに valueという変数のアドレスを代入しています。
p_value=0xF000;
p_valueに 0xF000を代入していますが、unsignedcharを超える分は切り捨てられるので結局 0x00が入ります。
というわけで、全然目的とは関係のないことをこの2行のプログラムでは行っています。C言語をもう一度ちゃんと勉強し直すことをお勧めします。
0xF000に格納されたデータをvalueという変数に入れるには次のようにします。
p_value= (unsigned char *)0xF000;
value= *p_value;
ポインタ変数を使わずに
value= *(unsigned char *)0xF000;
とする方法もあります。
なお、割り込みハンドラなどが書換えある可能性のあるメモリ領域やI/Oポートのアクセスには volatileをつける必要があります。
No.1
- 回答日時:
K&Rを隅から隅まで読んでいるか、組み込み関係の本を眺めたことが有るならば知っているとおもいますが・・・
ただの unsigned char だと、コンパイラが行う最適化の気分で、(演算されない)変数の宣言が無視される場合がありえます。
そこで、I/Oなどで実アドレスを指す必要のある場合は volatile で修飾してコンパイラの最適化を抑止します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Visual Basic(VBA) Excel VBA ユーザーフォーム1のコンボボックスに別ブックの値を反映させたいです。 6 2023/03/21 16:12
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Excel(エクセル) VBA 同日で2回目(午後)の体温を登録するときのコード 3 2022/08/28 20:29
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/03/28 14:52
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
直接アドレス指定のポインタの初期化(代入)について(C言語)
C言語・C++・C#
-
C言語のポインターに関する警告
C言語・C++・C#
-
-
4
指定したメモリアドレスの値の読み出し(自己改変コードの作成)
C言語・C++・C#
-
5
メモリのアドレスからの値の取得のしかた
C言語・C++・C#
-
6
リファレンス電圧
物理学
-
7
構造体のメンバをfor文で回したい
C言語・C++・C#
-
8
FlashROMにデータを書き込むには?(組み込み開発初心者)
C言語・C++・C#
-
9
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
10
オフセットアドレスについて
教育ソフト・学習ソフト
-
11
ストローブ信号について。
その他(パソコン・周辺機器)
-
12
テキストデータをそのままバイナリへ
C言語・C++・C#
-
13
拡張子をつくる
その他(プログラミング・Web制作)
-
14
C言語の#defineについて
C言語・C++・C#
-
15
メモリ上にプログラムをロードして実行したい!!
C言語・C++・C#
-
16
DRAMのアドレス線が10本だと、なぜ2^10で1024本の行からなっているとなるのでしょうか?
情報処理技術者・Microsoft認定資格
-
17
組み込みソフト。ROM領域にデータ
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
gpioを使ってSPIをシミュレーシ...
-
受け取り方を教えて下さい
-
CGI作成中なんですが・・・
-
Application.ScreenUpdating = ...
-
セレクトメニューで2つの項目...
-
formで特定のinputを送信しない...
-
VB6で、長い時間かかる処理...
-
sendmailで複数の宛先にメール...
-
実行中の変数の中身をイミディ...
-
ACCESS テキストボックスを隙...
-
c言語 16進数の2進数への変換
-
[python] 文字列を変数名として...
-
初回起動のみ判別したい
-
複数列を持ったリストボックス...
-
【プルダウンで選んでGOボタン...
-
TXTに出力すると文字化けが起こる
-
Perlで複数の値を返す良い方法...
-
Cookieの有効期限について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
途中まで出来ているのですが‥(D...
-
Perlでアルファベットを数...
-
リロード後にプルダウンの選択...
-
linq で 楽天ウェブサービスのX...
-
【C#】数値の範囲チェックについて
-
ホームページから意見を送るsen...
-
CGI(Perl)で、Net::FTPを使いたい
-
半角スペースが有効にならない。
-
演算子について
-
セレクトボックスについて
-
受信データの分割
-
フォーム入力(CGIでデータ取得)...
-
CGIは初心者です。よろしくお願...
-
VB2010 のユーザコントロールの...
-
"ー"を含むとサーバーエラーになる
-
フォームで入力した値を表示し...
-
正規表現での検索がうまくいき...
-
掲示板のコメント欄にあらかじ...
おすすめ情報