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)が存在しても、次のタスクを起動できることになります。