• ベストアンサー

組み込みソフト。ROM領域にデータ

C でデータに const 属性をつけて、初期値を設定して定義すると、初期値は ROMにテーブルが作られますがデータ自体は RAM領域に配置されます。 RAMの節約のため、ROM領域にデータを配置する方法はないのでしょうか。

  • ahkrkr
  • お礼率87% (568/650)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#pragma section data = ".rodata" //ROM配置したいデータ #pragma section data = default 等のコンパイラやアセンブラのコマンドを使ってデータが配置される領域をROM領域に設定してください。 必要に応じてリンカディレクティブファイルまたはリンクディレクティブなどと呼ばれるファイルを編集してROM領域を示すセクションを追加してください。 注)他の回答にあるようにあなたの使用している環境に合わせてください。

ahkrkr
質問者

お礼

回答ありがとうございます。 そういうコマンドがあったような気がしますのでマニュアルを調べて見ます。

その他の回答 (3)

  • ricardo_
  • ベストアンサー率19% (14/72)
回答No.4

>C でデータに const 属性をつけて、初期値を設定して定義すると、初期値は ROMにテーブルが作られますがデータ自体は RAM領域に配置されます。  何か勘違いしている。  const 属性はコメントのように書き換えないデータに使います。  だからROM領域に配置されます。  初期値を持ち、後から変更できる変数はROMに書いた値をRAMにコピーして使います。  その場合、const は付けません。  リンカー・オプションでセクションのアドレスを設定します。constデータのセクション・アドレスをROM領域に設定します。  RAM領域に入っているデータを誤って書き込まないために、読み出す側で安全策としてconstを付ける使い方も有ります。誤って書き込もうとすると、コンパイラがエラーを出してくれます。

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.2

「変数」を「ROMに配置」といいますが「変数を変更するのは不可能」なのでROMに配置されることはないですよね。「読み込んだプログラム」と同様にメモリ上に確保されますので。 「ROMからデータを読み込み」ならハードウェア・コンパイラに依存するので...

回答No.1

Cの言語仕様ではなくコンパイラの仕様ですからコンパイラ名を書くべきですね。

