# Blackfin
Blackfin は、デジタルシグナルプロセッサ（DSP）機能を組み込んだ16/32ビットマイクロプロセッサファミリであり、小型で省電力のマイクロコントローラとして使われている。オペレーティングシステムを動作させ、同時にH.264ビデオエンコーディングのような複雑な数値的タスクを並行して行う、低消費電力の統合プロセッサアーキテクチャである。
開発キットがいくつか存在し、Linuxもサポートされている。現在は、アナログ・デバイセズが製造している。

## アーキテクチャ
Blackfin プロセッサは、インテルとアナログ・デバイセズが共同開発した MSA（Micro Signal Architecture）というSIMDアーキテクチャに基づく32ビットRISC MCU プログラミングモデルを使用している。
Blackfin プロセッサアーキテクチャは2000年12月に発表され、2001年6月の Embedded Systems Conference で実物が初公開された。
Blackfin アーキテクチャは、アナログ・デバイセズのSHARCアーキテクチャとインテルのXScaleアーキテクチャのそれぞれの長所を取り入れ、そこにデジタルシグナルプロセッサ機能とマイクロコントローラ機能を統合したものである。Blackfin/MSA と XScale/ARM や SHARC には様々な相違点があるが、統合によって性能とプログラム容易性が向上し、これまでのDSPやRISCにはない低消費電力を実現した。
Blackfin アーキテクチャを実装したCPUは各種あり、それぞれ特定の応用分野を想定している。Blackfin ファミリは下表の通りである。アナログ・デバイセズの製品一覧はこちらにある。
| ﾌﾟﾛｾｯｻ ADSP- | 最大 ｸﾛｯｸ (MHz) | ｺｱ数 | L1 (KB)           | L1 (KB)                 | L2 (KB) | ｵﾝﾁｯﾌﾟ ﾌﾗｯｼｭ | ﾎｽﾄ ﾎﾟｰﾄ | ｺｰﾄﾞｾｷｭﾘﾃｨ | ｲｰｻﾈｯﾄ MAC | SD/ SDIO | PPIs (ﾋﾞｯﾄ) | PPIs (ﾋﾞｯﾄ) | SD-RAM  | USB     | ATAPI | CAN | I²C (TWI) | SPI | UART | SPORT | GPIO (ﾋﾟﾝ) | MXVR |
| ﾌﾟﾛｾｯｻ ADSP- | 最大 ｸﾛｯｸ (MHz) | ｺｱ数 | 命令 SRAM (ｷｬｯｼｭ) | ﾃﾞｰﾀ SRAM (ｷｬｯｼｭ) ｽｸﾗｯﾁ | SRAM    | ｵﾝﾁｯﾌﾟ ﾌﾗｯｼｭ | ﾎｽﾄ ﾎﾟｰﾄ | ｺｰﾄﾞｾｷｭﾘﾃｨ | ｲｰｻﾈｯﾄ MAC | SD/ SDIO | 16          | 18/ 24      | SD-RAM  | USB     | ATAPI | CAN | I²C (TWI) | SPI | UART | SPORT | GPIO (ﾋﾟﾝ) | MXVR |
| ------------ | --------------- | ---- | ----------------- | ----------------------- | ------- | ------------ | -------- | ---------- | ---------- | -------- | ----------- | ----------- | ------- | ------- | ----- | --- | --------- | --- | ---- | ----- | ---------- | ---- |
| BF5221       | 600             | 1    | 64 (16)           | 64 (32) 4               | -       | -            | Yes      | Yes        | -          | -        | 1           | 0           | SDR x16 | -       | -     | -   | 1         | 1   | 2    | 2     | 48         | -    |
| BF5251       | 600             | 1    | 64 (16)           | 64 (32) 4               | -       | -            | Yes      | Yes        | -          | -        | 1           | 0           | SDR x16 | 2.0 OTG | -     | -   | 1         | 1   | 2    | 2     | 48         | -    |
| BF5271       | 600             | 1    | 64 (16)           | 64 (32) 4               | -       | -            | Yes      | Yes        | 1          | -        | 1           | 0           | SDR x16 | 2.0 OTG | -     | -   | 1         | 1   | 2    | 2     | 48         | -    |
| BF542        | 600             | 1    | 64 (16)           | 64 (32) 4               | -       | -            | -        | Yes        | -          | 1        | 1           | 0           | DDR x16 | 1       | 1     | 1   | 1         | 2   | 3    | 3     | 152        | -    |
| BF544        | 533             | 1    | 64 (16)           | 64 (32) 4               | 64      | -            | Yes      | Yes        | -          | -        | 1           | 1           | DDR x16 | -       | -     | 2   | 2         | 2   | 3    | 3     | 152        | -    |
| BF548        | 600             | 1    | 64 (16)           | 64 (32) 4               | 128     | -            | Yes      | Yes        | -          | 1        | 1           | 1           | DDR x16 | 2.0 OTG | 1     | 2   | 2         | 3   | 4    | 4     | 152        | -    |
| BF549        | 533             | 1    | 64 (16)           | 64 (32) 4               | 128     | -            | Yes      | Yes        | -          | 1        | 1           | 1           | DDR x16 | 2.0 OTG | 1     | 2   | 2         | 3   | 4    | 4     | 152        | 1    |
| BF531        | 400             | 1    | 32 (16)           | 16 (16) 4               | -       | -            | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | -   | -         | 1   | 1    | 2     | 16         | -    |
| BF532        | 400             | 1    | 48 (16)           | 32 (32) 4               | -       | -            | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | -   | -         | 1   | 1    | 2     | 16         | -    |
| BF533        | 600             | 1    | 80 (16)           | 64 (32) 4               | -       | -            | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | -   | -         | 1   | 1    | 2     | 16         | -    |
| BF534        | 500             | 1    | 64 (16)           | 64 (32) 4               | -       | -            | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 1         | 1   | 1    | 2     | 48         | -    |
| BF536        | 500             | 1    | 64 (16)           | 32 (32) 4               | -       | -            | -        | -          | 1          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 1         | 1   | 1    | 2     | 48         | -    |
| BF537        | 600             | 1    | 64 (16)           | 64 (32) 4               | -       | -            | -        | -          | 1          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 1         | 1   | 1    | 2     | 48         | -    |
| BF538        | 500             | 1    | 80 (16)           | 64 (32) 4               | -       | -            | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 2         | 3   | 3    | 4     | 54         | -    |
| BF538F       | 500             | 1    | 80 (16)           | 64 (32) 4               | -       | 512 1024     | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 2         | 3   | 3    | 4     | 54         | -    |
| BF539        | 500             | 1    | 80 (16)           | 64 (32) 4               | -       | -            | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 2         | 3   | 3    | 4     | 38         | 1    |
| BF539F       | 500             | 1    | 80 (16)           | 64 (32) 4               | -       | 512 1024     | -        | -          | -          | -        | 1           | -           | SDR x16 | -       | -     | 1   | 2         | 3   | 3    | 4     | 38         | 1    |
| BF561        | 600             | 2    | 64 (16) per core  | 64 (32) 4 per core      | 128     | -            | -        | -          | -          | -        | 2           | -           | SDR x32 | -       | -     | -   | -         | 1   | 1    | 2     | 48         | -    |
| BF535        | 350             | 1    | 16                | 32 4                    | 256     | -            | -        | -          | -          | -        | -           | -           | SDR x16 | 1.1     | -     | -   | -         | 2   | 2    | 2     | 16         | -    |

