LPC1114FN28/102 (10) -- IRQLATENCY レジスタ (3)

ユーザ・マニュアルなどの技術文書に明確な記載はないものの、ブローシャなどプレゼンテーション用資料には「割り込みレイテンシ 16 クロック」と記載されいる数値と、LPC1114FN28/102 の実測結果の 22 クロック程度の数値との違いが腑に落ちず、いろいろ「ググって」いて IRQLATENCY レジスタについて言及している NXP 社発行の次の 3 つの資料を見つけました。

UM10518 LPC11Exx User manual
UM10462 LPC11Uxx User manual
TN00002 LPC1343 (Cortex-M3) vs. LPC11U1x (Cortex-M0)

基本的には、

LPC11U1x = LPC111x + USB
LPC11E1x = LPC111x + EEPROM

と考えられるので、ユーザ・マニュアル UM10398 に IRQLATENCY レジスタの記述がない「無印」LPC111x にも IRQLATENCY レジスタは存在していると推測するのが自然です。
LPC1114FN28/102 で IRQLATENCY レジスタのアドレス 0x40048170 を読み込んでみたところ、果たしてリセット後のデフォルト値である 0x10 = 16 が読み取れました。
そのアドレスに値を書き込むと、その値が保持され、実際に割り込みレイテンシが変化することが確認できました。
IRQLATENCY レジスタをデフォルト値の 16 から小さい方に変化させて、SysTick タイマで測定したレイテンシのヒストグラムの表を下に示します。

SysTick 経過クロック数
IRQ
LATENCY
181920212223242526
0 〜 80.999***
90.999**
100.999*
111.0
121.0
131.0
141.0
151.0
161.0
各行ごとに IRQLATENCY レジスタの値を変化させ、列方向には SysTick タイマで測定した割り込みレイテンシのクロック数の順に並べてあります。
空欄のところはヒストグラムがゼロ、つまり、そのクロック数のレイテンシが観測されなかったことを示します。
星印「*」の欄は、非常に少ない頻度ではあるがゼロではない結果が観測されたことを示します。
「1.0」となっている欄は、100 % の頻度で、そのクロック数が観測されたことを示しています。
IRQLATENCY = 11 までは、「ジッタ」がゼロ、つまりただひとつの値のレイテンシしか観測されませんでした。
IRQLATENCY が 10 以下になると、複数のレイテンシが観測される、つまり「ジッタ」がゼロではなくなりました。
さらに、IRQLATENCY が 8 以下 0 までは同じ結果となり、レイテンシの減少は頭打ちとなりました。
この最小値のレイテンシ 18 から SysTick タイマ・レジスタからの値読み出しに要する 4 クロック分を引くと 14 クロックとなり、Cortex-M0+ のドキュメントの 15 クロックや、Cortex-M0 の 16 クロックという値に近くなります。
レイテンシはハードウェア的に正確に測れているわけではなく、系統的な誤差を含むことを考えると、これらの値は、ほぼ同一と考えられます。
つまり、ジッタを許容するなら 16 クロック程度の割り込みレイテンシが得られるけれども、ジッタゼロを望むなら、20 クロック程度の割り込みレイテンシを覚悟する必要があるということです。
次回は、これもググっていて見つけた ARM 社発行の文書

Application Note 226
Using the Cortex-M0 on the
Microcontroller Prototyping
System

について取り上げます。