目次

レジスタ,メモリ構成 ( PIC32MX270F256B )

PIC32MX270F256Bのレジスタ

汎用レジスタ(r0〜r31)、CP0レジスタ、SFR:Special Function Registersのレジスタ群があり、その概要を示します。

汎用レジスタ(r0〜r31)

32個の汎用レジスタ(r0〜r31)と、乗除算用に2 個の特殊レジスタ(HI,LO)があります。
これは、次のように使われます。(60001192B.pdf Table 50-5: Register Conventionsより)
CPU Register SymbolicRegister Usage
r0 zero Always ‘0’(Hardware enforced)
r1 at Assembler Temporary
r2 - r3 v0-v1 Function Return Values
r4 - r7 a0-a3 Function Arguments
r8 - r15 t0-t7 Temporary - Caller does not need to preserve contents
r16 - r23 s0-s7 Saved Temporary - Caller must preserve contents
r24 - r25 t8-t9 Temporary - Caller does not need to preserve contents
r26 - r27 k0-k1 Kernel temporary - Used for interrupt and exception handling
r28 gp Global Pointer - Used for fast-access common data
r29 sp Stack Pointer - Software stack
r30 s8 or fp Saved Temporary - Caller must preserve contents または Frame Pointer - Pointer to procedure frame on stack
r31 ra Return Address (Hardware enforced)
これらは、アセンブラのプログラムで使用されます。C言語のソースは上記慣例に従って、これらレジスタを使うマシンコードにコンパイルします。
なお、PIC32 CPU はハードウェア スタックを備えません。
ソフトウェアを使ってこ実現しますが、「スタックはアドレスが小さくなる方向に変化する」ことを前提にします。

CP0 REGISTERS

ソフトウェアとCPUの間で制御情報設定や取得のために、コプロセッサ0 (CP0) レジスタと呼ぶ特殊レジスタが、 次のように0から31番まで存在します。
(PIC32MX1XX2XX-28-36-44-PIN-DS60001168K.pdf TABLE 3-2: COPROCESSOR 0 REGISTERSより)
Register NumberRegister NameFunction備考
0-6 Reserved M4K マイクロプロセッサ コア内で予約済み
7 HWREna Enables access via the RDHWR instruction to selected hardware registers.
8 BadVAddr(1) 直前に発生したアドレス関連の例外のアドレスを格納します。
9 Count(1) Processor cycle count.
10 Reserved M4K マイクロプロセッサ コア内で予約済み
11 Compare(1) Timer interrupt control.
12 Status(1) Processor status and control.
12 IntCtl(1) Interrupt system status and control.
12 SRSCtl(1) Shadow register set status and control.
12 SRSMap(1) Provides mapping from vectored interrupt to a shadow set.
13 Cause(1) Cause of last general exception.直前の例外の原因を示す
14 EPC(1) Program counter at last exception.
15 PRId Processor identification and revision.
15 EBASE Exception vector base register.割込みベクタのベースアドレス
16 Config Configuration register.
16 Config1 Configuration Register 1.
16 Config2 Configuration Register 2.
16 Config3 Configuration Register 3.
17-22 Reserved M4K マイクロプロセッサ コア内で予約済み
23 Debug(2) Debug control and exception status.
24 DEPC(2) Program counter at last debug exception.
25-29 Reserved M4K マイクロプロセッサ コア内で予約済み
30 ErrorEPC(1) Program counter at last error.
31 DESAVE(2) Debug handler scratchpad register.
Note 1: used in exception processing.(割込み処理で使われます。)
Note 2: used during debug 番号23,24,31のレジスタは、MPLAB ICD 3、PICkit 3 等のデバックで使われる。
CP0 レジスタに書き込む場合、特別なシーケンスにしなければならないものがあります。
また、同じレジスタ番号でもselect番号で、異なるレジスタ情報が操作できます。
C言語では、これらに対する操作関数が存在しています。
例えば、CP0 レジスタ12番のSelect 1で Statusレジスタ情報(60001192B.pdf 50.13.16 Status Register)、
CP0 レジスタ12番のSelect 1で IntCtlの割り込み制御レジスタ情報(60001192B.pdf 50.13.17 IntCtl Register)を 取得するコードを以下に示します。
    unsigned int status = _CP0_GET_STATUS();// Status レジスタ(CP0 レジスタ12、Select 0)で[0x00100001]が得られる
    unsigned int intctl = _CP0_GET_INTCTL();// IntCtl レジスタ(CP0 レジスタ12、Select 1)で[0x00000020]が得られる
この実行で、intctlに[0x00000020]得られると、bit 9-5 VS<4:0>: Vector Spacing bitsが0x01であることからベクタ間隔は32bitであると分かる。

また、9番のレジスタはCountと名前が付いて、これはシステムクロック(SYSCLK) の2 サイクルごとにインクリメントしている情報です。
(消費電力が重視されるアプリケーション向けにCount レジスタを無効にする機能もある。)
そして11番が Compareと名前が付いてCountと同じ値になると、割込みを発生できる。デバック時に停止する制御例を示す。
    _CP0_SET_COUNT(0);//コアタイマを0にセット(CP0の9番レジスタ)
    _CP0_SET_COMPARE(2000000u);// コンペアレジスタに引数の値を設定(コアタイマがそれに達すると割り込み)  
    _CP0_BIC_DEBUG(_CP0_DEBUG_COUNTDM_MASK);// halt core timer and program at a debug breakpoint
    //_CP0_SET_CAUSE(_CP0_GET_CAUSE() | _CP0_CAUSE_IV_MASK);//特殊な割り込みベクタ(0x200) を使う

特殊機能レジスタ(SFR)

