2014年08月23日

EWARM: 割込みの応答速度を調べてみるNXP LPC810

LPC810でも割込み応答を調べてみました。
ちょっと、いろいろトラブルがあるので、可能なら再度実施したいと思います。

NXP_LPC810int.png

ロジアナ200MHz, LPC810は24MHzでサイクルベースで絵にすると以下のようになりました。
NXP_LPC810int02.png


タグ:LPC810 LPC800
posted by EWARMJP at 22:00| Comment(0) | TrackBack(0) | マイコン割込調査 | このブログの読者になる | 更新情報をチェックする

2014年08月22日

EWARM: 割込みの応答速度を調べてみるmbed LPC1768番外編

mbed lpc1768でも試してみます。
環境がC++、かつ、mbedライブラリということで多少条件が異なるということで番外編ということで調べてみました。
コードは、"mbed NXP LPC1768キット(26): 割込みを使う"で作成したコードを利用しました。

そのままですが、コードは以下の通り。
#include "mbed.h"

InterruptIn  pa(p10);
InterruptIn  pb(p11);

DigitalOut  px(p18);
DigitalOut  py(p19);

void handle1()
{
  px=1;
  px=0;
}

void handle2()
{
  py=1;
  py=0;
}

int main() {
  pa.rise(&handle1);
  pb.rise(&handle2);
  px =0;
  py=0;
  while(1) {
    wait(5);  
  }
}



ロジアナは計測200MHz, ボードは96MHzという計測です。
mbedLPC1768.png
STM32Lと比べると割込みの処理自体はC++のクラスが使われているのでサイクル数は多いのですが、時間的には多少短くなっています。
割込みハンドラが動くまでが時間がかかっていますね。



タグ:mbed LPC1768
posted by EWARMJP at 22:00| Comment(0) | TrackBack(0) | マイコン割込調査 | このブログの読者になる | 更新情報をチェックする

2014年08月20日

EWARM: 割込みの応答速度を調べてみるSTM32L編(3) スリープからの起床

Cortex Mマイコンでは、CPUコアを簡単にスリープさせることが出来る、WFI命令やWFE命令があります。

WFI命令はWait For Interrupt ということで、割込みが発生するまでCPUコアはお休みしてくれる命令です。
割込みが発生すると、CPUコアを起こして実行を再開することが出来ます。
割込みハンドラはこれまでのものと同じで実行してみました。

STM32L_int3.jpg

これだけだとよくわからないので、入り口/出口を補完してみると以下のようになりました。
EWARM0109.png

通常の割り込みとくらべて2サイクルぐらいしか影響がないということで、かなり優秀なのではないでしょうか?

posted by EWARMJP at 22:00| Comment(0) | TrackBack(0) | マイコン割込調査 | このブログの読者になる | 更新情報をチェックする

2014年08月19日

EWARM: 割込みの応答速度を調べてみるSTM32L編(2)

昨日、計測したデータを分析してみます。

今回のSTM32L152のプロジェクトは16MHzで動作しています。
ロジアナは200MHzで計測しています。


割込み信号がONになってから、ハンドラがHighにして出力信号が出てくるまで316サイクル(1580ns), そこから出力信号がLowになるまで174サイクル(870ns)かかりました。 割込みが入ってから何か応答するのに1.5usecぐらいはかかっているんですね。

今回のSTM32Lは16MHzで動作していますので、16MHz(62.5ns)のサイクルに変換すると、それぞれ25サイクルと14サイクルになります。
EWARM0106.png


今回の割込みハンドラはで、以下のシンプルなものです。
void EXTI0_IRQHandler(void)
{
  GPIO_HIGH(GPIOB, GPIO_Pin_4);
  EXTI_ClearITPendingBit(EXTI_Line0);
  GPIO_LOW(GPIOB, GPIO_Pin_4);
}
コンパイルした結果をみるとよりはっきりします。
EWARM0105.png

で、もうすこし真面目に解析すると、ポートのHighをしているのはハンドラに入って4命令目ですし、Lowをした後にPOP命令が控えています。
すると今回の14サイクルの部分で使っている命令は8命令分になります。
適当ですが、分岐やロード/ストア、スタック操作は2サイクルで、その他は1サイクルぐらいで考えれば計算が合うみたいです(あくまで適当です)。
ハンドラの入り口は、PUSH、LDRとMOV命令なので5サイクルぐらいと見積もります。
ハンドラの出口は、POP命令だけなので2サイクルと見積もります。すると以下のように考えればよいかなと思います。
EWARM0107.png


次に、シーケンシャルに2つの割り込みが入る場合です。
EWARM0108.png
割込みと割込みの間が短くなっています。このあたりは、割込みが連続して入る場合には、テールチェインという仕組みが動いているからではないかと思います。しかし、外部からは正確なことはわかりませんね(違っているかもしれませんが)。

ARMのサイトでテールチェーンを調べてみると、”割り込みと割り込みの都の間で状態保存および復元のオーバーヘッドを伴わない連続割込み処理”と書いてあります。
テールチェーンがなければ、割込みが起こると通常タスクのレジスタをスタックに保存して、割込みが終わるとそのスタックから復帰しますが、このときに次の割り込み要求が来ていたら、またスタックに積むという必要があります。
このテールチェーンでは、次の割り込み要求が来たら、そのまま次の割込みを受ける仕組みのようです。

本当に効果がでているのか確かめる方法があればよいのにとは思いますが・・・



タグ:STM32L
posted by EWARMJP at 22:00| Comment(0) | TrackBack(0) | マイコン割込調査 | このブログの読者になる | 更新情報をチェックする

2014年08月18日

EWARM: 割込みの応答速度を調べてみるSTM32L編

割込みの応答速度は早い方が良いというのがありますが、現実に割込みの応答時間ってどんなもんなのでしょう?
昔はマニュアルに丁寧に書いてあったと思うのですが、最近あまりない気がします。
もしかして、ARMとかのコアが普及しているからでしょうか?ARMコアだと、コアと周辺のマニュアルが完全に分離されていますし、さらにコアのマニュアル見ているとアーキテクチャマニュアル見ろ!とかたらい回しの刑にあっている気がします。

あんまり家で測る方法がないと思っていましたが、またしても秋月電子にあるロジアナにて見れるところまでやってみようと思います。
最近机の上にあるものの5割ぐらいが秋月電子商品な気がします(^_^);
ロジアナさんはこちら↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
EWARM0100.png

CPUが動作中に外部からの信号が入った時にどのくらいで反応できるのか?について調べてみようと思います。
まずマイコンからポートに出力し、その足りあがりをSTM32LのEXTIで割込みとして拾います。
その割込みハンドラに入った時にポートをHighにハンドラから抜ける前にポートをLowとすることで観測してみます。
EWARM0101.png
ボードはこんな感じです。
EWARM0102.png

計測時に、ロジアナは内部クロック200MHzとして計測してみました。

まず1つだけ割込みを入れてみた場合はこんな感じです。
EWARM0103.png
割込みが買いいるまで316サイクル(200MHz計測で), ポートがONの区間は174サイクルぐらいでした。


2つ入れてみた場合はこちらです。
EWARM0104.png

明日、すこし分析してみたいと思います。

タグ:STM32L
posted by EWARMJP at 22:00| Comment(0) | TrackBack(0) | マイコン割込調査 | このブログの読者になる | 更新情報をチェックする