ルネサスのマイコンH8Sのプログラムを組んでおります。
プログラムの構成がBoot部分とアプリケーション部分に分かれており、
Bootはアドレス0番地から、アプリは3000番地以降の領域を使用するようになっています。
完成されたBootを使用してアプリケーションのプログラムを組まなければならなく、また、Bootは変更できないことになっています。
このBootの中のベクターテーブル上で、割り込みが発生した場合の飛び先のアドレスがRAM上になるように設定してあります。
このため、アプリケーションソフトでは、
割り込みが発生した場合のRAM上の飛び先に
FLASH ROM上の指定したアドレスにジャンプする命令を書き、
FLASH ROMのジャンプ先には、実行したい関数を書きたいのですが、
(1)RAM上の特定のアドレスからFLASH ROM上の指定したアドレスにジャンプさせる方法。
(2)FLAH ROM上の指定したアドレスに関数を記述する方法。
を知りたいのですが、
どなたか教えて頂けないでしょうか?
開発環境はHew4 言語はC言語を使用しております。
私自身が理解不足であるため質問内容が伝わりにくいかと思いますが、
宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
特定のアドレスに特定のデータを書き込む方法。
例:6000番地から、順に、16進数の01,23,45,67を書き込む
unsigned char *addr;
addr = 0x6000;
addr[0] = 0x01;
addr[1] = 0x23;
addr[2] = 0x45;
addr[3] = 0x67;
もし「3014番地にジャンプするアセンブラコード」が「5A 00 14 30」であって、RAMの飛び先が6004番地なら
unsigned char *addr;
addr = 0x6004;
addr[0] = 0x5A;
addr[1] = 0x00;
addr[2] = 0x30;
addr[3] = 0x14;
と書けば良いです。
また「関数のアドレスにジャンプ」の場合は
unsigned char *addr;
addr = 0x6004;
int int_var;
void (*func_addr)(void);
func_addr = function_name; /*関数void function_name(void)のアドレスを受け取る*/
int_var = (int)func_addr); /*intにキャストする*/
addr[0] = 0x5A; /*JMP命令の1バイト目*/
addr[1] = 0x00; /*JMP命令の2バイト目*/
addr[2] = (int_var >> 8) & 0xff; /*アドレスの上位をセット*/
addr[3] = int_var & 0xff; /*アドレスの下位をセット*/
*注意*
上記の「0x5A 0x00」の命令コードは「たとえばの値」です。本当のJMP命令が何になるかは、アセンブラの命令コード表で調べて下さい。
また、上記では、16ビットアドレスを「上位、下位」の順にしていますが、H8Sでは順番が異なるかも知れません。命令コード表を良く見て「正しい順番」を確認して下さい。
この回答への補足
済みません。上記の訂正なのですが、
unsigned char *addr;
addr = 0xffb418;(RAM上の割り込みが発生した場合の飛び先アドレス)
がコンパイルエラーの原因のようです。
記述方法を以下のようにに変えてみたのですがやはり上手く行きません。
addr = (char*)0xffb418;
どなたか、お分かりの方いましたら、お願い致します。
折角回答頂いたのですが、試すことが出来ずお礼が遅くなってしまい申し訳ございません。
回答頂いた例に従い記述したのですが、
void (*func_addr)(void); の行で、
以下のようなコンパイルエラーとなってしまいます。
何か解決策がお分かりでしたら教えていただけないでしょうか?
C2500 (E) Illegal token "void"
C2230 (E) Illegal function call
C1000 (W) Illegal pointer assignment
宜しくお願いいたします。
No.3
- 回答日時:
(1)(2)ともにC言語仕様で簡易に記述するすべはありません,
コンパイラ, リンカの仕様に依存する記述となりますが, Hew環境であれば仕組みさえ分かってしまえば, 割りと簡単に構築可能です.
以下, 参考になりそうなポイントです.
(1) RAM上の特定アドレスにジャンプ命令が記述されており, オペランドとしてROM上のアドレスを示すメモリ空間のオフセットが示されていれば実現します.
RAMは揮発性のため, あらかじめプログラムコード(以下, コード)を置いておくことはできませんので, スタートアップ処理内にてコードをROM上からRAM上へ展開(コピー)する必要があります.
Bootの処理内にてH'3000以降のコードをRAM上へコピーする処理が書かれているだろうと推測します. 例えば初期値付きの変数などはRead/Write可能とするためにスタートアップ処理にてRAM上へコピーする必要がありますが, 同様の処置をコードに対しても実施し実稼動中はRAM上にコピーされたコードで動作します. このような手間を掛ける理由は, ROM上のコードで動作している場合はその領域からフェッチする為ROMをイレースすることができず, ファームウェアを更新することができません.(イレースした途端暴走します)
(2) アセンブラであれば, オペランドに即値を記述すればいいのですが, C言語ベースで開発する場合リンカに割付アドレスを指定しておくことで簡易に実現が可能です.
Hew環境で実施するのであれば, ツールチェーンのリンカ設定にてセクションを追加し, ソースコード上で"#pragma section <セクション名>"を記述することで割付セクションを指定します.
既存のファームウェアを読み解く場合, 関数記述による処理フローを追うよりも リンカによるセクション管理がどのように設定されているかを意識して読み解く方が幸せになれると思います.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ちょっと先の未来クイズ第2問
9月9日(月)に発表される「第3回子どもマネー川柳」に入賞する川柳を考えてこちらに投稿してください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
HEWを使用しているのですが、このようなエラーが出ました。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CPU、Z80からステート数から...
-
組み込みCプログラムで実数型
-
VBSとVBA
-
文字の容量(サイズ)についての...
-
実行計画の「COST」と「BYTE」...
-
【有効数字について】 授業で、...
-
1Mバイトって何バイト?
-
KBのMB違いって
-
Excel_VBAで改行コードの無いフ...
-
1Mbpsって毎秒何キロバイト?
-
EXCELでの16進数取り出し、上...
-
16bitはダイナミックレンジが97...
-
CSV データのバイト数を調べる...
-
1TBHDDに音楽ファイルは何ア...
-
ワードの改行について
-
24ビットのメモリー容量の求め...
-
バイト以降の単位の基準は1024...
-
アルファベット30文字は何バイ...
-
エクセルでビット1をカウント J...
-
HDDの容量が320Gなのに298Gしか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでのコントロール操作
-
プログラム言語FortranとCの違...
-
組み込みCプログラムで実数型
-
命令網羅率の計算問題です
-
CPU、Z80からステート数から...
-
COM1(RS232C)とUSB仮想COMポー...
-
+=と÷=の処理速度の謎を教え...
-
MIPS と クロック周波数の換算方法
-
私は
-
アセンブリ言語で。
-
arduino
-
H8Sで割り込み発生時の飛び先ア...
-
x86系のCPUとは?
-
なぜ、i++なのか?(ものすごく...
-
CPUのHTについて教えてください。
-
処理時間の計算 PICアセンブラ
-
シーケンスプログラムについて...
-
応用情報技術者試験問題の解き...
-
VB.net2010 割り込みの共通化
-
PICマイコンのプログラムについ...
おすすめ情報