メディア

オーバーランエラーの原因Q&Aで学ぶマイコン講座(16)(2/3 ページ)

» 2015年07月15日 11時30分 公開

CPUの割り込み優先順位

 マイコンに搭載されている通信ペリフェラルはUART以外にもSPI(Serial Peripheral Interface) 、I2C (Inter-Integrated Circuit)、USB(Universal Serial Bus)などがありますが、いずれの場合も受信バッファを持っていれば、オーバーランエラーが発生する可能性があります。

 通信データを受信して、受信バッファに格納したら、通信ペリフェラルからCPUに割り込み要求を送ります。するとCPUは割り込み処理の中で受信バッファのデータを読み出して、RAMや汎用レジスタなどの他のストレージへ移動させます。通常、CPUの処理速度の方が通信速度よりもはるかに速いので、オーバーランエラーが発生せず、CPUは正常に受信データを取り出すことができます(図2参照)。

図2:オーバーランエラーが発生しない場合 (クリックで拡大)

 ところが、この時、通信ペリフェラルよりも優先順位の高い割り込み(図3中の割り込み1)が実行されていると、受信データの処理が後回しにされます。その間に次のデータが送られてきて受信バッファにデータが入ると、オーバーランエラーが発生し、1つ前の受信データは消失してしまいます。これを防ぐため、ユーザーは通信ペリフェラルの割り込み優先順位を一時的(通信中)にでも高く設定する必要があります。

図3:オーバーランエラーが発生する場合 (クリックで拡大)

内部データバスのアービトレーション

 マイコンにDMAが搭載されていればCPUの代わりにDMAを使うことができます。DMAは割り込み優先順位を気にせず転送を行ってくれますので、CPUのように他の割り込み処理で転送が待機状態になることがありません。

 通信データを受信して、受信バッファに格納したら、DMAへ転送要求が送られます。するとDMAは受信バッファのデータを読み出して、RAMや汎用レジスタなどの他のストレージへ移動させます。通常はDMAの転送速度の方が通信速度よりもはるかに速いので、オーバーランエラーが発生せずに正常に受信データを読み出せます。

 しかし、DMAでもオーバーランエラーが発生する場合があります。

 データを転送する時はCPUもDMAも内部のデータバスを使います。バスのアービトレーションの方式にもよりますが、DMAがバスを使いたいときにCPUがバスを占有していると、DMAはバスが空くまで待機することになります。その間に次のデータが送られてきて受信バッファにデータが入ると、オーバーランエラーが発生します。

 CPUとDMAでバスを共有する場合は、ラウンドロビン(Round-robin:バス権を順番に交代させる方式)のようなアービトレーション方式を採用しないと、CPUがバスを占有している間、DMA転送が待たされて、オーバーランエラーを引き起こすことになります(図4参照)。

図4:オーバーランエラーが起こる主な原因(DMA処理) (クリックで拡大)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSフィード

公式SNS

EDN 海外ネットワーク

All material on this site Copyright © ITmedia, Inc. All Rights Reserved.
This site contains articles under license from AspenCore LLC.