1 BF52xC ファミリには、48kHz、ステレオ音声CODEC (2xADCs, 2xDACs) が内蔵されている。
上の表に付け加えると、Blackfin プロセッサには共通して以下の周辺機器が内蔵されている。
- デバッグ/JTAGインタフェース
- リアルタイムクロック
- コア電圧スイッチング電源
- ウォッチドッグタイマー
- タイマー/PWM 出力/PWM 入力ポート
- コアタイマー（コアのクロック周波数で動作するタイマー）


## 機能

### コア機能
Blackfin のコアが何であるかは、見方によって異なる。
- 一部の人にとっては、デジタルシグナルプロセッサがコアである。16ビットMACを2個、40ビットALUを2個、40ビットバレルシフタ1個備えている。そのため、同時に3個の命令を実行できる（コンパイラ最適化またはプログラマの技量による）。
- 他の人にとっては、新たなRISCコアである。メモリ保護機能を持ち、CPUモード（ユーザー、カーネル）があり、シングルサイクル・オペコードで、データキャッシュと命令キャッシュを内蔵し、ビット/バイト/ワードテスト命令があり、各種オンチップ周辺機器がある。

ISAも高度な表現能力を有し、アセンブラプログラマやコンパイラがハードウェア機能を利用してアルゴリズムを高度に最適化することを可能にしている。

### メモリとDMA
Blackfin はバイト単位のアドレス指定が可能な平坦なメモリ空間を使っている。内蔵L1メモリ、内蔵L2メモリ、外部メモリ、メモリマップされた制御レジスタ群などは、全てこの32ビットアドレス空間に存在している。
L1内蔵SRAMメモリは、ハーバード・アーキテクチャであり、コアのクロック速度で動作する。命令メモリとデータメモリは、それぞれ独立してコアと専用メモリバスで接続されていて、コアとL1メモリ間では高速なデータ転送が可能となっている。
L1メモリは、命令とデータそれぞれ独立してキャッシュメモリとして使うこともできる。
一部のBlackfinプロセッサには64KBから256KBのL2メモリがある。このメモリはコアのクロック速度より遅い。L2メモリ上では命令とデータが混在可能である。
Blackfinプロセッサは外部メモリとして SDRAM、DDR-SDRAM、NORフラッシュ、NANDフラッシュ、SRAM をサポートしている。また、一部のBlackfinには ATAPI や SD/SDIO といったインタフェースがサポートされている。これらは、外部メモリ空間として数百メガバイトをサポート可能である。
コアとメモリシステムの組み合わせでDMAエンジンを構成でき、任意の周辺機器と主メモリ（および外部メモリ）との間でやり取りが可能である。プロセッサは各周辺機器と専用のDMAチャンネルを持っていて、リアルタイムの動画エンコーディング/デコーディングなども可能とする程度の高いスループットを提供している。

