まず、本実施例のDMA制御装置、マイクロコントローラおよびDMA制御方法を詳述する前に、図1および図2を参照して、DMA制御装置の一例およびその問題点を説明する。図1は、マイクロコントローラの一例を示すブロック図である。
図1に示されるように、マイクロコントローラ(MCU)は、DMA制御装置(DMAコントローラ:DMAC)1,メモリ(SRAM)2,CPUコア(CPU)3,複数の周辺回路(ペリフェラル#0〜#3)およびそれらを繋ぐバス5などを含む。
ここで、例えば、ペリフェラル#0は、シリアルペリフェラルインターフェース(Serial Peripheral Interface:SPI)であり、ペリフェラル#1は、汎用入出力ポート(General Purpose Input/Output:GPIO)である。さらに、例えば、ペリフェラル#2は、タイマ(Timer)であり、ペリフェラル#3は、アナログ-デジタル変換器(Analog-to-Digital Converter:ADC)である。
また、図23を参照して後に詳述するように、例えば、ペリフェラル#0(SPI)は、SPIインターフェース(I/F)を介して外部の無線モジュールに接続され、ペリフェラル#1(GPIO)は、外部のセンサー電源に接続される。さらに、例えば、ペリフェラル#3(ADC)は、ADC I/Fを介して外部の温度センサーに接続される。そして、これらペリフェラル#0〜#3,DMAC1,SRAM2およびCPUコア3は、例えば、32ビットバス5を介して相互に接続されている。
なお、ペリフェラル#0〜#3の数および種類、並びに、バス5のビット幅(32ビット)などは、単なる例であり、様々な構成があり得るのはいうまでもない。また、DMA制御装置が設けられたMCUは、様々な電子機器に対して幅広く適用することができるが、例えば、低消費電力が求められるワイヤレスセンサーネットワークの無線端末(ワイヤレスセンサーノード)に適用することができる。
図2は、DMA制御装置の一例における設定レジスタ構成を示すブロック図であり、基本機能設定レジスタを示すものである。図2に示されるようにDMAC(DMA制御装置)1は、基本機能設定レジスタとして、コンフィギュレーションレジスタ(DMAC_CONFIG)101、DMAC_DST(デスティネーションアドレスレジスタ)102、および、ソースアドレスレジスタ(DMAC_SRC)103などを含む。
DMAC1は、DMAC_SRC 103で指定されたアドレスから始まりDMAC_CONFIG 101で指定された区間のアドレスまでのデータを読み出し、それを、DMAC_DST 102で指定されたアドレスから始まりDMAC_CONFIG 101で指定された区間のアドレスまで書き込む機能を持つ。このように、あるアドレスから始まる一定領域のデータを別のあるアドレスから始まる一定領域にコピーする処理を、タスクと呼ぶことにする。
このように、例えば、データのコピーを、DMAC1を用いて行うことで、その間、CPUコア3は、別の処理プログラムを実行できるというメリットがある。また、消費エネルギー(消費電力)に関して、CPUコア3とDMAC1を比較すると、回路サイズは、一般的にDMAC1の方が小さく、CPUコア3上で動作するプログラムでデータをコピーした場合には、DMAC1で行った場合よりも消費電力が大きくなる。
これは、CPUコア3でデータのコピーを行うと、例えば、プログラムが格納されているSRAM(或いは、図示しないフラッシュメモリ)2からのプログラム読み出しなどにエネルギーを消費し、また、CPUコア3自体の電力消費も大きいためである。そのため、例えば、ワイヤレスセンサーノードなどの低消費電力が強く求められる場合を始めとして、DMAC1でデータのコピーを行うのが好ましい。
ところで、DMACに1つのタスクを実行させるためには、DMAC_SRC 103、DMAC_DST 102およびDMAC_CONFIG 101の設定を行うことになるが、通常、これらのレジスタへの設定値の書き込みは、CPUコア3により行われる。
そこで、複数のタスクに対応したDMAC_SRC 103、DMAC_DST 102およびDMAC_CONFIG 101の設定内容を予めSRAM2に格納しておき、タスクを開始するタイミングになったら、DMAC1がSRAM2から設定内容を読み出してタスクを実行するものが考えられる。すなわち、CPUコア3の介在なしに、複数のタスクを連続実行できるスキャッタギャザー機能(Scatter-Gather機能:スキャッタギャザーモード)を備えるDMAC1が提案されている。
しかしながら、図1を参照して説明したように、MCUは、周辺回路(ペリフェラル#0〜#3)として、GPIOやADC、或いは、SPI,I2CおよびUART(Universal Asynchronous Receiver Transmitter)などのシリアルI/Fを搭載している。
さらに、MCUは、周辺回路として、タイマ、DAC(Digital-to-Analog Converter)およびPWM(Pulse Width Modulation)などを搭載している。これら周辺回路の制御およびデータのやりとりは、周辺回路ごとに備わっている各種レジスタを介して行われる。
具体的に、例えば、GPIOでは、GPIO_MODE(入出力モードレジスタ),GPIO_OUT(出力データレジスタ)およびGPIO_IN(入力データレジスタ)が備わっている。そして、GPIO_MODEに書き込む値によってポートの入出力方向を制御し、入力モードの時は、GPIO_INの値を読み出すことによってMCUの外部からGPIOに入力されている電圧レベルの値を知ることができる。また、出力モードの時は、GPIO_OUTに値を書き込むことによってMCUの外部に出力する信号の電圧レベルを高レベル『H』または低レベル『L』のいずれかに切り替えることができる。
さらに、例えば、UARTなどのシリアルI/Fでは、ContReg(制御レジスタ)とDataReg(データレジスタ)が備わっており、データを出力したいときはDataRegに出力したい値を書き込み、その後、ContRegにデータ出力を指示する値を書き込む。これにより、例えば、UARTから所望のデータを出力させることができる。
ところで、近年、スキャッタギャザーモードで次のタスク開始のトリガー信号として、周辺回路からの様々な状態信号を利用できるようにしたMCUが提案されている。ここで、トリガー信号は、例えば、GPIO(ペリフェラル#1)41で所定の値を受信したとき、または、ADC(ペリフェラル#3)43でのデータ変換が完了したときを検出して出力される信号である。
或いは、トリガー信号は、例えば、SPI(ペリフェラル#0)40でのデータ送信または受信が完了したとき、または、タイマ(ペリフェラル#2)42のカウント値が所望の値になったときを検出して出力される信号である。若しくは、トリガー信号は、例えば、DACでの出力が完了したとき、または、PWMでの出力が完了したなどを検出して出力される信号である。
このように、スキャッタギャザーモードとスキャッタギャザーモードで実行するタスク開始のトリガー信号として種々の信号が使える機能を組み合わせると、周辺回路(ペリフェラル#0〜#3等)の制御を、CPUコア3を動作させないで行うことができる。
上述したように、周辺回路の制御は、各周辺回路に備わった各種レジスタへの書き込みおよび読み出しで行うことができる。ここで、使用するレジスタへの書き込みおよび読み出しは、タスクとしてDMAC1で行い、そのタスクの起動タイミングは、各種トリガー信号を利用すればよい。
このとき、周辺回路の複数のレジスタへの書き込みや読み出しを行うことになるが、通常これらのレジスタアドレスは連続しているとは限らない。そのため、例えば、DMAC1は、書き込みや読み出しを行うレジスタごとに1つのタスクとして実行することになるため処理サイクルが増大し、消費電力の増大を招くことになる。
なお、複数回の不連続なアドレスに対するDMACによるアクセス効率化のために、基準アドレスと相対アドレスを用いて1つのタスクで実行することが考えられる。しかしながら、周辺回路の操作で頻出するレジスタへ1回だけ書き込んだり読み出したりするタスクを行う場合、処理サイクルを削減することは困難である。
以下、本実施例のDMA制御装置、マイクロコントローラおよびDMA制御方法を、添付図面を参照して詳述する。図3は、DMA制御装置の第1実施例における設定レジスタ構成を示すブロック図である。
図3に示されるように、第1実施例のDMA制御装置(DMAC)1は、図2を参照して説明した基本機能設定レジスタ101〜103に対応する11〜13と共に、スキャッタギャザー設定レジスタ14〜16を含む。
すなわち、DMAC1は、基本機能設定レジスタとして、コンフィギュレーションレジスタ(DMAC_CONFIG)11、DMAC_DST(デスティネーションアドレスレジスタ)12、および、ソースアドレスレジスタ(DMAC_SRC)13などを含む。
前述したように、DMAC1は、DMAC_SRC13で指定されたアドレスからDMAC_CONFIG11で指定された区間までのデータを読み出し、そのデータを、DMAC_DST12で指定されたアドレスからDMAC_CONFIG11で指定された区間まで書き込む機能を有する。ここで、本第1実施例のDMAC1において、基本機能設定レジスタのDMAC_SRC13は、イミディエイト(即値)レジスタ(DMAC_IMMEDIATE)とすることができる。すなわち、レジスタDMAC_SRC13は、設定ビットの値によってDMAC_IMMEDIATEとして使うようになっている。
また、DMAC1は、スキャッタギャザー設定レジスタとして、実行するタスク数を設定するレジスタ(DMAC_TASK_NUM)14および最初に実行するタスク(#0)の基本機能設定レジスタの内容が格納されたアドレスを設定するレジスタ(DMAC_TASK_ADDR)15を含む。これらDMAC_TASK_NUM14およびDMAC_TASK_ADDR15は、例えば、図2に示すDMACに設けられていてもよい。本第1実施例のDMAC1は、さらに、スキャッタギャザー設定レジスタとして、スキャッタギャザー動作(モード)の切り替え用のレジスタ(DMAC_SCATTER:第1レジスタ)16が追加されている。
図3に示されるように、DMAC_SCATTER16は、例えば、タスク#0〜#15の16個のタスクに対して32ビットが割り当てられ、タスクごとに2ビットで4つの値が設定できるようになっている。すなわち、DMAC_SCATTER16により、スキャッタギャザーで順次実行するタスクの動作をそれぞれ2ビットで設定し、設定によって各タスクでの処理内容を変更するようになっている。
図4は、図3に示すDMA制御装置における基本機能の動作を説明するための図である。ここで、図4は、各基本機能設定レジスタ(DMAC_CONFIG11、DMAC_DST12,DMAC_SRC13)の詳細と通常の(スキャッタギャザーモードでない)タスクを1つ処理する際におけるデータのコピーの様子を示している。
具体的に、DMAC1における基本機能の動作の例として、レジスタDMAC_CONFIG11、レジスタDMAC_DST12およびレジスタDMAC_SRC13に対して、次の値(アドレス)を設定した場合を考える。
DMAC_CONFIG = 0x0000_0003
DMAC_DST = 0x0000_2400
DMAC_SRC = 0x0000_1000
すなわち、DMAC_CONFIG11には、コピーしたいデータの数(3個:0x0000_0003)を設定し、DMAC_SR13Cには、コピー元の先頭アドレス(0x0000_1000)を設定し、DMAC_DST12には、コピー先の先頭アドレス(0x0000_2400)を設定する。
さらに、各基本機能設定レジスタ11〜13に対して、上記のように設定(レジスタに書き込み(write))した後、DMAC_ENABLEに対して、次の値を設定する。
DMAC_ENABLE = 0x0000_00001
或いは、各基本機能設定レジスタ11〜13に対して所望の値を書き込んだ後、レジスタDMAC_START(図示しない)に対して「1(通常の1つのタスク実行開始を指示する値)」を書き込む。
これにより、図4に示されるように、DMAC1は、0x0000_1000から0x0000_1008のデータ(データ数=3)が、バス5を介して読み出(read)され、0x0000_2400から0x0000_2408に対して、バス5を介して書き込まれる(3つの32ビットデータがコピーされる)。
図5は、図3に示すDMA制御装置におけるスキャッタギャザー機能の動作を説明するための図であり、スキャッタギャザーモードを実行する際、複数タスクの実行にDMAC_CONFIG11,DMAC_DST12,DMAC_SRC13の値がどのように読み出されるかを示している。
なお、スキャッタギャザー設定レジスタのDMAC_TASK_NUM14には、実行したいタスクの数が設定され、DMAC_TASK_ADDR15には、複数のタスクの実行に使用するレジスタの値が格納されているメモリ(SRAM2)のアドレスが設定される。
まず、SRAM2に対して、タスク#0〜#2を実行するための基本機能設定レジスタの内容を準備しておく。すなわち、図5に示されるように、3つのタスク#0〜#2に対応したDMAC_SRC13、DMAC_DST12およびDMAC_CONFIG11の設定内容を予めSRAM2に格納しておく。
具体的に、DMAC_TASK_NUM14(スキャッタギャザーで実行するタスク数)=3とし、DMAC_TASK_ADDR15(最初に実行するタスク#0の基本機能設定レジスタの内容が保存されているアドレス)=0x2000_0000を設定する。
すなわち、DMAC_TASK_NUM=3,DMAC_TASK_ADDR=0x20000000が設定されているとき、例えば、レジスタDMAC_START(図示しない)に「2(スキャッタギャザーモード実行開始を指示する値)」を書き込むことで、DMAC1はスキャッタギャザーモードを開始する。
最初、DMAC_TASK_ADDR15に書き込まれているアドレスから順にSRAM2の値を読み出してDMAC_SRC13,DMAC_DST12,DMAC_CONFIG11にコピーし、これら3つのレジスタの値に基づいて、DMAC1は、タスク#0を実行する。すなわち、図5に示されるように、スキャッタギャザー機能(モード)を起動すると、DMAC1は、SRAM2の0x2000_0000から0x2000_0008の値を基本機能設定レジスタ(DMAC_SRC13,DMAC_DST12,DMAC_CONFIG11)にコピーし、タスク#0を実行する。
また、タスク#0が完了したら、DMAC1は、SRAM2の0x2000_000Cから0x2000_0014の値を読み出して基本機能設定レジスタにコピーし、これら3つのレジスタの値に基づいてタスク#1を実行する。さらに、DMAC1は、タスク#1と同様に、タスク#2も実行する。
図6は、図3に示すDMA制御装置の設定レジスタ構成の一例を説明するための図である。図3を参照して説明したように、各タスク#0〜#15の設定ビットとしては2ビットが割り当てられているため、設定ビットの値(モード)としては、『0』〜『3』の4つを設定することができる。
すなわち、図6に示されるように、設定ビットの値(設定値)が『0』のとき、DMAC1は、通常の(一般的な)スキャッタギャザーに対応した動作を行う。また、設定値が『1』のとき、DMAC1は、SRAM2からDMAC_CONFIG11の設定値を読み出さずに、例えば、DMAC1が直接DMAC_CONFIG = 0x0000_0001としてタスクを実行する。
さらに、設定値が『2』のとき、DMAC1は、例えば、SRAM2からコピー元データの読み出しをせずに、タスク実行の際、DMAC_SRC13に書かれた値をDMAC_DST12に書き込み、書き込み値を即値指定する。そして、設定値が『3』のとき、DMAC1は、SRAM2からDMAC_CONFIG11の設定値を読み出さずに、例えば、DMAC1が直接DMAC_CONFIG = 0x0000_0001とし、かつ、書き込み値を即値指定する。
このように、第1実施例のDMA制御装置は、例えば、スキャッタギャザーモードで実行されるタスクは4つの動作モード(設定値『0』〜『3』)を備え、16個分のタスク(#0〜#15)について、それぞれ動作モードを設定できるようになっている。
次に、図7〜図10を参照して、上述した設定ビット=0〜3の動作を説明する、なお、図7〜図10に示すフローチャートおいて、太線の処理ブロックは、バス5を介したSRAM2(メモリ)からの読み出しアクセス処理を示し、二重線の処理ブロックは、バス5を介したSRAM2への書き込みアクセス処理を示す。
図7は、図6に示す設定レジスタ構成において、設定ビット=0(設定値が『0』)の動作の一例を説明するためのフローチャートである。上述したように、設定値が『0』のときの動作は、通常のスキャッタギャザーモードの処理と同様のものである。
図7に示されるように、設定値が『0』のとき、タスク設定および実行処理が開始すると、ステップST01において、SRAM2からDMAC_SRC13の値を読み出してDMAC_SRC13に設定し、ステップST02に進む。
ステップST02では、SRAM2からDMAC_DST12の値を読み出してDMAC_DST12に設定し、ステップST03に進み、SRAM2からDMAC_CONFIG11の値を読み出してDMAC_CONFIG11に設定し、ステップST04に進む。
ステップST04では、DMAC_SRC13に設定された値(コピー元の先頭アドレス)を読み出し、ステップST05に進んで、DMAC_DST12に設定された値(コピー先の先頭アドレス)に、読み出した値(データ)を書き込む。
ここで、ステップST01〜ST04の処理は、バス5を介したSRAM2からの読み出しアクセスになり、ステップST05の処理は、バス5を介したSRAM2への書き込みアクセスになる。
さらに、ステップST06に進んで、DMAC_SRC13を「+4」インクリメントし、また、ステップST07に進んで、DMAC_DST12を「+4」インクリメントし、ステップST08に進む。ここで、ステップST06およびST07における「+4」のインクリメントは単なる例であり、「+4」に限定されるものではない。
ステップST08では、DMAC_CONFIG11のデータ数を「−1」デクリメントし、ステップST09に進んで、データ数が1以上かどうか(データ数≧1)を判定する。ステップST09において、データ数≧1が成立すると判定すると、ステップST04に戻って同様の処理を繰り返し、データ数≧1が成立しない、すなわち、データ数が存在しないと判定すると、タスク設定および実行処理を完了(終了)する。
図8は、図6に示す設定レジスタ構成において、設定ビット=1(設定値が『1』)の動作の一例を説明するためのフローチャートである。図8と、上述した図7の比較から明らかなように、設定値が『1』のとき、図7におけるステップST03の処理は、ステップST13に示されるバス5を使用しない処理に置き換えられている。
なお、図8におけるステップST11,ST12およびST14〜ST19の処理は、図7におけるステップST01,ST02およびST04〜ST09の処理と同様のものであり、その説明は省略する。
図8に示されるように、ステップST12において、SRAM2からDMAC_DST12の値を読み出してDMAC_DST12に設定した後、ステップST13に進んで、DMAC1がDMAC_CONFIG11のデータ数を「1」に設定する。すなわち、設定値が『1』のとき、DMAC1は、SRAM2からDMAC_CONFIG11の設定値を読み出さずに、DMAC_CONFIG = 0x0000_0001として、直接、データ数を「1」に設定する。
なお、設定値が『1』のとき、上述したように、DMAC1が直接DMAC_CONFIG = 0x0000_0001としている(データ数を1に設定している)ので、ステップST19の判定は、必ずNOになってタスク設定および実行処理を完了することになる。
このように、設定値が『1』のときは、図7を参照して説明した設定値が『0』の処理におけるステップST03のバス5を介したSRAM2からの読み出しアクセスをなくすことができ、バスを介したメモリアクセスを1回削減することが可能になる。
図9は、図6に示す設定レジスタ構成において、設定ビット=2(設定値が『2』)の動作の一例を説明するためのフローチャートである。図9と、前述した図7の比較から明らかなように、設定値が『2』のとき、図7におけるステップST01の処理は、ステップST21のように、レジスタDMAC_IMMEDIATE(13)を使用した処理に置き換えられている。
さらに、図7におけるステップST04およびST05の処理は、ステップST24の処理に置き換えられている。なお、図9におけるステップST22,ST23およびST25〜ST28の処理は、図7におけるステップST02,ST03およびST06〜ST09の処理と同様のものであり、その説明は省略する。
図9に示されるように、設定値が『2』のとき、タスク設定および実行処理が開始すると、ステップST21において、SRAM2からDMAC_IMMEDIATE13の値を読み出して、DMAC_IMMEDIATE13に設定し、ステップST22に進む。
さらに、ステップST22において、SRAM2からDMAC_DST12の値を読み出してDMAC_DST12に設定し、ステップST23で、SRAM2からDMAC_CONFIG11の値を読み出してDMAC_CONFIG11に設定した後、ステップST24に進む。
ステップST24では、DMAC_DST12に対してDMAC_IMMEDIATE13の値を書き込む。すなわち、DMAC_DST12で示されるアドレスに書き込む値は、DMAC_IMMEDIATE(DMAC_SRCと共用)13になるため、書き込む値を、SRAM2を介して読み出す処理(図7におけるステップST04)が不要になる。その結果、前述した設定値が『0』の場合と比較して、メモリからの値の読み出し処理を1回削減することが可能になる。
図10は、図6に示す設定レジスタ構成において、設定ビット=3(設定値が『3』)の動作の一例を説明するためのフローチャートであり、上述した設定値が『1』のときの処理と設定値が『2』のときの処理を組み合わせたものに相当する。すなわち、図10において、ステップST33は、図8のステップST13に対応し、ステップST31およびST34は、図9のステップST21およびST24に対応する。
図10に示されるように、設定値が『3』のとき、タスク設定および実行処理が開始すると、ステップST31において、SRAM2からDMAC_IMMEDIATE13の値を読み出して、DMAC_IMMEDIATE13に設定し、ステップST32に進む。
さらに、ステップST32において、SRAM2からDMAC_DST12の値を読み出してDMAC_DST12に設定し、ステップST33に進んで、DMAC1がDMAC_CONFIG11のデータ数を「1」に設定し、ステップST34に進む。すなわち、設定値が『3』のとき、DMAC1は、SRAM2からDMAC_CONFIG11の設定値を読み出さずに、DMAC_CONFIG = 0x0000_0001として、直接、データ数を「1」に設定する。
ステップST34では、DMAC_DST12に対してDMAC_IMMEDIATE13の値を書き込む。すなわち、DMAC_DST12で示されるアドレスに書き込む値は、DMAC_IMMEDIATE(DMAC_SRCと共用)13になるため、書き込む値を、SRAM2を介して読み出す処理(図7におけるステップST04)が不要になる。以上により、前述した設定値が『0』の場合と比較して、メモリからの値の読み出し処理を2回削減することが可能になる。
図11は、第1実施例のDMA制御装置におけるバスを介したアクセス回数の削減効果を説明するための図であり、上述した設定値が『0』〜『3』(設定ビット=1〜3)の場合におけるバス5のアクセス回数の削減割合を示すものである。
図11、並びに、図7〜図10を参照して説明したように、バス5を介した書き込みアクセス回数は、設定値が『0』〜『3』のいずれの場合でも、1回(ステップST05,ST15,ST24,ST34)である。
一方、バス5を介した読み出しアクセス回数は、設定値が『0』の場合は4回(ステップST01〜ST04)であるのに対して、設定値が『1』の場合は3回(ステップST11,ST12,ST14)になる。
また、バス5を介した読み出しアクセス回数は、設定値が『2』の場合も3回(ステップST21〜ST23)になる。さらに、バス5を介した読み出しアクセス回数は、設定値が『3』の場合は2回(ステップST31,ST32)になる。ただし、設定値が『1』〜『3』の場合、タスク設定および実行開始の前に、予めレジスタDMAC_SCATTER16に対して適切な値を設定しておくことが求められる。
すなわち、図11に示されるように、アクセス回数の削減割合(削減率)は、設定値が『0』の場合(5回)を基準として、設定値が『1』および『2』の場合(4回)は、20%となり、そして、設定値が『3』の場合(3回)は、40%となる。
このように、本実施例のDMA制御装置(DMA制御方法)によれば、DMA処理に求められるサイクル数を削減して消費電力を低減することができる。なお、図11は、バス5を介したアクセス回数を示すのみであり、例えば、DMAC1およびCPU2の消費電力を考慮すると、本実施例を適用することによる消費電力低減の効果は、より一層大きなものとなる。
図12は、ペリフェラル(周辺回路)の操作の一例を説明するための図であり、スキャッタギャザーモードを用いてGPIO(汎用入出力ポート:図1におけるGPIO(41))のport#0から高レベル『H』(「1」)を出力させる処理を示すものである。
ここで、GPIOにおいて、例えば、『H』を出力するには、レジスタGPIO_MODEに「1」(=出力モード)を書き込み、レジスタGPIO_OUTに「1」(=『H』出力)を書き込むことで実現可能なものとする。
すなわち、GPIOのポート#0の出力値を設定するために、レジスタGPIO_OUTの0ビットに「1」を書き込む。さらに、GPIOのポート#0を出力モードに設定するために、レジスタGPIO_MODEの[3:0]ビットに4‘h1(16進数で設定ビット=1)を書き込む。
なお、設定したいペリフェラルの制御レジスタ(GPIO_OUT,GPIO_MODE)のアドレス(0xXXXX,0xYYYY)は、連続していないので、レジスタGPIO_OUTへの設定をタスク#0で実行し、レジスタGPIO_MODEへの設定をタスク#1としたスキャッタギャザーで実行する。
この場合、例えば、タスク#0として、レジスタGPIO_OUTに「1」を書き込むタスク、タスク#1として、レジスタGPIO_MODEに「1」を書き込むタスクとし、スキャッタギャザーモードを実行すればよいことになる。
なお、タスク#0および#1は、両方とも1つのアドレス(レジスタGPIO_OUTのアドレスとレジスタGPIO_MODEのアドレス)に対する書き込みで、書き込むべき値が予め「1」と分かっているので、設定値『3』の動作モードを用いたタスクとすればよい。
前述した図3に示されるように、レジスタDMAC_SCATTER16は、例えば、32ビットとされ、下位ビットから2ビットごとに1つのタスクの設定値を示すものとすれば、1回のレジスタ書き込みで16個分のタスクの設定値を書き込むことが可能になる。こにより、レジスタDMAC_SCATTER16の書き込みに要する処理サイクルの増加を抑えることができる。
上述したように、第1実施例のDMA制御装置によれば、例えば、CPUコア3を動作させることなく、DMAC1を用いて少ない処理サイクルで周辺回路(41)を制御するためのレジスタアクセスを行うことが可能になる。
これにより、MCUの回路規模のうち大きな割合を占めるCPUコア3を動作させずにDMAC1によって処理を行うことができ、さらに、動作するDMAC1の動作時間を短縮して、消費電力を低減することが可能になる。これらの効果は、第1実施例に限定されるものではなく、後述する各実施例でも、同様に発揮される。
なお、本実施例のDMA制御装置、マイクロコントローラおよびDMA制御方法は、様々な電子機器に対して適用可能である。特に、本実施例は、太陽電池,熱発電素子および振動発電素子など環境に存在するエネルギーをエネルギー源として利用する、超低消費電力が求められるようなワイヤレスセンサーノードに用いられるMCUなどへの適用が有効なものと考えられる。
図13は、DMA制御装置の第2実施例における設定レジスタ構成を示すブロック図であり、図14は、図13に示すDMA制御装置の設定レジスタ構成の一例を説明するための図である。
図13と、前述した図3の比較から明らかなように、第2実施例のDMAC(DMA制御装置)1は、図3に示す第1実施例と同様の構成を有している。すなわち、DMAC1は、基本機能設定レジスタとして、コンフィギュレーションレジスタ(DMAC_CONFIG)11、DMAC_DST(デスティネーションアドレスレジスタ)12、および、ソースアドレスレジスタ(DMAC_SRC)13などを含む。
また、DMAC1は、スキャッタギャザー設定レジスタとして、実行するタスク数を設定するレジスタ(DMAC_TASK_NUM)14および最初に実行するタスク(#0)の基本機能設定レジスタの内容が格納されたアドレスを設定するレジスタ(DMAC_TASK_ADDR)15を含む。さらに、DMAC1は、スキャッタギャザー設定レジスタとして、スキャッタギャザーモード切り替え用のレジスタ(DMAC_SCATTER)16を含む。
ここで、図13に示す第2実施例のDMAC1におけるDMAC_SCATTER16は、例えば、タスク#0〜#9の10個のタスク16-0〜16-9に対して32ビットが割り当てられ、タスクごとに3ビットで8つの値が設定できるようになっている。なお、残りの2ビットは、未使用ビットとされている。
このDMAC_SCATTER16により、スキャッタギャザーで順次実行するタスクの動作をそれぞれ3ビットで設定し、設定によって各タスクでの処理内容を変更するようになっている。すなわち、図14に示されるように、設定ビット=1(設定値が『0』)〜設定ビット=5(設定値が『5』)の6種類の動作モードが設定されるようになっている。
なお、図14では、設定ビット=6および設定ビット=7は、未定義とされているが、これらに対しても動作モードを設定すれば、最大8種類の動作モードを設定することができる。
また、図21を参照して後述する第4実施例では、スキャッタギャザーで順次実行するタスクの動作をそれぞれ4ビット(最大16種類)で設定するが、この割り当てるビットの数は様々に変更することができる。さらに、ビット幅は、一例として32ビットとしているが、64ビット等であってもよいのはいうまでもない。
図14に示されるように、本第2実施例のDMAC1による6種類のスキャッタギャザーの動作モードは、例えば、図6を参照して説明した4種類(設定値が『0』〜『3』)に加え、設定値が『4』および『5』の動作モードが設定されている。
すなわち、図14に示されるように、設定ビットの値(設定値)が『4』のとき、DMAC1は、SRAM2からDMAC_CONFIG11の設定値を読み出さずに、例えば、DMAC1が直接DMAC_CONFIG = 0x0000_0001とし、かつ、書き込み値を全て「0」に設定する。
また、設定ビットの値(設定値)が『5』のとき、DMAC1は、SRAM2からDMAC_CONFIG11の設定値を読み出さずに、例えば、DMAC1が直接DMAC_CONFIG = 0x0000_0001とし、かつ、書き込み値を全て「1」に設定する。
このように、第2実施例のDMA制御装置は、例えば、スキャッタギャザーモードで実行されるタスクは6つの動作モード(設定値『0』〜『5』)を備え、10個分のタスク(#0〜#9)について、それぞれ動作モードを設定できるようになっている。
図15は、図14に示す設定レジスタ構成において、設定ビット=4(設定値が『4』)の動作の一例を説明するためのフローチャートである。図15と、前述した図10の比較から明らかなように、設定値が『4』のとき、図10におけるステップST31の処理は、省略されている。
すなわち、設定値が『4』の動作モードでは、ステップST42において、DMAC1が直接DMAC_CONFIG = 0x0000_0001とし、さらに、ステップST43において、DMAC_DST12に対して0x0000_0000を書き込む。
すなわち、図15では、図10のステップST34におけるDMAC_DST12に対してDMAC_IMMEDIATE13を書き込む代わりに、ステップST43において、DMAC_DST12に対して0x0000_0000を書き込むようになっている。
なお、図15におけるステップST41,ST42,ST44〜ST46の処理は、図10におけるステップST32,ST33,ST35〜ST37の処理と同様のものであり、その説明は省略する。
このように、図15に示す設定値が『4』の動作モードでは、書き込む値が0x0000_0000と決まっているので、図10に示す設定値が『3』の動作モードと比較すると、SRAM2からDMAC_CONFIG11の設定値を読み込む動作が不要となる。
これにより、図10を参照して説明した設定値が『3』の場合と比較して、メモリからの値の読み出し処理(バス5を介したアクセス回数)を、さらに、1回削減することが可能になる。すなわち、前述した設定値が『0』の場合と比較して、メモリからの値の読み出し処理を3回削減することができる。
図16は、図14に示す設定レジスタ構成において、設定ビット=5(設定値が『5』)の動作の一例を説明するためのフローチャートである。図16と、上述した図15の比較から明らかなように、設定値が『5』のとき、図15におけるステップST43の処理がST53に置き換えられている。
すなわち、設定値が『5』の動作モードでは、図15のステップST43におけるDMAC_DST12に0x0000_0000を書き込む代わりに、ステップST53において、DMAC_DST12に0xFFFF_FFFFを書き込むようになっている。
なお、図16におけるステップST51,ST52,ST54〜ST56の処理は、上述した図15におけるステップST41,ST42,ST44〜ST46の処理と同様のものである。
すなわち、図16に示す設定値が『5』の動作モードでは、設定値が『4』の動作モードにおけるステップST43のDMAC_DST12に0x0000_0000を書き込む処理を除いて、図15に示す設定値が『4』の動作モードと同様である。
これにより、図10を参照して説明した設定値が『3』の場合と比較して、メモリからの値の読み出し処理(バス5を介したアクセス回数)を、さらに、1回削減することが可能になる。すなわち、前述した設定値が『0』の場合と比較して、メモリからの値の読み出し処理を3回削減することができる。
なお、以上において、設定ビット=7(設定値が『7』)として、例えば、次に実行するタスクの設定ビットの位置を、レジスタDMAC_SCATTER16の最初に戻すことを指示するモードを設けてもよい。
図17は、第2実施例のDMA制御装置におけるバスを介したアクセス回数の削減効果を説明するための図であり、上述した設定値が『0』〜『5』(設定ビット=1〜5)の場合におけるバス5のアクセス回数の削減割合を示すものである。すなわち、前述した図11の設定値が『0』〜『3』の場合に加え、設定値が『4』および『5』の場合も含めて示すものである。
図17、並びに、図15および図16を参照して説明したように、バス5を介した書き込みアクセス回数は、設定値が『4』および『5』のいずれの場合も、2回(ステップST41,ST43、および、ST51,ST53)である。
すなわち、バス5を介した読み出しアクセス回数は、設定値が『0』の場合の4回(ステップST01〜ST04)に対して、設定値が『4』および『5』の場合(2回)となり、アクセス回数の削減割合は、60%となる。このように、第2実施例のDMA制御装置(DMA制御方法)によれば、DMA処理に求められるサイクル数をさらに削減して、消費電力を低減することが可能なのが分かる。
図18は、DMA制御装置の第3実施例における設定レジスタ構成を示すブロック図である。図18と、前述した図3の比較から明らかなように、第3実施例のDMA制御装置において、DMAC1は、さらに、タスクリピートレジスタ(DMAC_TASK_REPEAT:第2レジスタ)17を含む。レジスタDMAC_TASK_REPEAT17は、DMAC_TASK_NUM14により数が指定される一連のタスクを連続して何回実行するかを指定するためのレジスタである。
図19および図20は、図18に示すDMA制御装置の動作を説明するための図である。ここで、図19は、DMAC_TASK_NUM14およびDMAC_TASK_REPEAT17に対して、DMAC_TASK_NUM = 4,DMAC_TASK_REPEAT = 3と指定されたときに実行されるタスクの数と順序を示している。
また、図20は、このときの各タスク実行前に設定される基本機能設定レジスタ(DMAC_CONFIG11,DMAC_DST12,DMAC_SRCまたはDMAC_IMMEDIATE13)の値がメモリ2上のどこから読み出されるかを示している。
図19に示されるように、レジスタDMAC_TASK_NUM14には、DMAC_TASK_NUM = 4が指定されているため、タスク#0,#1,#2,#3の3個のタスクが実行され、このシーケンスが、レジスタDMAC_TASK_REPEAT17に設定されている3回だけ繰り返される。
このとき、各タスク実行前に設定される基本機能設定レジスタの値は、図20に示されるようにしてメモリ2から読み出される。具体的に、タスク#0のSrc addr(DMAC_SRCまたはDMAC_IMMEDIATE13)は0x2000_0000から、タスク#0のDst addr(DMAC_DST12)は0x2000_0004から、タスク#0のconfig(DMAC_CONFIG11)は0x2000_0008から、それぞれ設定値が読み出される。
また、タスク#1のSrc addrは0x2000_000Cから、タスク#1のDst addrは0x2000_0010から、タスク#1のconfigは0x2000_0014から、それぞれ設定値が読み出される。さらに、タスク#2のSrc addrは0x2000_0018から、タスク#2のDst addrは0x2000_001Cから、タスク#2のconfigは0x2000_0020から、それぞれ設定値が読み出される。そして、タスク#3のSrc addrは0x2000_0024から、タスク#3のDst addrは0x2000_0028から、タスク#3のconfigは0x2000_0020から、それぞれ設定値が読み出される。
このように、第3実施例のDMA制御装置によれば、レジスタDMAC_TASK_REPEAT17を設けることにより、DMAC_TASK_NUM14により指定された一連のタスク(#0〜#3)を、DMAC_TASK_REPEAT17に設定された回数だけ繰り返して実行させることができる。
図21は、DMA制御装置の第4実施例における設定レジスタ構成のレジスタDMAC_SCATTER16を説明するための図である。図21に示されるように、タスク#0〜#7の設定ビットは、それぞれ4ビットであり、また、各タスク(例えば、#0)の動作モード指定ビットは、3ビット(例えば、図14に示す設定ビットの値0〜7に相当)とされている。さらに、各タスクのトリガー指定ビット(タスク実行開始のトリガーの種類を指定するためビット)は、1ビットとされている。
ところで、近年開発されている組込機器用MCUでは、DMAC1によるタスク実行のトリガーを与える方法として、CPU3からDMAC1内のタスク実行を指示するためのレジスタへ書き込む以外の方法が準備されている。
すなわち、近年のMCUは、CPU3からDMAC1内のタスク実行を指示するためのレジスタへ書き込む機能に加えて、SPI40,GPIO41,タイマ42およびADC43などの周辺回路から、DMAC1へトリガー信号を出力する機能を備えている。
具体的に、例えば、SPI40は、SPI I/Fからデータの送信や受信が完了したとき、また、GPIO41は、入力信号の信号レベルに変化があったときに、トリガー信号を出力する。
さらに、タイマ42は、カウンタの値が所定の値になったとき、そして、ADC43は、ADC I/Fから入力されるアナログ信号のデジタル値への変換が完了したときに、トリガー信号を出力する。
図22は、図21に示す設定レジスタ構成の一例を説明するための図である。図22と、前述した図14の比較から明らかなように、本第4実施例において、各タスク#0〜#7の設定ビットの値0〜7(下位3ビット)は、図14に示す第2実施例における設定ビット0〜7(3ビット)と同様の動作を指定する。
また、本第4実施例において、各タスク#0〜#7の設定ビットの上位1ビットは、タスク実行開始のトリガーの種類を指定するために使用され、例えば、設定ビット(上位1ビット)の値が0の場合、タスク開始トリガーは、前のタスクが完了したときが指定される。また、例えば、設定ビット(上位1ビット)の値が0の場合、タスク開始トリガーは、DMAC1が周辺回路からトリガー信号を受信したときが指定される。
図23は、本実施例のDMA制御装置が適用されるワイヤレスセンサーノードの一例を示すブロック図である。図23に示されるように、ワイヤレスセンサーノード(無線端末)は、MCU(マイクロコントローラ),無線モジュール60,センサー電源61および温度センサー63を含む。
MCUは、前述した図1と同様のものであり、DMAC1,メモリ2,CPU3,SPI40,GPIO41,タイマ42およびADC43を含み、それぞれバス5を介して接続されている。なお、DMAC1に対しては、各周辺回路(SPI40,GPIO41,タイマ42およびADC43)からトリガー信号が入力されるようになっている。
図23を参照して、CPU3を用いることなく、温度センサー63からのセンサー出力電圧Vosを一定間隔でデジタル値に変換し、SPI I/F(SPI40)を介して外部の無線モジュール60に出力する処理動作を説明する。
ここで、SPI40は、例えば、無線通信機能を持つ無線モジュール60に繋がっており、無線モジュール60は、例えば、SPI40を介して受け取ったデータをサーバへ無線送信する。
センサー電源61は、例えば、MCUのGPIO41からの入力信号が高レベル『H』=MCUの電源電圧、または、低レベル『L』=MCUの設置電圧を受け取り、『H』のときは温度センサー63への電力供給を行い、『L』のときは電力供給を行わない。温度センサー63は、センサー電源61から電力供給を受けている間、周囲の温度を測定し、アナログのセンサー電圧VosとしてADC43に出力する。
SPI40,GPIO41,タイマ42並びにADC43の制御および動作に関わる各種設定レジスタは、予め適切に設定されている。ここで、SPI40は、例えば、SPI内部に設けられた送信データレジスタに対して送信したいデータを書き込むことで、データの送信を開始する。
また、GPIO41は、例えば、GPIO内部に設けられたレジスタGPIO_OUTに『1』を書き込むと『H』を出力し、『0』を書き込むと『L』を出力する。さらに、ADC43は、例えば、ADC内部に設けられたレジスタSTARTに『1』を書き込むことで、アナログ-デジタル変換動作を開始する。
図24は、図23のワイヤレスセンサーノード(DMAC1)におけるスキャッタギャザー設定レジスタのDMAC_SCATTER16の設定の一例を説明するための図である。図24に示されるように、タスク#0の設定ビット(4ビット)=13,タスク#1の設定ビット=5,タスク#2の設定ビット=12,そして,タスク#3の設定ビット=1とする。なお、レジスタDMAC_TASK_NUM14は、DMAC_TASK_NUM = 4と設定されているものとする。
図25は、図23に示すワイヤレスセンサーノードの動作の一例を説明するための図である。図25の概略を説明すると、まず、(A)において、タイマ42がDMAC1へトリガー信号を出力し、(B)において、DMAC1がGPIO41のレジスタGPIO_OUTに『1』を書き込む(タスク#0)。
次に、(C)において、DMAC1がADC43のレジスタSTARTに『1』を書き込み(タスク#1)、(D)において、ADC43が温度センサー63からのセンサー出力電圧Vosをデジタル値に変換する。さらに、(E)において、ADC43がDMAC1へトリガー信号を出力し、(F)において、DMAC1がGPIO41のレジスタGPIO_OUTに『0』を書き込む(タスク#2)。
そして、(G)において、DMAC1がADC43のデジタル値を読み出し、SPI40の送信データレジスタに対して読み出したデジタル値(データ)を書き込み(タスク#3)、(H)において、SPI40がデータを出力する。
すなわち、(A)において、タイマ42は、DMAC1に対して、一定間隔でトリガー信号を出力する。さらに、(B)において、タイマ42からのトリガー信号を受信したDMAC1は、タスク#0の設定ビットの上位1ビットが『1』であるか否かを確認する。
図24に示されるように、タスク#0の上位1ビットは『1』であることから、DMAC1は、トリガー信号によるタスク実行を開始するべく、SRAM(メモリ)2に割り当てられている0x2000_0000から0x2000_0008の値を読み出す。そして、読み出した値を、基本機能設定レジスタに書き込む。
基本機能設定レジスタに対する書き込み処理が終了すると、基本機能設定レジスタの値に従ってタスク#0の実行、すなわち、GPIO41のレジスタGPIO_OUTに『1』を書き込む。
さらに、GPIO_OUTに『1』が書き込まれたGPIO41は、出力信号を『H』に設定する。この『H』信号を受け取ったセンサー電源61は、温度センサー63に対する電力供給を開始する。電力が供給された温度センサー63は、周囲温度を測定し、アナログ電圧としてセンサー出力電圧Vosを出力する。
そして、(C)において、タスク#0を完了したDMAC1は、タスク#1の設定ビットの上位1ビットが『1』であるか否かを確認する。図24に示されるように、タスク#1の上位1ビットは『0』であることから、DMAC1は、前のタスク完了により次のタスク実行を開始するべく、SRAM2に割り当てられている0x2000_000Cから0x2000_0014の値を読み出し、基本機能設定レジスタに書き込む。この書き込み処理の終了後、基本機能設定レジスタの値に従ってタスク#1の実行、すなわち、ADC43のレジスタSTARTに『1』を書き込む。
ここで、タスク#1を完了したDMAC1は、タスク#2の設定ビットの上位ビットが『1』であるか否かを確認する。図24に示されるように、タスク#2の上位1ビットは『1』であることから、DMAC1は、タスク#2の実行開始信号であるトリガー信号の受信を待つ。
さらに、(D)において、レジスタSTARTに『1』が書き込まれたADC43は、アナログ入力電圧(Vos)をデジタル値に変換し、変換した値をデータレジスタに書き込み、(E)において、ADC43がDMAC1へトリガー信号を出力する。
次に、(F)において、ADC43からのトリガーを受信したDMAC1は、タスク#2の設定ビットの上位1ビットが『1』であるか否かを確認する。図24に示されるように、タスク#2の上位1ビットは『1』であることから、DMAC1は、トリガー信号受信によるタスク実行を開始するべく、SRAM2に割り当てられている0x2000_0018から0x2000_0020の値を読み出し、基本機能設定レジスタへ書き込む。
書き込み処理の終了後、基本機能設定レジスタの値に従ってタスク#2の実行、すなわち、GPIO41のレジスタGPIO_OUTに『0』を書き込む。また、レジスタGPIO_OUTに『0』が書き込まれたGPIO41は、出力信号を『L』に設定する。この『L』の信号を受け取ったセンサー電源61は、温度センサー63に対する電力供給を停止する。
さらに、(G)において、タスク#2を完了したDMAC1は、タスク#3の設定ビットの上位1ビットが『1』であるか否かを確認する。図24に示されるように、タスク#3の上位1ビットは『0』であることから、DMAC1は、前のタスク完了により次のタスク実行を開始するべく、SRAMに割り当てられている0x20000024から0x2000_002Cの値を読み出し、基本機能設定レジスタへ書き込む。書き込み終了後、基本機能設定レジスタの値に従ってタスク#の実行、すなわち、ADC43のデータレジスタの値を読み出し、SPI40の送信データレジスタに書き込む。
ここで、DMAC1は、DMAC_TASK_NUM = 4であることからスキャッタギャザーモードで実行するタスクの数が4であり、既に、タスク#0〜#3の4つのタスクを実行済みであることから、次に実行するタスクがないことを判定し、動作を終了する。
そして、(H)において、送信データレジスタに値が書き込まれたSPI40は、その書き込まれた値をSPI I/Fを介して無線モジュール60に出力する。SPI I/Fを介してデータを受け取った無線モジュール60は、無線チャネルを介してサーバなどに対して、受け取ったデータを送信する。なお、上述した(A)〜(H)の一連の処理は、タイマ42から出力されるトリガー信号に基づいて、一定間隔で行われることになる。
図26は、図23に示すSRAM(メモリ)2に保存されている各タスクの実行開始前にDMA制御装置(DMAC1)の基本機能設定レジスタに読み込まれる値の一例を示す図である。
ここで、タスク#0および#1は、前述した図22の設定ビットの下位3ビットにおいて、設定ビット=5(設定値が『5』)で指定されるモードで動作する。なお、設定値が『5』の動作モードは、図14および図16を参照して説明した通りである。
そのため、レジスタSrc addr(DMAC_SRCまたはDMAC_IMMEDIATE13)、レジスタconfig(DMAC_CONFIG11)に設定される0x2000_0000,0x2000_0008,0x2000_000C,0x2000_0014には、どんな値が設定されていてもよい(don't care)。
ここで、書き込み先アドレスであるレジスタGPIO_OUT(例えば、タスク#0のDst addr:DMAC_DST12)とレジスタSTART(例えば、タスク#1のDst addr:DMAC_DST12)の値は、それぞれ0x2000_0004および0x2000_0010に設定されている。
また、タスク#2は、前述した図22の設定ビットの下位3ビットにおいて、設定ビット=4(設定値が『4』)で指定されるモードで動作する。なお、設定値が『4』の動作モードは、図14および図15を参照して説明した通りである。
そのため、レジスタSrc addr(13)、レジスタconfig(11)に設定される0x2000_0018,0x2000_0020には、どんな値が設定されていてもよい(don't care)。ここで、書き込み先アドレスであるレジスタGPIO_OUT(12)の値は、0x2000_001Cに設定されている。
さらに、タスク#3は、前述した図22の設定ビットの下位3ビットにおいて、設定ビット=1(設定値が『1』)で指定されるモードで動作する。なお、設定値が『1』の動作モードは、図6および図8を参照して説明した通りである。
そのため、レジスタconfig(11)に設定される0x2000_002Cには、どんな値が設定されていてもよい(don't care)。ここで、読み出し先アドレスであるADC43のデータレジスタの値と、書き込み先アドレスであるSPI40の送信データレジスタの値は、それぞれ0x2000_0024および0x2000_0028に設定されている。
上述した動作により、DMAC1を用いて温度センサー63の値を取得し、無線チャネルを介してサーバへ送信するワイヤレスセンサーノードの機能が実現される。なお、上述した各種レジスタの値の読み出しおよび書き込みは、例えば、CPU3を用いて行うこともできるが、CPU3はDMAC1と比較して回路規模が大きいため、DMAC1を用いて行う場合よりも消費電力が大きくなる。
また、CPU3で実行するプログラムは、例えば、SRAM2から読み出すことになるため、バス5のアクセス回数が増えることからも、DMAC1を用いて行う場合よりも消費電力が大きくなる。
さらに、同じスキャッタギャザーモードを備えるDMACを用いて行う場合と比較しても、本実施例によれば、各タスクの処理サイクルは、図17を参照して説明したように、最大60%削減することができる。すなわち、本実施例によれば、より少ない処理サイクル、すなわち、より短い時間で処理を完了することができ、しかも、消費電力を削減することが可能である。
図27は、本実施例のDMA制御装置の一例を示すブロック図である。図27に示されるように、DMA制御装置(DMAC)1は、制御部81,コンフィギュレーション値選択回路82,書き込み値生成回路83,タスク数判定回路84,繰り返し回数判定回路85および設定値アドレス生成回路86を含む。
ここで、コンフィギュレーション値選択回路82,書き込み値生成回路83,タスク数判定回路84,繰り返し回数判定回路85および設定値アドレス生成回路86は、制御部81を介してバス5に繋がれている。
さらに、DMAC1は、例えば、図18を参照して説明したように、基本機能設定レジスタおよびスキャッタギャザー設定レジスタを含む。基本機能設定レジスタは、DMAC_CONFIG11、DMAC_DST12、および、DMAC_SRCまたはDMAC_IMMEDIATE13を含む。また、スキャッタギャザー設定レジスタは、DMAC_TASK_NUM14、DMAC_TASK_ADDR15、DMAC_SCATTER(第1レジスタ)16およびDMAC_TASK_REPEAT(第2レジスタ)17を含む。
さらに、基本機能設定レジスタ(11〜13)およびスキャッタギャザー設定レジスタ(14〜17)は、図示しないが、各回路(82〜86)および制御部81に接続されている。なお、図27は、DMAC1の単なる一例を示すものであり、様々な変形および変更が可能なのはいうまでもない。
図28は、図27に示すDMA制御装置におけるコンフィギュレーション値選択回路82および書き込み値生成回路83の一例を示すブロック図である。図28に示されるように、コンフィギュレーション値選択回路82は、選択切り出し部821および選択部822を含む。このコンフィギュレーション値選択回路82は、レジスタDMAC_SRCまたはDMAC_IMMEDIATE13が出力する値をDMAC_SRCのアドレスとして使うかレジスタDMAC_IMMEDIATEとして使うかの選択信号を生成する。
選択切り出し部821は、32ビットのレジスタDMAC_SCATTER16の値のうち、例えば、現在実行中のタスク番号の位置の4ビットを切り出して出力する。選択部822は、入力される4ビットの値から1つのタスク実行でDMAC1によって書き込まれる値の数を、レジスタDMAC_CONFIG11の値にするか『1』にするかを選択する。
選択部822は、例えば、図14を参照して説明したように、4ビットの入力値が『1』,『3』,『4』および『5』のときは『1』を選択し、それ以外のときはレジスタDMAC_CONFIG11の値を選択して出力する。
また、図28に示されるように、書き込み値生成回路83は、書き込みデータバッファ831および選択部832を含み、例えば、DMAC1がコピー先アドレスに書き込む値を生成する。選択部832は、コンフィギュレーション値選択回路82(選択切り出し部821)から出力される4ビットの値に基づいて、レジスタDMAC_IMMEDIATEの値,『0』,『1』,または,読み込みデータバッファ831の値にするかを選択する。
例えば、図14を参照して説明したように、4ビットの入力値が『0』および『1』のときは読み込みデータバッファ831の値を選択し、『2』および『3』のときはレジスタDMAC_IMMEDIATE(13)の値を選択する。そして、4ビットの入力値が『4』のときは『0』を選択し、4ビットの入力値が『5』のときは『1』を選択する。
読み込みデータバッファ831には、設定ビットの値が『0』,『1』のとき、制御部81は、バス5を介してレジスタDMAC_SRC(13)に設定されているアドレスから始まり、レジスタDMAC_CONFIG11に設定されている個数のデータが保存される。
なお、4ビットの入力値が『0』,『1』のときは、このデータをレジスタDMAC_DST12に設定されているアドレスから始まるメモリ空間に対して、レジスタDMAC_CONFIG11に設定されている個数のデータを書き込むことでタスクを実行する。
図29は、図27に示すDMA制御装置におけるタスク数判定回路および繰り返し回数判定回路の一例を示すブロック図であり、図29(a)はタスク数判定回路84を示し、図29(b)は繰り返し回数判定回路85を示す。
図29(a)に示されるように、タスク数判定回路84は、比較部841,レジスタ(TASK_COUNT)842およびインクリメント部843を含み、スキャッタギャザーモード実行中(スキャッタギャザー動作中)に、何番のタスクを実行するかの制御信号を出力する。レジスタTASK_COUNT842は、制御部81からタスクの完了通知を受け取り、インクリメント部843により値をインクリメント(+1)する。
比較部841は、レジスタDMAC_TASK_NUM14から1回のスキャッタギャザーモードにより実行するタスク数を受け取り、TAK_COUNT842の値と比較し、2つの値が同一のときは、所望の数のタスク完了を制御部81に通知する。
図29(b)に示されるように、繰り返し回数判定回路85は、比較部851,レジスタ(REPEAT_COUNT)852およびインクリメント部853を含み、スキャッタギャザーモード実行中に、一連のタスク実行を何回繰り返したか判定する。レジスタREPEAT_COUNT852は、制御部81から一連のタスク実行完了通知を受け取り、インクリメント部853により値をインクリメントする。
比較部851は、レジスタDMAC_TASK_REPEAT17の値を受け取り、REPEAT_COUNT852の値と比較し、2つの値が同一のときは、所望の繰り返し回数だけ一連のタスク実行を完了したとして制御部81に通知する。
図30は、図27に示すDMA制御装置における設定値アドレス生成回路の一例を示すブロック図である。図30に示されるように、設定値アドレス生成回路86は、加算部861および乗算部862を含み、一連のタスク実行前に基本機能設定レジスタに読み込まれる値がメモリ2のどのアドレスに書き込まれているかを制御部81に通知する。
すなわち、設定値アドレス生成回路86は、レジスタDMAC_SRC(13),DMAC_DST12およびDMAC_CONFIG11の値が、SRAM2におけるどのアドレスに書き込まれているかを制御部81に通知する。
例えば、タスク#0を実行するのに求められる基本機能設定レジスタの値が保存されているアドレスは、レジスタDMAC_TASK_ADDR15に保存されている。具体的に、1つのタスクに対して、レジスタDMAC_SRC,DMAC_DSTおよびDMAC_CONFIGの32ビットデータが3個の場合を考える。さらに、本実施例のDMAC1が搭載されているMCUがバイトアドレッシング方式(8ビットごとに1つのアドレスを割り当てる)を採用しているものとする。
このとき、タスク#0の基本機能設定レジスタの値は、レジスタDMAC_TASK_ADDR15に保存されているアドレスをnとすると、例えば、nからn+11で示されるアドレスのSRAM2上に保存されている。
また、タスク#1nに対しては、n+12からn+23になり、同様に、タスク#mに対しては、n+12×mからn+12×(m+1)−1になる。従って、設定値アドレス生成回路86は、(レジスタDMAC_TASK_ADDR15のアドレス)+(レジスタTACK_COUNT842の値)×12を制御部81に出力する。
なお、制御部81は、CPU3からバス5を介して行われる基本機能設定レジスタ(11〜13)およびスキャッタギャザー設定レジスタ(14〜17)への値の書き込みおよび読み出し、並びに、各種回路(82〜86)の制御を行う。
すなわち、制御部81は、各種回路からの信号を受け取って1つのタスク、或いは、スキャッタギャザーモードを実行するための各種制御信号を各種回路に出力する。さらに、制御部81は、タスク実行時に行われるバス5を介したデータの読み込みおよび書き込みも制御する。
以上、実施形態を説明したが、ここに記載したすべての例や条件は、発明および技術に適用する発明の概念の理解を助ける目的で記載されたものであり、特に記載された例や条件は発明の範囲を制限することを意図するものではない。また、明細書のそのような記載は、発明の利点および欠点を示すものでもない。発明の実施形態を詳細に記載したが、各種の変更、置き換え、変形が発明の精神および範囲を逸脱することなく行えることが理解されるべきである。
以上の実施例を含む実施形態に関し、さらに、以下の付記を開示する。
(付記1)
基本機能設定レジスタと、
前記基本機能設定レジスタに書き込むデータを、バスを介して読み出しせずに直接設定してタスクを実行するスキャッタギャザー設定レジスタと、を有する、
ことを特徴とするDMA制御装置。
(付記2)
前記基本機能設定レジスタは、データ数を規定するコンフィギュレーションレジスタを含み、
前記DMA制御装置は、さらに、前記コンフィギュレーションレジスタに対して、前記コンフィギュレーションレジスタの値または予め定められた値を選択するコンフィギュレーション値選択回路を有する、
ことを特徴とする付記1に記載のDMA制御装置。
(付記3)
前記基本機能設定レジスタは、コピー先アドレスを設定するデスティネーションアドレスレジスタを含み、
前記DMA制御装置は、さらに、前記デスティネーションアドレスレジスタに対して、直接書き込む値を生成する書き込み値生成回路を有する、
ことを特徴とする付記1に記載のDMA制御装置。
(付記4)
前記スキャッタギャザー設定レジスタは、複数のスキャッタギャザー動作を切り替える第1レジスタを含む、
ことを特徴とする付記1乃至付記3のいずれか1項に記載のDMA制御装置。
(付記5)
前記スキャッタギャザー設定レジスタは、一連のタスクを連続して何回実行するかを指定する第2レジスタを含む、
ことを特徴とする付記4に記載のDMA制御装置。
(付記6)
さらに、前記第2レジスタの値を受け取り、スキャッタギャザー動作中に、前記一連のタスクの実行を何回繰り返したか判定する繰り返し回数判定回路を有する、
ことを特徴とする付記5に記載のDMA制御装置。
(付記7)
さらに、前記一連のタスクの実行前に、前記基本機能設定レジスタに読み込まれる値がメモリのどのアドレスに書き込まれているかを出力する設定値アドレス生成回路を有する、
ことを特徴とする付記5または付記6に記載のDMA制御装置。
(付記8)
さらに、スキャッタギャザー動作中に、何番のタスクを実行するかの制御信号を出力するタスク数判定回路を有する、
ことを特徴とする付記1乃至付記7のいずれか1項に記載のDMA制御装置。
(付記9)
付記1乃至付記8のいずれか1項に記載のDMA制御装置と、
メモリと、
CPUと、
複数の周辺回路と、
前記DMA制御装置,前記メモリ,前記CPUおよび複数の前記周辺回路を繋ぐバスと、を有する、
ことを特徴とするマイクロコントローラ。
(付記10)
スキャッタギャザーモードを有するDMA制御方法であって、
前記スキャッタギャザーモードは、基本機能設定レジスタに書き込むデータを、バスを介して読み出しせずに直接設定してタスクを実行する、のを含む、
ことを特徴とするDMA制御方法。
(付記11)
前記基本機能設定レジスタにおける、データ数を規定するコンフィギュレーションレジスタに設定する値を、前記バスを介してメモリから読み出すことなく、予め定められた値に設定する、のを含む、
ことを特徴とする付記10に記載のDMA制御方法。
(付記12)
前記基本機能設定レジスタにおける、コピー先アドレスを規定するデスティネーションアドレスレジスタに設定する値を、前記バスを介してメモリから読み出すことなく、直接生成して書き込む、のを含む、
ことを特徴とする付記10に記載のDMA制御方法。
(付記13)
前記スキャッタギャザーモードは、複数設けられ、
複数の前記スキャッタギャザーモードの設定によって、各タスクによる処理内容を変更する、のを含む、
ことを特徴とする付記10乃至付記12のいずれか1項に記載のDMA制御方法。
(付記14)
前記スキャッタギャザーモードは、一連のタスクを連続して何回実行するかを指定する、のを含む、
ことを特徴とする付記13に記載のDMA制御方法。
(付記15)
前記スキャッタギャザーモードは、前記一連のタスクの実行を何回繰り返したか判定する、のを含む、
ことを特徴とする付記14に記載のDMA制御方法。