ルネサスのマイコン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で質問しましょう!
似たような質問が見つかりました
- IT・エンジニアリング アドレス空間(メモリマップ)について教えてください。 マイコンには必ずメモリマップが記載されています 3 2022/06/17 09:42
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- Safari(サファリ) 米国サイトへ行きたいのに、勝手に日本語ページへ飛ばされる 1 2022/10/16 07:52
- 固定IP MACアドレスはLAN内で相手を特定するアドレスですか? PCから監視カメラを閲覧するときに、セグメ 3 2022/07/23 09:04
- Outlook(アウトルック) 標準アカウントをOUTLOOKアプリに登録するとほかのアカウントのメールもこのアドレスに受信される 1 2023/02/03 20:34
- ツイキャス ツイキャスでアカウントロックされたとき、IPアドレスが自動取得で変更されても、PC端末が特定される? 1 2022/10/15 15:49
- VPN 無料のwifiはなぜ危険性高い? VPN プライベートDNSモードにすれば安全? 2 2022/06/04 18:23
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
- その他(インターネット接続・インフラ) アプリ利用者を特定し、裁判に 2 2022/06/09 21:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
命令網羅率の計算問題です
-
組み込みCプログラムで実数型
-
MIPS アセンブリ言語
-
私は
-
なぜ、i++なのか?(ものすごく...
-
arduino
-
VBAでのコントロール操作
-
アセンブリ言語で。
-
EXCELでの16進数取り出し、上...
-
【有効数字について】 授業で、...
-
1Mバイトって何バイト?
-
文字の容量(サイズ)についての...
-
K KB MB について詳し...
-
基本情報技術者試験問題
-
32bit = 4GB(バイト)?
-
12万の5%はいくらですか?
-
CSV データのバイト数を調べる...
-
携帯電話の略語であるMBって英...
-
1メガ、1ギガはナンバイトですか?
-
エクセルでビット1をカウント J...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
組み込みCプログラムで実数型
-
MIPS と クロック周波数の換算方法
-
プログラム言語FortranとCの違...
-
arduino
-
VBAでのコントロール操作
-
アセンブリ言語で。
-
パイプライン処理の処理能力に...
-
VB.net2010 割り込みの共通化
-
応用情報技術者試験問題の解き...
-
任天堂64の64 CPUの仕...
-
COM1(RS232C)とUSB仮想COMポー...
-
命令網羅率の計算問題です
-
VBSとVBA
-
なぜ、i++なのか?(ものすごく...
-
Intel の CPU
-
MIPSとか
-
ステート数とは
-
RPG画面系システムについて
-
H8Sで割り込み発生時の飛び先ア...
-
シーケンスプログラムについて...
おすすめ情報