4

以下は、コンピュータエンジニアリングコースの最後のテストで出された質問の例です。それぞれの開始/終了アドレスを取得する方法を私に説明してもらえますか?一番下に正解を記載しました...

MSP430F2410デバイスのアドレス空間は64KB(基本的なMSP430アーキテクチャ)です。次のことがわかっている場合は、以下の表に記入してください。アドレス空間の最初の16バイト(アドレス0x0000から開始)は特殊機能レジスタ(IE1、IE2、IFG1、IFG2など)用に予約され、次の240バイトは8ビット周辺機器用に予約されています。 256バイトは16ビット周辺機器用に予約されています。RAMメモリ容量は2Kバイトで、アドレス0x1100から始まります。アドレス空間の上部には、コードおよび割り込みベクタテーブル用に予約された56KBのフラッシュメモリがあります。

開始アドレス終了アドレス
特殊機能レジスタ(16バイト)0x0000 0x000F
8ビット周辺機器(240バイト)0x0010 0x00FF
16ビット周辺機器(256バイト)0x0100 0x01FF
RAMメモリ(2キロバイト)0x1100 0x18FF
フラッシュメモリ(56キロバイト)0x2000 0xFFFF
4

2 に答える 2

4

手始めに、各セグメントに保存されているものに惑わされないでください-それはあなたを混乱させるだけです。問題は、16進数の番号付けを理解するように求めることだけであり、それはそれほど難しいことではありません。要件は次のとおりです。

  • 合計64KBのメモリ
  • アドレス空間の最初の16バイト(アドレス0x0000から開始)は、特殊機能レジスタ(IE1、IE2、IFG1、IFG2など)用に予約されています。
  • 次の240バイトは8ビット周辺機器用に予約されています
  • 次の256バイトは16ビット周辺機器用に予約されています
  • RAMメモリ容量は2Kバイトで、アドレス0x1100から始まります。
  • アドレス空間の上部には、コードおよび割り込みベクタテーブル用に予約された56KBのフラッシュメモリがあります。

メモリアドレスの各16進数は16の値(0-F)を処理できるため、64KBのメモリ(16 ^ 4 = 65536、つまり64K)を表示するには4桁が必要です。

あなたは16バイトから始めます、そしてそれは0x0000-0x000F(あなたのアドレスの1桁の完全な数字)をカバーします。つまり、直後に開始する次のセグメント(8ビットデバイス)は0x0010(次のバイト)で始まり、240バイトの長さであるため、バイト256(240 + 16)または0x00FFで終了します。

次のセグメント(16ビットデバイス)は、次のバイト(0x0100)で始まり、長さは256バイトです。これにより、0x01FFで終わります。

次に、2KB(2048バイト)のRAMが搭載されますが、説明にあるように、前のセグメントの直後ではなく、0x1100から開始されるため、これが開始アドレスになります。それに2048を追加すると、0x18FFが得られます。

最後のセグメントはメモリの上部をカバーしているため、逆方向に作業する必要があります。0xFFFF(使用可能なメモリの終わり)で終了し、56KBの長さです。56KBを16進数に変換すると、0xDFFFになります。このセグメントが0で始まると想像すると、2000は未使用のままになります(0xE000-0xEFFFおよび0xF000-0xFFFF)。したがって、このセグメントは、メモリスペースの上限で終了するために0x2000で開始する必要があることがわかります。

それがもっと明確になることを願っていますが、私がそれを読んだとき、それがまったく助けになるかどうかはわかりません:(多分それが私がその概念をより資格のある誰かに教えることを任せる理由です...

于 2010-05-10T14:33:04.787 に答える
0
#define NUM_SIZES 5
uint16_t sizes[5] = {16, 240, 256, 2 * 1024, 56 * 1024};
uint16_t address = 0;
printf("Start   End\n");
for (int i = 0; i < NUM_SIZES; i++)
{
    printf("0x%04X 0x%04X\n", address, address + sizes[i] - 1);
    address += sizes[i];
}
于 2010-05-10T14:22:36.893 に答える