人に聞けない痔の悩み、これでスッキリ >>

最近、マイコンのプログラミングをはじめたのですが、相手方の技術者が主張するバンク切り替え方法が腑に落ちないので、この投稿で質問します。
問題はバンク切替えの方法で、CPUは日立64180です。
メモリーの構成は次のようになっています。
  ┌──┐
  │  │主プログラム
  │  │のメモリー
  │  │
  └──┘
┌──┐┌──┐
│BANK││BANK│切替プログラム
│ 0 ││ 1 │のメモリー
│  ││  │
└──┘└──┘

この構成にを前にして、相手側技術者の主張は、次のようなものでした。
  BANK-0   BANK-1
┌────┐┌────┐
│ │  ││    │
│ │  ││    │切替プログラム
│切替命令││    │ のメモリー
│ └──┼┼─┐  │
│    ││ ↓  │
│    ││    │
└────┘└────┘
BANK-0のプログラムでBANK-1に切り替える命令を発行すると、直ちにBANK-1に切替わり、BANK-1の同じアドレスの次アドレスからプログラムが続行するというのです。
これだと、BANK-0,BANK-1の先頭番地からプログラムを実行させる方法が思いつきません。
私の考えは、主プログラム側で予め必要なバンクに切替えておき、切替えたバンクの先頭番地に制御を移せば済むと思うのですが、どうなのでしょう?
日立64180アーキテクチャに詳しくないので、反証すらできません。経験された方に確実な回答をお願いする次第です。

A 回答 (3件)

バンク切り替えの方法としてHD64180のMMUを使用しているものと仮定すると、HD64180R/Zのデータシートを読んだところでは、仕様上の問題はないようです。



データシートにはこうあります。

"7.8 MMU Register Access Timing"

"When data is written into CBAR, CBR, or BBR, the value will be effective from the cycle immediately following the I/O write cycle which updates these registers."

"Observe that the next cycle following MMU register programming will normally be an opcode fetch from the newly translated address."

ですので、「私が調べたデータシート」に記載の仕様の上では、相手側技術者の主張は正しいようです。

#注意:たまたま私が調べたデータシートでは上記のとおりでしたが、HD64180にはバリエーションチップがたくさんあり、そのすべてがMMUに関して同一仕様とは限りません。

仕様の上で制限されていないからといって、それを行うべきかどうかはまた別問題です。たまたまそのCPUが「私がデータシートを調べたのと同じCPU」であれば大丈夫ですが、プリフェッチを行うCPUだった場合にはそのようなプログラムの構造ですとちゃんと動きません。

そのような、仕様の細かいところまで確認しなければ動作に確証がもてないようなプログラムを作ることは、好まくないプログラミング手法と呼ばざるを得ません。どうしてもそれ以外の方法がないのであれば仕方がないですが(そういう場合も稀にあります)、他の「安全な方法」があるのにわざわざ危険を冒すのは〇〇(ここに書くと発言を削除されてしまうような不穏当な文言だと思ってください)のすることだと、個人的には思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
MMUはHD64180Z/HD64180R1ですが、全部を読んでいる時間がないのです。
"…an opcode fetch from the newly translated address."
の部分で納得できました。
小さなBIOS+Scheduler部分は2KB程度に納まる予定で、これを二つのBANKの末尾に配置することにします。
回答が増えないのでここで締め切りとしますが、お二方にしか配点できません。AsanoNagiさん、すみません。

お礼日時:2005/07/31 21:26

確か、HD64180は、Z80の拡張マイコンだったと思います。


もし違っていたら、私の回答は間違っていますので無視してください。

BANKを切り替えてもPCの値が変化しなければ、アドレスはそのまま続いていきます。
例えば、PC=0x2010の時、BANK切り替えの命令を実行するとPC=0x2012(バンク切り替え命令の命令長が2バイトの場合)となり、BANKが切り替えられます。
したがって、BANK切り替え命令を実行しただけでは、BANKが切り替わり、命令のアドレス(=PCの値)はBANK切り替え命令の次のアドレスになります。

