LED Blinking (2core with communication)
XMOS StartKITでLチカを行ってみます。
( XMOS , startKIT , LED Blinking )
xTIMEcomposerで新たにプロジェクトを作成します。
Project Name: blink_test
Location: Create new project in workspace
Create a new application based project : checked
Target Hardware : XMOS startKIT
copy XN file into new application: checked
上記レイアウト図のHにあるLEDを制御します。
全コード:
#include <stdio.h>
#include <platform.h>
#include <xs1.h>
#include <timer.h>
interface inf0 {
void f0(int x);
};
port led1 = XS1_PORT_1A;
port led2 = XS1_PORT_1D;
void blink(client interface inf0 intf, int ms)
{
int counter = 0;
while (1) {
led1 <: 0;
intf.f(1);
delay_milliseconds(ms);
led1 <: 1;
intf.f(0);
delay_milliseconds(ms);
counter++;
}
}
void blnk_svr(server interface inf0 intf)
{
while (1) {
select {
case intf.f(int x):
if (x) {
led2 <: 1;
} else {
led2 <: 0;
}
break;
}
}
}
void test(int num)
{
printf("[%d] hello world\n", num);
}
int main()
{
interface inf0 intf;
printf("[main] hello world.\n");
par {
test(0);
test(1);
test(2);
blink(intf, 500);
blnk_svr(intf);
}
return 0;
}
コード解説:
インクルード
#include <stdio.h>
#include <platform.h>
#include <xs1.h>
#include <timer.h>
これらのインクルード文はいつも記述して問題ありません。あまり考えずに記載しましょう。
定義文
interface inf0 {
void f0(int x);
};
port led1 = XS1_PORT_1A;
port led2 = XS1_PORT_1D;
最初の定義(interface info)は、Core間の通信インターフェースです。今回は、2つのCore間でインターフェースするために定義します。
次にLEDを定義します。今回は、チップに近い2つのLEDを使用します。
タスク文定義
void blink(client interface inf0 intf, int ms)
{
int counter = 0;
while (1) {
led1 <: 0;
intf.f(1);
delay_milliseconds(ms);
led1 <: 1;
intf.f(0);
delay_milliseconds(ms);
counter++;
}
}
void blnk_svr(server interface inf0 intf)
{
while (1) {
select {
case intf.f(int x):
if (x) {
led2 <: 1;
} else {
led2 <: 0;
}
break;
}
}
}
void test(int num)
{
printf("[%d] hello world\n", num);
}
今回はパラレル処理(これをやらないとXMOSのデバイスを使用する意味がありません)を行うためのタスクを3つ定義します。
blinkタスク:
最初のblinkタスクは起動されると同時に、起動時のパラメータごとの時間でLED1を点滅します。
また、点滅時にそのときのLEDの状態を他のタスクへinterfaceを使用して渡しています。intf.f(1)とintf.f(0)がそれです。
blnk_svrタスク:
これはLED2を制御するためのタスクです。ただし、起動後、select文でintfの状態を待ちます。
intfにイベントが発生すると、そのとき渡された値によりLED2を点灯、消灯します。
testタスク:
これは、Hello worldと渡されたパラメータと一緒に表示します。
これにより、par文により起動した順序通りにタスクが起動することがわかります。
メイン処理:
インターフェースを定義して、各タスクを起動します。par文があると、その中に記載された関数はパラレル処理適用となります。
これにより、関数中にwhile(1)が存在しても、次のタスクを起動できることになります。