ここ数日、mbedは割り込みに対応していないようなことを書いてきました。
が、よくよく見るとmbedライブラリには割り込みマネージャ(interruptManager)があります。このマネージャは指定された割り込みソースに対するハンドラのリストを作って管理します。ハンドラのリストを作る理由は、GPDMAのように複数の割り込みソースが一つの割り込みに束ねられている場合があるのでしょう。CORTEX-M3/4の割り込みベクトルは最大256なので、わざわざ束ねる理由がわかりかねますが、とにかくLPCマイコンでは束ねています。そして、ソフトウェア側も束ねることに対応しています。
mbedライブラリのオンラインヘルプには割り込みのイネーブル・ディセーブルがありません。しかし、これはcore_cm4.hのNVIC_Enable_IRQ()/NVIC_Disable_IRQ()によって制御可能です。Doxygenコメントはあるのですが、なぜ生成しないのでしょうか。
LPC4337のNVICのプライオリティ・レジスタに適当な数字を書き込んでみました。CORTEX-M3/4は8bitのプライオリティ・レジスタのうち、チップベンダが選択したビット数だけを優先順位として使用します。この場合、MSBからとることになっています。LPC4337は4bitをとっていますので、値の範囲は0,16,32,…,240のように16通りの値をとります。しかしながら、NVIC_SetPriority()を使用して書き込むと、0から7までの数字しか書き込めません。プライオリティの上位だけを見るのは、ポータビリティと電力消費量最適化のトレードオフを実現するためだと「ARM CORTEX-M3システム開発ガイド」に書いてありますが、core_cm4.hの中のNVIC_SetPriority()は、その考え方をぶちこわしています。このファイルはARMが作成したもののようですが、何故でしょうか。
いろいろと不思議です。