それを避けて、BANK1にBANKを切り替えた時にBANK1の先頭からプログラムを実行したい時には、
1. BANK1にBANK切り替えしたい時に、特定のアドレスにJMPする。
2. そのアドレスでBANK1にBANKを切り替える。
3. BANK1のそのアドレスにJMP 0x0000を書いておく。
と言うことになるでしょうか。このような命令は、プログラムエリア(=ROMエリア)の末尾に書いておけばいいのではないでしょうか。
    • good
    • 0
この回答へのお礼

確かに機種はHD64180です。
bloomers_daisukiさんの方法は、BANK-0とBANK-1の末尾に同じプログラムを置く方法ですね。そうすると、切り替え後に何らかの作業をしてから0000H番地へ飛ぶように仕組んでおけばいいということになりそうですね。
No.1さんへのお礼も参考にして下さい。

お礼日時:2005/07/31 20:37

64180 に詳しいわけではありませんが、一般的には、「バンクメモリの中ではバンクを切り替えない」のが基本ですね。



ただ、質問の内容では、あたかも、プログラムの実行中に無秩序にバンクが切り替わるような印象ですが、一定の番地にバンク切り替えのメカニズムに相当するプログラムがあるのなら、それもありかなと思います。

通常は、バンク+飛び先を、パラメータとして受け取るようなロジックを、主プログラム側で持つでしょうけど。

バンク側でバンクを切り替えると、バンク相互の位置関係という、本来考える必要のない事項を管理する必要があるので、普通は、バンク中でバンク切り替えはしませんね。
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございます!
私としては、小規模のBIOSを考えていて、これに簡単なタスクスケジューラ機能を付加したかったわけで、その管理をAsanoNagiのおっしゃるとおりの姿でやりたかったのです。
やはり、バンク中でのバンク切り替えでは、複雑になるのですね!

お礼日時:2005/07/31 20:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qメモリのバンクって何ですか?

はじめて自作に挑戦しています。

で、SOYOのベアボーンが安かったので、買ったんですが、その他のパーツを揃えて組み立てても、起動しません。

ビープ音が鳴っていて、マニュアル見ると、メモリが認識されていないらしいです。

対処法として、
【1】メモリがしっかり刺さっているか確認する
【2】DIMMでは使用するバンクを確認してください。
がホームページの方のFAQにありました。

【1】は何度も確認しましたが、ダメでした。3つあるスロットの全てで試してみましたがこれもダメ。

メモリの方は購入したお店に行って、確認してもらいましたが、不具合はありませんでした。

残るは【2】なんですが、これの意味がわかんないので、教えて下さい。何方か判る方よろしくお願いします。

Aベストアンサー

マザーボードで設定したFSBと、購入したDIMM(SD-RAM)の仕様は
あっているでしょうか?
FSB100MHzでPC66(66MHzです)を使おうとしても、ほぼ確実に動きません。
また、非常にまれにFSB66MHzのマザーボードでPC100(100MHz)を刺して
認識しない物があります。(経験あり)

もしBIOSの設定画面を呼び出せる所まできているのでしたら、
設定によって強制的に認識させる事ができるかもしれません。
SPD(とか言いましたか?DIMMが自分の仕様をマザーボードに教える機能です)を
無視する設定にしておいて、アクセスタイミングを自分で設定します。

まずはこのあたりかと。。。
すいませんが「非緩衝」は聞いたことがありません。
(「ECCでは無い」の誤訳のような気もしますが。。。)

DIMMの場合、バンクは一本のDIMMが一バンクになります。
マニュアルでチェック項目としてあがっていると言うことは、
一本だけ刺す時は、どこに刺すか指定してあるはずです。
(今回は、すべて試したという事ですので、問題解決にはなりませんが)

asucaさんの言われているのは、たぶんx86プロセッサーの
バンク切り替えの話で、ご質問とは関係ないかと思います。

shigatsuさんの言われているのも、3年ほど前までのDOS/V機が
SIMM全盛だった頃の話で、cpuが一度に64bitのデータを読み込むのに対して
SIMMが32bitだったので、2枚一組にしなければならなかった頃の話です。
DIMMでは(今売っているDOS/V機では)関係ありません。

ところで、本当にメモリーの問題なのでしょうか?
ここまでやってだめですと、何か違う可能性もあるような気がします。
(ディップスイッチの設定とか、電源とか。。。)