特殊機能レジスタ(SFR)はCPUの機能動作や、周辺デバイスの機能、動作を指定するためのレジスタ群です。
以下がSFRを分類した表です。
「PIC32MX1XX2XX-28-36-44-PIN-DS60001168K.pdf TABLE 4-1: SFR MEMORY MAP」より
PeripheralVirtual Address 備考
BaseOffset Start
Watchdog Timer 0xBF800x0000
RTCC 0x0200
Timer1-5 0x0600
Input Capture 1-5 0x2000
Output Compare 1-5 0x3000
IC1 and IC2 0x5000
SPI1 and SPI2 0x5800
UART1 and UART2 0x6000
PMP 0x7000
ADC 0x9000
CVREF 0x9800
Comparator 0xA000
CTMU 0xA200
Oscillator 0xF000
Device and Revision ID 0xF220
Peripheral Module Disable 0xF240
Flash Controller 0xF400 NVMCON,NVMKEY,
Reset 0xF600
PPS 0xFA04
Interrupts 0xBF880x1000
Bus Matrix 0x2000
DMA 0x3000
USB 0x5050
PORTA-PORTC 0x6000
Configuration 0xBFC0 0x0BF0

例えば、上記の「Bus Matrix」の レジスタ群は、次のようになっています。

このレジスタ群の設定で、RAMの一部にプログラムコードが配置できるようになります。( RAM をカーネルデータとカーネルプログラムに分割する)
以下にPIC32MX250F128B(データメモリ:32KB)において、8 Kをのカーネルデータ、残り24Kをプログラムに設定する例を示します。
(この場合、Kernel Program RAM Partition KSEG 0 24 KB は「0x80002000」から始まります。)
    BMXDKPBA = 0x00002000;//8 KB のカーネルデータ (データRAM カーネルプログラム ベースアドレス レジスタ)    
    BMXDUDBA = 0x00008000;//24 KB のカーネルプログラム (データRAM ユーザデータベースアドレス レジスタ)
    BMXDUPBA = 0x00008000;//ユーザデータのサイズ = 0、ユーザプログラムのサイズ = 0(データRAM ユーザプログラム ベースアドレス レジスタ)

メモリマップ

PIC32MX270F256B-I/SOのMicrocontrollersは、256 KB Flash と 64 KB SRAMのメモリを搭載しており、 そのメモリ構造を右記に示します。図において、左が仮想メモリで右が物理メモリです。

物理アドレスの実装空間は、次の領域が存在します。 以上の全てが、このメモリ領域内に存在します。
メモリにアクセスする周辺モジュール(DMA、フラッシュコントローラ等 ) は、物理アドレスを使います。

対して、 仮想アドレスは、CPU による命令のフェッチと実行にだけ使われます。

プロセッサは、大別すると カーネルモードとユーザモードの2つの動作モードがあります。(他にデバックモードあり)
バスマトリクスと呼ぶ仕組みで、各モードに対するメモリの割り当てを制御します。
これに対応して、仮想アドレス空間は 次の2つの主要領域( ユーザ空間とカーネル空間) に分割されています。

KSEG0KSEG1は、 どちらも、同じ物理空間をマッピングします。 つまり、おなじROM 内容が二つの異なるアドレス上に存在しています。
KSEG1はキャッシュされませんが、KSEG0はキャッシュされる分だけ高速に動作できる違いがあります。
プログラムの開始アドレスはCPUの仮想アドレスで0xBFC00000, 物理アドレスで0x1FC00000に固定されています。
つまり、リセット直後はKSEG1領域を使ってそのブートROMから処理を開始します。

当基板に埋め込まれているプログラムは、「 MPLAB-Xという統合開発環境」のC言語を使って開発しましたが、 そのスタートアップルーチンcrt0はKSEG1のブートROMに配置されています。
そして、main関数はKSEG0に配置されており、アップルーチン処理後にキャッシュが有効なKSEG0のmain関数を呼び出しています。
よって、プログラム全体はカーネルモードで動作しています。

つまり、ユーザーモードは使っておりません。 なお、 リセット後の状態では、ユーザモードパーティションは存在しません (BMXPUPBA が「0」に初期化されるため)。
この場合、プログラムフラッシュメモリの全領域は、仮想アドレスKSEG1:0xBD000000 (またはKSEG0:0x9D000000)から始まるカーネルモードプログラム空間に割り当てられます。
ユーザモードプログラム用のパーティションを設定するには、BMXPUPBAを下記のように初期化する必要があります。(DS61115F_JP - p. 3-17からの抜粋)
BMXPUPBA = BMXPFMSZ - USER_FLASH_PGM_SZ
USER_FLASH_PGM_SZ は、ユーザモードプログラムに割り当てるパーティションのサイズです。
BMXPFMSZ は、デバイスが実装するプログラムフラッシュメモリの総容量値を保持するバスマトリクスレジスタです。

ユーザーモードは、本格的にRTOS(Real-time operating system)を実装する場合で必要になるのでしょうが、当基板では利用しておりません。 (それを使う前の基本となるプログラミングを対象にしています。)


当基板で使っているPIC32MX270F256B(データSRAM:64KB)の設定を示します。(「Bus Matrix」の レジスタの設定状態です。)
    BMXDKPBA = 0x00004000;//16 KB のカーネルデータ 
    BMXDUDBA = BMXDKPBA+0x0000C000;//48 KB のカーネルプログラム
    BMXDUPBA = BMXDUDBA;//ユーザデータのサイズ = 0、ユーザプログラムのサイズ = 0 
以上で、16Kをのカーネルデータ、残り48Kをプログラムに設定しています。 Kernel Program RAM Partition KSEG 0 48 KB は「0x80004000」から始まります。