# TCM (overview)

TCM は Tightly-Coupled Memory の略で、直接 ARM9 コアと接続された高速なメモリです。ARM9バスに接続されていませんので、DMA 中であっても TCM を使用してARM9 が処理を行なうことが出来ます。

TCM には、命令TCM ( ITCM ) とデータTCM ( DTCM ) の２種類があります。ITCM は 32KByte、DTCM は 16KByte の容量を持ちます。ITCM には命令とデータを配置することが可能です。DTCM にはデータのみを配置することは出来、命令を配置することは出来ません。

## イネーブル・ディセーブル

以下の関数で、ITCM、DTCM をそれぞれイネーブル、ディセーブルとすることが出来ます。

`OS_EnableITCM()` ITCM をイネーブルにする。
`OS_DisableITCM()` ITCM をディセーブルにする。
`OS_EnableDTCM()`DTCMをイネーブルにする
`OS_DisableDTCM()` DTCM をディセーブルにする。

## マッピング

ITCM は 32KByte の倍数のアドレスに、DTCM は 16KByte の倍数のアドレスにマッピングすることが可能です。

配置アドレスは以下のようになります。

TCM種類 | 大きさ | 用途 | アドレス
--- | --- | --- | ---
ITCM | 32KB | 命令コード／データ | 0x01FF8000 〜0x01FFFFFF
DTCM | 16KB | データ | 0x027E0000 〜0x027E3FFF (NITRO ROM の場合) (注1) 0x02FE0000 〜0x02FE3FFF (HYBRID / LIMITED ROMの場合) (注2)

(注1) NITRO ROM では、DTCM は 0x027E0000 からとなります。
NITRO ROM を NITRO ハードウェアで動作させるか、TWL ハードウェアで動作させるかは関係ありません。

(注2) HYBRID ROM、LIMITED ROM では、DTCM は 0x02FE0000 からとなります。
TWL モードで動作する場合はもちろんですが、HYBRID ROM をハードに関係なく NITRO モードで動作させる場合も該当します。

このように、DTCM のアドレスは、動作モードによるものではなく、ROM の種類によるものであることにご注意ください。

### ITCM アドレス取得関数

ITCM については取得関数として、`OS_GetITCMAddress()` が用意されており、定数 `HW_ITCM` が取得できます。定数 `HW_ITCM` は デフォルト ITCM の開始アドレスである 0x01FF8000 として定義されています。

### DTCM アドレス取得関数

DTCM については、`OS_GetDTCMAddress()` という関数でマッピングされているアドレスを取得することが出来ます。アドレスを設定する関数は `OS_SetDTCMAddress()` です。DTCM はスタック領域や各種フックベクタなどがマッピングされていており、プログラム動作中にマッピング位置を変更すると暴走する恐れがありますので、一つのプログラムで頻繁に変更することは避けてください。

## TCMに関するCP15設定

ITCM や DTCM の設定は、コプロセッサ15 (CP15) の内部レジスタの設定に依ります。TWL-SDK ではこのレジスタに直接アクセスするAPIを用意しています。ITCM と DTCM それぞれに、レジスタに与える(あるいは読み込む)パラメータの設定関数と取得関数が用意されていますが、これらの関数、特に設定関数の使用に当たっては動作原理を十分に理解する必要があります。

`OS_SetITCMParam()` ITCM のパラメータを設定する。
`OS_GetITCMParam()` ITCM のパラメータを取得する。
`OS_SetDTCMParam()` DTCM のパラメータを設定する。
`OS_GetDTCMParam()` DTCM のパラメータを取得する。

## 参照

`OS関数一覧(TCM)
`

## 履歴

2009/04/13 DTCM のアドレスの間違いを修正
2007/11/28 TWLモードに関する記述を追加
2005/04/13 DTCMのデフォルトアドレスを変更
2004/12/14 用語や語尾など修正
2004/11/09 初版