マザーボードで設定したFSBと、購入したDIMM(SD-RAM)の仕様は
あっているでしょうか?
FSB100MHzでPC66(66MHzです)を使おうとしても、ほぼ確実に動きません。
また、非常にまれにFSB66MHzのマザーボードでPC100(100MHz)を刺して
認識しない物があります。(経験あり)

もしBIOSの設定画面を呼び出せる所まできているのでしたら、
設定によって強制的に認識させる事ができるかもしれません。
SPD(とか言いましたか?DIMMが自分の仕様をマザーボードに教える機能です)を
無視する設定にしておいて、アクセス...続きを読む

QCStringからchar*への型変換について教えてください。

以前の質問に

int型 → CString型/char型

がありましたが、

CString型をchar*型に変換する方法を
教えていただければありがたいです。

MSDNで「LPCTSTRキャスト」が説明されていましたが、
例が載ってないのでよくわかりませんでした。

よろしくお願いします。

Aベストアンサー

目的にもよりますが一時的にchar配列として使いたいならCString::GetBuffer()が利用できます。
char配列としての利用が終わったらCString::ReleaseBuffer()する必要がありますが。

直接CString内の文字列を扱う必要があるならCString::operator LPCTSTRで文字列ポインタが得られます。
ただし、CStringオブジェクトをいじると無効ポインタなる可能性があるので気をつけてください。

MSDNのMicrosoft Foundation Classリファレンス→CString→クラスメンバで確認してください。

Qリファレンス電圧

「リファレンス電圧」とは、なんですか?

分かる方がいましたら、ご教授お願いします。

AD変換と関係があるのでしょうか?

初心者ゆえ、よろしくお願いします。

Aベストアンサー

ANo.1さんとANo.2さんとほとんど同じなのですが、AD変換器とは何かという観点で説明します。

実は、AD変換器というのは電圧を直接測定しているのではありません(!?)。
じゃあ、なぜ電圧が分かるのかというと、電圧のわかっている信号と、測定信号のどちらが大きいか比較しているからです。この「電圧のわかっている信号」というのがリファンス(基準)電圧です。

ただ、単純に比較するだけだと、基準電圧より大きいか小さいかしか分からないので、実際のAD変換器は、この基準電圧のm/n倍の電圧を内部で作って、これと入力信号と比較することで、入力電圧を求めるということをやっています。たとえば、基準電圧がVという電圧のとき、これをm/n倍したのと、入力電圧が等しくなったとすると、入力電圧はV×m/nだったということが分かります。このmやnの値を計算しているのがAD変換器なのです。ただし、mやnの値をどの範囲まで計算できるかはAD変換器によって違っていて、nが大きいほど細かい電圧まで読める(分解能が高い)AD変換器ということになります。例えば16bit分解能のAD変換器はnの値が2^16=65536あって、V×mの数値をV×m/65536刻みの精度で読めるということになります。

このように、リファンス(基準)電圧は、電圧を計算する重要な「ものさし」なので、これををいじってしまうと、AD変換器は間違った答を出してしまいます。このため、この基準電圧は、電圧の値が絶対に正確であることはもちろん、温度が変わったり時間がたっても常に同じ電圧である必要があります。

実際のAD変換器では、回路の内部でこの基準電圧を作っています(温度変化が少なくなるように工夫されています)が、使い方によっては、もっと正確で安定な電圧を基準にしたい場合があります。そのようなときは、外部の準電圧を入れることができるAD変換器もあります。

世の中のAD変換器には、m/nを計算するやりかたの違ういろいろな方法がありますが、しかし基本原理は「基準電圧と入力電圧を比較している」ことです。そのものさしとなる基準電圧がリファレンス電圧ということです。

ANo.1さんとANo.2さんとほとんど同じなのですが、AD変換器とは何かという観点で説明します。

実は、AD変換器というのは電圧を直接測定しているのではありません(!?)。
じゃあ、なぜ電圧が分かるのかというと、電圧のわかっている信号と、測定信号のどちらが大きいか比較しているからです。この「電圧のわかっている信号」というのがリファンス(基準)電圧です。

ただ、単純に比較するだけだと、基準電圧より大きいか小さいかしか分からないので、実際のAD変換器は、この基準電圧のm/n倍の電圧を内部で...続きを読む


人気Q&Aランキング