関連するQ&A

  • NORTiプログラムのROM化

    OS    :NORTi4 1.18a 開発環境 :HEW4 コンパイラ:SHC C/C++ Compiler ver.9.01 CPUボード :AP-SH4A-0A(アルファプロジェクト社製) 1.ROMにプログラムを焼く 2.パワーオンリセットでバスの設定、ROMとSDRAMを使用可 3.ROM上の初期化関数へジャンプ 4.初期化領域をゼロクリア、初期化領域データのメモリコピー、  ROM上のプログラムをSDRAMへコピー 5.Cのmain()関数を呼び出し(RAMへジャンプ) http://www007.upp.so-net.ne.jp/SY-Firm-Ware/hew/hew.html http://hitachisoft.jp/Products/SH-C/support/faq_21.html 上記のサイト等を参考に行いましたがうまく動きません。 どこで問題が起きているか確認できるようにモトローラSフォーマット ファイルではなくabsファイルをROMに書き込みデバッグしながら行っています。(ROM上でのデバッグはよくないようなのですが、原因がつかめないので。。。どうしようもなくて。。) リセットベクターからいきなりGOするとmainに飛んでくれないんです。 付属のサンプルプログラムで試した時もいきなりGOするとmainにいってくれません。 ステップ実行で1ステップづつ実行していってmainループの中を一通り動かしてからGOすると動くような状況です。 初期化領域のゼロクリアや、データコピー、プログラムのコピーはちゃんと行われています。 何が悪いのかわからず困っています。 宜しくお願いします。

  • 配列とポインタの使い方

    ROM領域にあるたくさんのデータの一部をRAMにコピーしたいのですが、うまくいきません。 どこがおかしいのか教えていただけないでしょうか? (例:int型の10個のデータとchar型の5個のデータをRAMへコピーする) // ROM領域に置いたテーブル const int int_table1[10]={1,2,3,4,5,6,7,8,9,0}; const char chr_table1[5]={1,2,3,4,5}; const int int_table2[10]={11,22,33,44,55,66,77,88,99,100}; const char chr_table2[5]={11,22,33,44,55}; // RAM領域 int int_data[10]; char chr_data[5]; // プロトタイプ宣言 void copy_data(int *int_p,char *chr_p); //メイン処理 | copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー | | copy_data(int_table2,chr_table2); // テーブル2をRAMへコピー | // ROMデータをRAMに転送する関数 void copy_data(*int_p,*chr_p) { char i; for (i=0;i<10;i++) { int_data[i]=int_p; int_p++; } for (i=0;i<5;i++) { chr_data[i]=chr_p; chr_p++; } } コンパイルすると [Warning(ccom)] assignment from const pointer to non-const pointer ===> copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー [Error(ccom)] mismatch prototyped parameter type ===> copy_data(int_table1,chr_table1); // テーブル1をRAMへコピー のワーニング&エラーになります。 どのようにしたらワーニング、エラーを直せますか? または「こうすればできる」という回答でもOKです。 よろしくお願いします。

  • 「内容を圧縮してディスク領域を節約する」検索方法2

    (どうも不可能らしいですが念のため再質問しました) 「内容を圧縮してディスク領域を節約する」がONになったファイルを検索してリストアップすることが可能なら方法を教えて下さい。 --- ファイルやフォルダのプロパティ → 全般タブ → 詳細設定 → 圧縮属性または暗号化属性 → 「内容を圧縮してディスク領域を節約する」

  • pro*cobol ⇔ oracle のデータ型の扱い

    お世話になります。 pro*cobolで、テーブルの作業領域を定義し、 データの編集後、oracleのテーブルへ出力している のですが、cobol側の定義はpic9タイプで oracleの項目定義ではCHAR型になっております。 この状態で、cobol側のpic9タイプの項目に "A00001"等文字を含む値を設定した所、 ABENDせずにoracleテーブルに"A00001"の 項目値を出力しています。 cobolだけに限れば、属性エラーなのですが、 この場合、oracleの項目定義が優先されるのでしょうか? よろしくご教授の程、お願い申し上げます。

  • データドライブの復元ポイント領域について

    過去の質問を参照しましたが、どうしても見つけられなかったので質問させて下さい。 現在、Cドライブ(システムドライブ)に12%(2289MB)と、Dドライブ(データドライブ)に12%(6296MB)の復元ポイント領域が設定されています。 Cはシステムドライブなので、復元ポイント領域が設定されているのは分かりますが、Dのデータドライブになぜ復元ポイント領域が設定されているのかが分かりません。 復元ポイント領域にはデータファイルは含まれないとありますが、Dの2289MBは無駄に確保してある領域という事でしょうか? また、Cを1%(200MB)の設定にしようと思っていますが、実用にはこれで十分といえるぐらいなのでしょうか?

  • Excel グラフの基データ領域を予め多めに確保したい

    お世話になります 質問内容としては 日々追加されているデータを 無駄な領域を含めないように しかも効率よくグラフ化・及びグラフの更新するには? と言うものです。 やや長文ですがお付き合い頂けると助かります 早速本題ですが 多分したに表すような業務は形こそ違えど 多かれ少なかれ 凡そ一般的に広く行われるような内容だと思うのですが        品目           (単位:個)        日時     A1 B5 G3 …        ・        ・ 04/11   1 10  5 … 04/12   8  3 17 … 04/15   3 25  1 … 04/16 使用停止 7 16 … 04/17      5  8 …        ・        ・        ・        ・ この表は適当に即興で書いたものですが まあ例えばこういった表で 日々データを追加して更新しているとします。 又、このデータの提出はグラフ形式で求められる と、します。 普通なら散布図グラフをウィザードで作成すると思うのですが、 ウイザードを普通に使うだけでは データを何度か追加する度に 「グラフの元データ領域を広げる」 と、言う作業が各系列毎に定期的に発生し 非常に非効率です… よね? そこでデータ系列毎に データの入力範囲を自動で見極めて グラフの基データにして貰えると助かるのですが、 こんなのって無理ですか? 私自身少し悩んで 例えば系列毎のデータ領域に対して 事前に名前定義を行って その名前定義内の範囲指定を動的なもので行えば… (例:$C$3:INDEX($C:$C,SUMPRODUCT(ISNUMBER($C:$C)*1)+ROW($C$3)-1) とか、 考えてみたのですが グラフの元データの系列に対する領域指定に 名前定義した定義名での指定が使えないようで これは上手くいきません。 (このアイディアはhttp://oshiete.coneco.net/qa3900592.htmlにおいて  OtenkiAme様より頂いたものを応用しようとしたものです) 方法そのものは良いがやり方が間違っているのか 若しくは全く別なやり方で解決すべきなのか… どうしたものかホトホト困っています。 どうぞお知恵を頂戴したく思いますので宜しくお願い致します。 (Excelはウインドウズ版の2004だったと思います)

  • AutoCAD属性定義付きでDXF保存→他ソフトで開くとどうなるのでし

    AutoCAD属性定義付きでDXF保存→他ソフトで開くとどうなるのでしょうか? いつもお世話になっております。 AutoCAD 2007でブロック内に属性定義付きで作図      ↓ DXF形式で保存      ↓ 他ソフトでDXF形式のデータを開く この場合 属性定義は DXF形式保存の際も属性定義として保存されると思いますが、 他ソフトでは属性定義はどのようになるのでしょうか? ・属性定義が含まれるデータを開くことは、出来る?出来ない? ・他ソフトに属性定義は、ある?無い? ・扱いはテキスト形式?属性定義? ・属性定義の部分は空欄?名称?プロンプト?初期値が設定してあるとしたら初期値?  それとも最後に手入力した値になる? 尚、他ソフトというのは今のところ『頭脳RAPID』というソフトのみなのですが、 今後どのようなソフトにデータ提出するか分からないため 『このソフトでは、こんな感じに表示される』や、 『大抵のソフトではこんな感じになる』など 『頭脳RAPID』以外のソフトについてもご回答頂ければ大変助かります。 よろしくお願いいたします。

  • 関数内でconst修飾子を使用した場合の配置

    お世話になります 関数内でconst修飾子を付加した領域を宣言します。 その領域は何処に取られるのでしょうか? RAM?ROM?スタック? コンパイル環境により異なるのでしょうか? void Test(void) { const int i_dat = 0;   ・・・・・・ } よろしくおねがいいたします。

  • CPUとRAMとROMの関係。

    パソコン初心者です。入門書に、CPUとRAMとHDDの関係が次のように述べられていました。    (3)C P U       ↑   ↓    (2)R A M(4)    (1)↑   ↓(5)       H D D (1)HDDがRAMにデータを渡す。 (2)データは一旦RAMに記録される。 (3)CPUはRAMに記憶されたデータを基に処理する。 (4)RAMはCPUの処理結果を記録する。 (5)HDDはRAMからデータを受け取る。 CPUとROMもデータのやり取りをしていると思います。それでは、この時のCPUとROMの関係はどのようなのでしょうか。CPUとHDDの関係と同様に、間にRAMが入っているのでしょうか。それとも、CPUとROMは直接データのやり取りをしているのでしょうか。 過去の質問検索では、同種の質問がなかったようなので質問しました。よろしくお願いします。

  • 「内容を圧縮してディスク領域を節約する」検索方法?

    Windows XP 「内容を圧縮してディスク領域を節約する」属性がONになったファイルを検索してリストアップする方法はありますか? ありましたら教えて下さい。