私宛なのかな? かめいさん> > > そうですよね > 以前、H8で最大500KHz(2μs)間隔で割り込みをかけてメモリー1Byte 分の > データを割り込みごとにアドレスインクリメントしてI/Oポートへ出力する事を > したかったのですが、Cで書くと勝手に全レジスタ退去をしてくれるので > 40クロック(2μs)かかり、それだけでサイクル時間を全部使ってしまい断念 > した記憶があります。 私の場合は、200μsec毎にタイマ割り込みを掛けて、擬似PWM信号を作った ことがあります。その処理が実際どの位の処理時間になっているのか内臓カウ ンタを使って計測したことがありますが、約10μsec以下だったので全部Cで書 くことにしました。 しかし、ここまで時間的に厳しい処理の場合はDMAを使う方法があるのかもし れません。幸いH8はメモリマップドI/OなのでDMAは使いやすいと思います。 (但し、デバッグはハマルと大変ですが・・・) > 目的はDDAと同じ事をやりパルスモーターを動かしたかったのですが。。。 > (これを電子カムとか言って数十軸〜数百軸を同期制御出来ます) > > 特定のレジスタをCに使わせない指定とか出来るのでしょうか? > そうすれば割り込みで特定のレジスタを使って高速に処理できますよね。 > 40クロックも無駄にするのは許せないと思うのですが。 > どなたかCの裏技などご存じないですか? Cの関数としてコールされる以上、レジスタについてはユーザーはいじれないと 思います。(少なくともイエローCではそう思います) 私も以前できないか検討したことがありますが、諦めました。 どうしても必要な場合は、割り込みルーチンをアセンブラで別に記述しておき、 該当のベクターテーブルに割り込みルーチンの先頭アドレスを記述するしかな いと思います。簡単に言えばCと切り離してしまう方法ですが、その割り込みル ーチンで必要なレジスタだけ退避すれば良いと思います。 YCでは、先頭に _asm を付けることによって、Cは一切この行のコンパイルを しませんから、インラインアセンブラでCソース上に展開しておけば管理も楽か と思います。 もう一つの方法は、リンク前のASMファイルを直接編集し、不要なレジスタ退避 及び復帰をコメントに変更すれば良いのかもしれませんが、余程注意してやらな いと返ってバグの発生要因になるので好ましい方法ではないですね。 全体のデバッグを完了し、チューニングという意味なら良いかもしれませんが。 鈴木