通常マイコンには割り込みと呼ばれる、メインルーチンよりも優先度の高い処理を逐次実行する機構が備わっています。が、このマイコンは割り込みがないのです。
8つのコア
このマイコン、なんと8個のコアがあります(Cog: 歯車 と呼ばれる)。つまり、「これだけコアがあるんだから、割り込みとかする必要ないよね」ということなのです。数の暴力とはまさにこのことです。凄まじい。
ユーザーガイドとか読んでみたけれど、本当に割り込みの説明がない。Vector というワードすら検索に引っかかりません。それどころか、「Cog がいっぱいあるから、割り込みなんて必要なくなる」とまで断言しています。
今更ですが、このマイコンは 2006 年に登場した、32bit の RISC マイコンのよう。えっ、32bit ですか。Wikipedia を参考にしました。Wiki じゃなくて Wikipedia ね。
2つのCogを用いた並列プログラミング
P.0 と P.1 に接続した LED を別々に点滅させます。spin は以下のよう。
CON
_CLKMODE = XTAL1 + PLL16X
_CLKFREQ = 80_000_000
VAR
long stack[9]
PUB main
cognew(blink(500, 1), @stack)
blink(1000, 0)
PUB blink(interval_ms, pin)
dira[pin]~~
repeat
!outa[pin]
waitcnt(cnt + _CLKFREQ / 1000 * interval_ms)
' XXX: waitcnt(cnt + _CLKFREQ * interval_ms / 1000)
cognew
で新たな Cog に命令を投げています。スタックの指定もお忘れなく。
一方で SimpleIDE を用いた C++ コードはこちら。
#include "simpletools.h"
void blink_P1(void *) {
set_direction(1, 1);
while(1) {
toggle(1);
pause(500);
}
}
int main() {
cog_run(blink_P1, 128);
set_direction(0, 1);
while(1) {
toggle(0);
pause(1000);
}
}
最後に
こちらの素晴らしいサイトに完全にかぶってしまっているので、しばらくはこのマイコンについて更新を控えようと思います。使用感を事細やかに描写しているサイトです。ぜひとも参考にしてください。この記事自体も大いに参考にさせていただきました。