### マイクロコントローラとしての機能
Blackfinアーキテクチャは、マイクロプロセッサやマイクロコントローラに共通して見られる特徴を備えている。これによってBlackfinは商用またはオープンソースの各種オペレーティングシステムを効率的に実行できるようになっている。
メモリ保護ユニット（Memory Protection Unit、MPU）
全てのBlackfinプロセッサに内蔵されている。MPUは、メモリ空間全体について保護とキャッシュ戦略を提供する。これによって、ThreadX、µC/OS-II、Linux といったRTOSやカーネルが動作可能となっている。MPU はいわゆるメモリ管理ユニット（MMU）にあるようなアドレス変換機構は持たないため、仮想記憶やプロセス毎のアドレス空間はサポートしていない。このため、Blackfinでは仮想記憶を前提とした WinCE や QNX のようなOSはサポートできない。なお、Blackfin の文書には MPU を MMU と呼んでいるものが多いので注意が必要である。
ユーザー/スーパーバイザーモード
Blackfinには、スーパーバイザー、ユーザー、エミュレーションの3つのCPUモードがある。スーパーバイザーモードでは、全プロセッサリソースにアクセス可能である。しかし、ユーザーモードでは、システムリソースやメモリ領域を保護できる（MPUの機能を利用）。最近のOSでは、カーネルがスーパーバイザーモードで動作し、通常のスレッド/プロセスはユーザーモードで動作する。スレッドはクラッシュしたり、保護されたリソース（メモリ、周辺機器、その他）にアクセスしようとしたとき、例外が発生し、カーネルが問題のスレッド/プロセスを停止させる。
可変長RISC風命令セット
Blackfinの命令は、16ビット、32ビット、64ビットのものがある。よく使われる制御命令は16ビットで、DSPなどの命令は32ビットや64ビットになっている。これによって、コード密度を高めている。Blackfinの命令セットには、動画や画像の圧縮・伸張アルゴリズムに使われるピクセル処理の補助となる media processing extensions が含まれている。

## 周辺機器
Blackfin プロセッサは、様々な周辺機器接続手段を有する。
- USB 2.0 OTG (On-The-Go)
- ATAPI
- MXVR : MOST (Media Oriented Systems Transport) Network Interface Controller。MOST は SMSCの登録商標である。
- PPI (Parallel Peripheral Interface) : パラレル入出力ポート。LCD、ビデオエンコーダ（ビデオDAC）、ビデオデコーダ（ビデオADC）、CMOSイメージセンサ、CCDイメージセンサその他のデバイスを接続できる。PPIは最高65MHzまでの速度で動作し、8ビットから16ビット幅で構成可能である。
- SPORT : 同期式の高速シリアルポート。TDM、I2S（Inter-IC Sound）などの転送モードをサポートし、ADC、DAC、他のプロセッサ、FPGA などと接続する。
- CAN : 自動車や産業用エレクトロニクスでよく使われている広域かつ低速なシリアルバス。
- UART（Universal Asynchronous Receiver Transmitter）: RS-232機器（PC、モデム、PC周辺機器など）、MIDI機器、IrDA機器との双方向通信を可能にする。
- SPI : 組み込みシステム向けの高速シリアルバス。
- I²C : 低速シリアルバス。

全ての周辺制御レジスタは通常のアドレス空間内にメモリマップされているため、設定は容易である。

## 開発ツール
アナログ・デバイセズは独自の開発ツール CROSSCORE（VisualDSP++）を提供しているが、それ以外にも Green Hills Software の MULTI IDE、Blackfin 向けGNUコンパイラコレクション、National Instruments の LabVIEW Embedded Module などがある。

## サポートOS
Blackfin をサポートするOSを下表に示す。
| 名称                          | 種類                | 備考                                                              |
| ----------------------------- | ------------------- | ----------------------------------------------------------------- |
| µClinuxディストリビューション | オープンソース/GPL  | 通常のLinuxカーネルに統合されており、各種アプリケーションがある。 |
| ThreadX                       | 商用                |                                                                   |
| Nucleus                       | 商用                |                                                                   |
| Fusion RTOS                   | 商用                |                                                                   |
| µC/OS-II                      | 商用/ソース利用可能 |                                                                   |
| velOSity                      | 商用                |                                                                   |
| INTEGRITY                     | 商用                |                                                                   |
| RTEMS                         | オープンソース/GPL  |                                                                   |
| T2 SDE                        | オープンソース/GPL  |                                                                   |
| VDK                           | 商用                | アナログ・デバイセズのリアルタイム・カーネル。VisualDSP++ に同梱  |
| TOPPERS/JSP                   | オープンソース      | μITRON4.0仕様                                                     |