
皆さん、有難う御座います。時々質問させて頂いています。
今回は、ベクターアドレスをC言語で書く方法について質問します。
ルネサスのH8マイコンを使っています。モニターを使うとRAM上に割り込みの仮想ベクターを作れます。
仮想ベクターには、割り込みのジャンプ先アドレスが書かれます。
現在アセンブラで書いているのですが、C言語で書く方法は無いでしょうか。
二つの方法で書きたいと思っています。
アセンブラで次の二つの方法に相当するC言語命令を知りたい。
(1)ORGとEQU命令を使った方法
(2)ムーブ(Z80ならロード)命令で関数のアドレスをメモリに書く方法
ルネサスにはHEWと言うソフトが有りますが、HEW特有の命令によらず、一般的なコンパイラが持っている機能で実現したい。
以上宜しくお願いします。
No.7ベストアンサー
- 回答日時:
> *(void **)(0xFE130) = &test ;
コンパイラに依存しないという意味では、上記の方法は問題があります。
CPUアドレスをポインタにキャストしても、期待した結果になるかどうかは保証されないからです。
ただ、通常はこれで問題なく動作するでしょうが...
> 関数のアドレスを書き込む方法が分からないと配列に出来ません。
これは、
void vector00();
void vector01();
...
void (* const vectors[])() = {
&vector00,
&vector01,
...
};
のようにすれば、配列にできます。
回答有難う御座いました。
この方法で配列に出来ました。
残る課題はセクション指定です。
No.4, No.5 さんの回答にその方法が書いてあると思うのですが、自分の能力不足のためまだ良く分かりません。
これから調べようとしています。
また何か有りましたら、宜しくお願いします。
No.19
- 回答日時:
>モニターは、ROM上のプログラムだって動かせます。
>仮想ベクタはRAM上に有ります。
>モニタとユーザが作ったプログラム両方をROMに置けます。
>モニタをそのまま使用するなら、Gコマンドでユーザプログラムを実行すれば良い。
>モニタを改造すれば、リセットスタートでユーザプログラムに飛ばす事も可能です。
そこまでしますか。
プロなら有り得ませんが、アマチュアならまぁやりたければどうぞ。
そもそも仮想ベクタがどうやって実現しているか分かってます?
表面上見えませんが、割り込み処理時に一度モニタに飛んでから更に仮想ベクタを参照して再ジャンプする仕組みになってるんで時間ロスが発生します。
それにRAM上にベクタがあることでメモリ破壊暴走の危険が増します。これもプロとしては許せません。
R32Cさんの書いているベクタの設定もそうですが、モニタを前提とした設計は無駄なことをしていると思います。
色々有難う御座います。
私の知りたかった事は、回答番号No5に有る様に解決しました。
この辺で締めませんか。
ここは人気が有って、C言語の質問があっと言う間に増えます。
私の方はもう解決したので、他の方の質問の回答に時間を使って頂きたいと思います。
また何か質問した時は、宜しくお願いします。
No.18
- 回答日時:
単純に、ベクタアドレスを設定する部分だけ、アセンブリ言語のソースとして
分割すればいいだけの話のように思います。
それが、Cなのかアセンブリ言語なのか、どちらでも保守性は変わらないと
思います。どちらかというとリンカの指定を省いてアドレス指定ができる
アセンブリ言語で書いたほうが保守しやすいとは思いますが
色々有難う御座います。
私の知りたかった事は、回答番号No5に有る様に解決しました。
この辺で締めませんか。
ここは人気が有って、C言語の質問があっと言う間に増えます。
私の方はもう解決したので、他の方の質問の回答に時間を使って頂きたいと思います。
また何か質問した時は、宜しくお願いします。
No.17
- 回答日時:
同じこととしか思えないですね。
>しかし割り込みを使うと、START_Cを個別に変更しアセンブル
>し直さなければ成りません。
>C言語だけで記述出来れば、START_Cの変更が入らなくなります。
C言語だけで記述できても、C言語で記述するベクターテーブルはコンパイル
しなおさないといけないので同じですね。
補足要求の意味がわからなかったのでしょうか?
No.16
- 回答日時:
>H8/3052だけです。
プログラムによって割り込みを使ったり使わなかったりすると、>アセンブラのベクターテーブルをその都度変更しなければなりません。
> C言語で処理できれば、アセンブラ部分は変更しないで共通に使えます。
???
なんかおかしくありませんか?
Cで書こうとアセンブリ言語で書こうと、ベクタテーブルの変更が必要なら
どちらの言語でも変更が必要ですよね。
確かに、
Cで書けば当然Cで変更が必要で、おっしゃるとおりアセンブリ言語の変更は不要ですが
いったいどのような仕組みをお考えなんですか?
スタックポインタの設定など行うSTART_Cと言うアセンブラ・プログラムが有ります。その中で仮想ベクタの設定を行っています。
不意な割り込みが入ってもいいように、無限ループプログラムのベクタを入れて有ります。
割り込みを使わないC言語プログラムなら、START_Cはどれにでも使えます。
しかし割り込みを使うと、START_Cを個別に変更しアセンブルし直さなければ成りません。
C言語だけで記述出来れば、START_Cの変更が入らなくなります。
No.15
- 回答日時:
> ルネサスで無料で提供しているモニタが有ります。
割り込みが入るとモニタに入り、そこからRAMに書いた仮想ベクタのアドレスに飛ぶようになっています。えーと。伝わっていないかな?
全部のプログラムをROM化して、それをモニタから動かす気ですか?
モニタが動かすプログラムってRAM上だし、ベクタもRAM上ですよね。ここで言うROM化とは、ROMに全て焼く&ベクタもROMにあるモニタもない状況です。
最終的にプログラムをROM化せずRAM上でモニタで動かす実験だけの予定であれば今の方針のままで良いですがそのつもりですかと伺っています。回答番号:No.2からROM化とは、そのつもりで言ってました。
>モニタが動かすプログラムってRAM上だし、ベクタもRAM上ですよね。
モニターは、ROM上のプログラムだって動かせます。
仮想ベクタはRAM上に有ります。
>ここで言うROM化とは、ROMに全て焼く&ベクタもROMにあるモニタもない状況です。
モニタとユーザが作ったプログラム両方をROMに置けます。
モニタをそのまま使用するなら、Gコマンドでユーザプログラムを実行すれば良い。
モニタを改造すれば、リセットスタートでユーザプログラムに飛ばす事も可能です。
No.14
- 回答日時:
>1.RAM上で開発してROMに書き込みます。
> printf()などは大きくてRAMに収まりません。
> ROMに書いて、呼び出す実験をした事があります。
> コンパイル後にROMに書き、EQU命令で関数のアドレスを定義し、C言語で呼び出しました。
前にも書きましたがベクタを含めてROM化する場合は今のベクタをプログラムで書き換える方法は使えません。ROMですからね。そこの所はどう考えてますか?
ルネサスで無料で提供しているモニタが有ります。
割り込みが入るとモニタに入り、そこからRAMに書いた仮想ベクタのアドレスに飛ぶようになっています。
No.13
- 回答日時:
richardoさん、はっきりしていないので答えてください。
1.RAMで使う前提である。ROMは考えていない。
2.H8限定。
3.H8アドバンストモード専用
4.C言語だけで全てを行いたい。アセンブラやリンカ・スクリプトでは何もしない。
って事ですよね?
zwiさん、
1.RAM上で開発してROMに書き込みます。
printf()などは大きくてRAMに収まりません。
ROMに書いて、呼び出す実験をした事があります。
コンパイル後にROMに書き、EQU命令で関数のアドレスを定義し、C言語で呼び出しました。
2.H8/3052用です。
3.そうです。アドバンストモードです。
4.C言語で対処出来るなら、C言語でやりたいという事です。
今までの結果は、回答番号5の「お礼」に書いた通りです。
No.12
- 回答日時:
> ヘッダ・ファイルは共通に使えるようになっていますよね。
> それと同様にC言語に伴うアセンブラ・ソフト部分も変更せず、
>C言語部分の変更だけで対処出来ないかなという事です。
???
どれだけのCPUで共通部品にしようとしているのですか?
少なくとも、ベクターテーブルを持たないCPUでは使えないことは
お分かりですよね?
R32Cさん、
>どれだけのCPUで共通部品にしようとしているのですか?
H8/3052だけです。プログラムによって割り込みを使ったり使わなかったりすると、アセンブラのベクターテーブルをその都度変更しなければなりません。
C言語で処理できれば、アセンブラ部分は変更しないで共通に使えます。
No.11
- 回答日時:
>でも私の質問は、「アセンブラなら実現方法が分かるけど、C言語で実現する方法を知りたい」という事です。
gccとかHEWのCコンパイラは重いから使いたくないって事ですね。しかし、そうするとセクションはC38H.EXEだと機能的に操れない可能性が高い状況ですから無理があります。C38H.EXEを自分で改造しますかって話ですね。
その貫き通したい気持ちは好きですが、そこまでやる気がありますか?
>C38H.EXEを自分で改造しますかって話ですね。
そんな事はしません。私の知りたかったのは、関数のアドレスを得る方法です。アスタリスクを上手に使うと得られるみたいだけど、その方法が分からなかったのです。
回答番号5のお礼に書いてある様に、その方法は分かりました。
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- 哲学 《光あれ》という命令法は どういう実態か 1 2023/01/24 17:57
- 憲法・法令通則 マスクのお話 マスクは今推奨という形です。 「推奨(すいしょう)」は「物事や人物の優れている部分をあ 6 2022/04/25 12:49
- 情報処理技術者・Microsoft認定資格 (パイプライン処理)基本情報技術者の演習問題について 1 2023/03/11 17:47
- 哲学 日本語のあたらしい文法を考えよう。 6 2022/06/25 17:41
- 相続・遺言 遺言書の有効性について Aが亡くなりました。 BCDEが法定相続人です。 複数の銀行に預貯金あり。 3 2023/07/21 21:01
- 弁護士・行政書士・司法書士・社会保険労務士 行政書士試験の行政法についての質問になります。 行政法の行政手続法についての質問になります。 問 意 1 2023/08/09 13:35
- 教えて!goo 質問サイトで読解力がない奴と話すとイライラします。こういう人の対処法を教えてください。 22 2022/09/12 08:44
- 高校 テスト勉強について 中間テストの結果がかえってきたのですがあまりよくありませんでした。 現代の国語と 2 2023/06/05 00:46
- 日本語 用言の活用組織はいかにして生成したか:或る試論 1 2022/06/30 05:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文系のSE志望です。プログラミ...
-
アセンブリ言語からC言語への変...
-
0xffffとは?
-
ライン数とステップ数の違いは?
-
シーケンサのデータレジスタD...
-
実行ファイルからソースはみれる?
-
C言語で128bitの2進数のビット...
-
レジストってなんですか?
-
8ビットのデータの、先頭ビット...
-
入力回数のカウントをする方法
-
PICでパルス数をカウントし、カ...
-
アセンブラのLA
-
アセンブラからC言語に変換する...
-
文字参照は10進数と16進数では...
-
アセンブラ言語がわかりません。
-
03分22秒36のような時間の単位...
-
PICの入出力切り替えの時間がプ...
-
レジスタの数
-
命令について
-
数独の3国同盟のアルゴリズム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
昔のゲーム製作に使用する言語...
-
フローチャートを書く書かない
-
今、一番必要とされている言語
-
どのような計算を実行するプロ...
-
CASLの問題です。
-
C言語について
-
アセンブリ言語からC言語への変...
-
どのプログラミング言語を学習...
-
プログラム言語について
-
型なし言語
-
割り込みベクターをC言語で書...
-
文系のSE志望です。プログラミ...
-
BASICのGOTOってコードの書き換...
-
Windows Driver Kitの対応OSに...
-
アセンブリ言語を学ぶことは意...
-
プログラミングを突き詰めて考...
-
OSはどんなコンピューター言語...
-
ものづくりに向いているプログ...
-
CやC++の言語について
-
CASLII アセンブラ (C C++ J...
おすすめ情報