ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...hardware...

25
ハードウェア実験 組み込みシステム入門 第3回 2010年10月7日 XCの文法/スイッチを読む

Upload: others

Post on 15-Mar-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

ハードウェア実験

組み込みシステム入門

第3回

2010年10月7日

XCの文法/スイッチを読む

Page 2: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

2Hardware Experiments for Embedded Systems on XMOS

前回予告した今日の内容

次回は、別のサンプルプログラム(二つ)を実行次回は、別のサンプルプログラム(二つ)を実行

させて、動作させながら、させて、動作させながら、XCXCのプログラム言語のプログラム言語

の文法的な説明を行います。の文法的な説明を行います。

while, select/case, if/elsewhile, select/case, if/elseなどのなどのXCXCの文法の文法

を学びます。を学びます。

LEDLEDへの出力だけではなく、ボタンの入力を学への出力だけではなく、ボタンの入力を学

びます。びます。

並列プログラミング(マルチスレッド)の書き方を並列プログラミング(マルチスレッド)の書き方を

導入します。導入します。

Page 3: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

3Hardware Experiments for Embedded Systems on XMOS

まず、最初のプロジェクト

tutorialtutorial(入門学習)の、(入門学習)の、Cheat Cheat SheetSheetを開き、を開き、[Flash an LED [Flash an LED while cyclingwhile cycling・・・・・・]]をクリック。をクリック。

[Start working on this [Start working on this task]task]をクリックする。をクリックする。

TutorialTutorial教材の教材のP6P6~~P7P7に相当に相当

4 LEDを異なる頻度で円状に点滅させ

る(select の使用方法)

となっていますが、「円状」(cycling)は、

「周期的に」と読んで下さい。

最後のLEDの次に、最初のLEDが点滅し、

「終点がない」ため、cycle状とか、ring状

という表現をします。

cycling LED (円状にLEDを点滅させる)

ring bufferの構造(終点がない=リング状

= 最後の次が最初になる)

Page 4: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

4Hardware Experiments for Embedded Systems on XMOS

前回の手順を思い出して下さい。

/*/*

======================================================================================================================================================

==

Name : xk1-cycle-led.xcName : xk1-cycle-led.xc

Description : Flash and cycle LEDs at different rates Description : Flash and cycle LEDs at different rates

======================================================================================================================================================

==

*/*/

#include#include <xs1.h><xs1.h>

#define#define FLASH_PERIOD 10000000 FLASH_PERIOD 10000000

#define#define CYCLE_PERIOD 50000000 CYCLE_PERIOD 50000000

outout portport led = XS1_PORT_4F; led = XS1_PORT_4F;

intint mainmain((voidvoid) {) {

unsignedunsigned ledOn = 1; ledOn = 1;

unsignedunsigned ledVal = 1; ledVal = 1;

timertimer tmrF, tmrC; tmrF, tmrC;

unsignedunsigned timeF, timeC; timeF, timeC;

tmrF :> timeF;tmrF :> timeF;

tmrC :> timeC;tmrC :> timeC;

whilewhile (1) { (1) {

selectselect { {

casecase tmrF tmrF whenwhen timerafter(timeF) :> timerafter(timeF) :> voidvoid::

ledOn = !ledOn;ledOn = !ledOn;

ifif (ledOn) led <: ledVal; (ledOn) led <: ledVal;

elseelse led <: 0; led <: 0;

timeF += FLASH_PERIOD;timeF += FLASH_PERIOD;

breakbreak;;

casecase tmrC tmrC whenwhen timerafter(timeC) :> timerafter(timeC) :> voidvoid::

ledVal <<= 1;ledVal <<= 1;

ifif (ledVal == 0x10) (ledVal == 0x10)

ledVal = 1;ledVal = 1;

timeC += CYCLE_PERIOD;timeC += CYCLE_PERIOD;

breakbreak;;

}}

}}

returnreturn 0; 0;

}}

前回同じ説明を

2回繰り返しました。

思い出して下さい。

今回は、

Cycle LED Projectです。

自動生成

されます。

Page 5: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

5Hardware Experiments for Embedded Systems on XMOS

前回の実行手順の確認

これまでの課題と同じ手順でビルドし、実行します。これまでの課題と同じ手順でビルドし、実行します。

プロジェクト名をクリックし、[ハンマー]でビルド

実行ファイル名をクリックし、▶をクリック、Run Asで[XCore Application]を選び、OK

Page 6: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

6Hardware Experiments for Embedded Systems on XMOS

xk1-cycle-led.xc

timer tmrF, tmrC;timer tmrF, tmrC;      // // タイマータイマー

unsigned timeF, timeC; // unsigned timeF, timeC; // 時刻の変数時刻の変数

名前から機能を推定する。名前から機能を推定する。

上の方に上の方に

#define FLASH_PERIOD 10000000

#define CYCLE_PERIOD 50000000

が定義されている。が定義されている。

FはFlash (点滅する), CはCycle(巡回)

このことから、点滅を制御するロジックと、巡回を制御するロジッこのことから、点滅を制御するロジックと、巡回を制御するロジッ

クの、両方があることがわかる。クの、両方があることがわかる。

Page 7: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

7Hardware Experiments for Embedded Systems on XMOS

変数 ledOn の使い方

2828行目行目

if (ledOn) led <: ledVal;

else led <: 0;

ledOnがtrue(真)なら、ledにledValを設定

2727行目行目

ledOn = !ledOn;

ledOnが真なら偽、偽なら真(反転)を代入

この1行で、「点滅」を設定している。

ということは、26行目が、「点滅」切り替えの判定部分。

2626行目行目

case tmrF when timerafter(timeF) :> void:

tmrFが timeFになったら、breakまでを実行

Page 8: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

8Hardware Experiments for Embedded Systems on XMOS

行番号の表示方法

MenuMenuのの[Windows][Windows]からから[Preferences][Preferences]を開くを開く

General->Editors->Text EditorsGeneral->Editors->Text Editorsと開いてと開いて

いき、□ いき、□ Show line numbersShow line numbersにチェックを入にチェックを入

れる。れる。

Page 9: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

9Hardware Experiments for Embedded Systems on XMOS

timerafter

説明書“説明書“Programming XC on XMOS Devices” P20Programming XC on XMOS Devices” P20からから

The conditional input statement

t when timerafter ( time ) :> void ;

waits until this time is reached, completing the input just afterwards.

この行があると、タイマーが条件を満たすまでは実行を待つ。この行があると、タイマーが条件を満たすまでは実行を待つ。

複数の「スレッド」が同時実行できるため、このスレッドが

実行停止しても、必ずしもCPUは止まらない。

[timer[timer変数変数] ] when timerafter(when timerafter( 整数値整数値time time ) :> void ;) :> void ;

「・・・ when timerafter( ・・・ ) :> void ;」で覚える

voidvoidの代わりにの代わりにtimetimeに代入すると、エラーになる。(に代入すると、エラーになる。(P20P20))

timeraftertimerafterは必ずは必ずwhenwhenから呼ばれる必要がある。から呼ばれる必要がある。(P133)(P133)

Page 10: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

10Hardware Experiments for Embedded Systems on XMOS

select 文

selectselect { {

casecase tmrF when timerafter(timeF) :> void tmrF when timerafter(timeF) :> void  ::

::

break;break;

casecase tmrC when timerafter(timeC) :> void tmrC when timerafter(timeC) :> void  ::

::

break;break;

}}

●Selectブロック内の、case の条件のうち、どちらか「先に」

条件を満たした方が先に実行される。

●この表現の場合には、timerafterで「待つ」ことなく、他の

caseの条件も判定される。

●select / case / break のセットで覚える。

Page 11: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

11Hardware Experiments for Embedded Systems on XMOS

変数 ledValの使い方

3232行目行目

ledVal <<= 1;

if (ledVal == 0x10)

ledVal = 1;

ledValを、左に1ビット分シフトし、値が0x10に

なったら ledValに1を代入する。

初期値は、18行目で代入(1)している。

前回の「発展課題」の内容です。前回の「発展課題」の内容です。

Page 12: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

12Hardware Experiments for Embedded Systems on XMOS

報告課題

ledledが逆向きに点灯するように、プログラムを改が逆向きに点灯するように、プログラムを改

変して下さい。変して下さい。

((CC評価の条件)評価の条件)

報告の様式として整っているもの(考察や感想も報告の様式として整っているもの(考察や感想も

十分にあるもの)については、この課題のみの十分にあるもの)については、この課題のみの

報告でも、B評価以上で判定します。報告でも、B評価以上で判定します。

Page 13: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

13Hardware Experiments for Embedded Systems on XMOS

Tutorial最後のプロジェクト

XK-1XK-1ののButtonButtonプロジェクトを、生成します。プロジェクトを、生成します。

/*/*

========================================================================================================================================================

Name : xk1-button.xcName : xk1-button.xc

Description : Flash and cycle LEDs at different rates and respond to buttons Description : Flash and cycle LEDs at different rates and respond to buttons

========================================================================================================================================================

*/*/

#include#include <xs1.h><xs1.h>

outout portport p_leds_3_0 = XS1_PORT_4F; p_leds_3_0 = XS1_PORT_4F;

inin portport p_button_0 = XS1_PORT_1K; p_button_0 = XS1_PORT_1K;

inin portport p_button_1 = XS1_PORT_1L; p_button_1 = XS1_PORT_1L;

voidvoid flashLedsflashLeds((outout portport leds, leds, chanendchanend c); c);

voidvoid buttonListenerbuttonListener((inin portport button, button, chanendchanend c); c);

intint mainmain()()

{{

chanchan c; c;

parpar

{{

flashLeds(p_leds_3_0, c);flashLeds(p_leds_3_0, c);

buttonListener(p_button_0, c);buttonListener(p_button_0, c);

}}

returnreturn 0; 0;

}}

(続く)(続く)

Page 14: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

14Hardware Experiments for Embedded Systems on XMOS

xk1-button.xc (続き)

voidvoid flashLedsflashLeds((outout portport leds, leds, chanendchanend c) c)

{ {

timertimer t; t;

unsignedunsigned intint time; time;

intint ledVal = 1; ledVal = 1;

intint isOn = 1; isOn = 1;

t :> time;t :> time;

leds <: ledVal;leds <: ledVal;

whilewhile (1) (1)

{{

selectselect

{{

casecase t t whenwhen timerafter(time) :> timerafter(time) :> voidvoid::

{{

ifif (isOn) (isOn)

leds <: ledVal;leds <: ledVal;

elseelse

leds <: 0;leds <: 0;

isOn = !isOn;isOn = !isOn;

time += 50000000;time += 50000000;

breakbreak;;

}}

casecase c :> ledVal : c :> ledVal :

{{

breakbreak;;

}}

}}

}}

}}

voidvoid buttonListenerbuttonListener((inin portport button, button,

chanendchanend c) c)

{{

intint led = 1; led = 1;

whilewhile (1) (1)

{{

selectselect

{{

casecase button button whenwhen pinseq(0) :> pinseq(0) :>

voidvoid::

{{

c <: led;c <: led;

led = (led + 1) & 0xF;led = (led + 1) & 0xF;

button button whenwhen pinseq(1) :> pinseq(1) :> voidvoid;;

breakbreak;;

}}

}}

}}

}}

Page 15: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

15Hardware Experiments for Embedded Systems on XMOS

portからのデータ入力

10行目、11行目10行目、11行目

in port p_button_0 = XS1_PORT_1K;

in port p_button_1 = XS1_PORT_1L;

入力用のポートとして、in port でボタンを定義。

XS1_PORT_1Kの値を調べる。

XS1_PORT_1KXS1_PORT_1Kをハイライトして、右クリックする。をハイライトして、右クリックする。

[Open Declaration][Open Declaration]をクリックをクリック

定義ファイルの定義行が表示される。

Page 16: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

16Hardware Experiments for Embedded Systems on XMOS

portのアドレスと名前

portportには、ハードウェには、ハードウェ

ア上の「ア上の「アドレスアドレス」があ」があ

る。(番地)る。(番地)

ここに、ここに、XCXCの言語上の言語上

で「名前」をつけて、アで「名前」をつけて、ア

クセスする。クセスする。

XS1_PORT_1KXS1_PORT_1K は、 は、portportで、で、0x109000x10900番地番地

この番地が「ボタン」だというこの番地が「ボタン」だという

のは、回路図(右の図よりものは、回路図(右の図よりも

もっと詳細な図)による。もっと詳細な図)による。

in in で宣言されているので、で宣言されているので、

「入力ポート」として使われる「入力ポート」として使われる

Page 17: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

17Hardware Experiments for Embedded Systems on XMOS

Event Listener

JavaJavaの場合には、の場合には、EventEventを受け付ける関数を受け付ける関数

ButtonListenerや、MouseListener

MouseMoutionListner, WindowListener

などが、APIで定義されて提供されている。

WindowWindow((X-WindowX-Windowや、や、WindowsWindowsなど)のプなど)のプ

ログラミングの必須項目ログラミングの必須項目

但し、但し、XCXCでは、では、buttonListenerbuttonListenerは、ごく普通のは、ごく普通の

ユーザ定義関数!ユーザ定義関数!

特別扱いできない!

Page 18: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

18Hardware Experiments for Embedded Systems on XMOS

par 構文による並列化

チュートリアルガイド チュートリアルガイド P8P8を参照を参照

chan c;

par {

flashLeds(p_leds_3_0, c);

buttonListener(p_button_0, c);

}

parparは、は、parallel[parallel[並列並列]]ののparpar

flashLedflashLeds と、 s と、 buttonListenerbuttonListenerとは、両方が別々のとは、両方が別々のスレッドスレッドとと

して、独立に(同時並行で)実行される。して、独立に(同時並行で)実行される。

XK-1XK-1は8スレッドまで対応可能は8スレッドまで対応可能

チャンネルを用いて、スレッド間で交信する。チャンネルを用いて、スレッド間で交信する。

交信用のチャンネルを、chan c; で宣言し、

独立して走るそれぞれの関数に渡す。

Page 19: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

19Hardware Experiments for Embedded Systems on XMOS

XK-1(XMOS)モジュール

XK-1 Board FeaturesXK-1 Board Features

Single XS1-L1 device

400 MIPS

Eight threads

64Kbytes RAM

8Kbytes OTP memory

128Kb SPI FLASH

Four user-configurable LEDs and two push-button switches

Two 20-way XSYS connectors for XTAG-2 debug adapter and additional XK-1s

Two 16-way IDC headers for connecting additional components

24 I/O user expansion

マルチスレッド

(8 threads!)

え?RAMがたったのこれだけ?

Page 20: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

20Hardware Experiments for Embedded Systems on XMOS

chan と chanend

「互いに独立」のスレッドは、どうやって相手のこ「互いに独立」のスレッドは、どうやって相手のこ

とを知るか?とを知るか?

間にチャンネルを持っていて、その中身を見る。

一つのチャンネル一つのチャンネル(chan)(chan)は、二つのチャンネルは、二つのチャンネル

エンドエンド(chanend)(chanend)を持つ。を持つ。

二つのチャンネルエンドを、flashLedsと、buttonListenerとで共有している。

チュートリアルチュートリアルP9P9

チャンネルが同時進行の場合、出力操作は対応

する入力操作の準備が整うまで待機します。

同様に、入力処理は処理継続の前に対応する

出力操作を待ちます。

Page 21: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

21Hardware Experiments for Embedded Systems on XMOS

チャンネルを使っての交信

buttonListenerbuttonListener内:内:7373行目行目

c <: led;

変数[ led ]の値をチャンネルに書き込み。

flashLedsflashLeds内:内:5656行目行目

case c :> ledVal : { break; }チャンネルから受け取った値を[ ledVal ]に代入

こうやって、複数のスレッド間でデータを受け渡こうやって、複数のスレッド間でデータを受け渡

ししている。ししている。

Page 22: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

22Hardware Experiments for Embedded Systems on XMOS

flashLeds内の処理

select { case t when timerafter(time) :> void: { : break; }

case c :> ledVal : { break; } }

二つの条件(のどちらか)で処理を実行する。二つの条件(のどちらか)で処理を実行する。

(1) timer tがtimeになった時 ← [点滅の間隔]

(2) チャンネルCからデータを受け取った時

Page 23: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

23Hardware Experiments for Embedded Systems on XMOS

buttonListener内の処理

casecase button button whenwhen pinseq(0) :> pinseq(0) :> voidvoid::

{{

c <: led;c <: led;

led = (led + 1) & 0xF;led = (led + 1) & 0xF;

button button whenwhen pinseq(1) :> pinseq(1) :> voidvoid;;

breakbreak;;

}}

pinseq()pinseq()は、”は、”pppppppport ort inininininininin i issssssss eqeqeqeqeqeqeqequal to”ual to”

ポートbuttonが0に等しくなるまで待つ。

pinseqpinseqと、と、pinsneqpinsneqは、必ずは、必ずwhenwhenと組んで呼ばれと組んで呼ばれ

る。る。

ボタンが押されたらボタンが押されたらledledの値を変更し、ボタンがの値を変更し、ボタンが

離されるまで待つ。この処理を繰り返す。離されるまで待つ。この処理を繰り返す。

Page 24: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

24Hardware Experiments for Embedded Systems on XMOS

発展課題

現在のプログラムは、ボタンを一つしか処理して現在のプログラムは、ボタンを一つしか処理して

いません。いません。

もう一つのボタンが押されたときには、もう一つのボタンが押されたときには、LEDLEDパパ

ターンが表示する数値が、カウントダウンする(1ターンが表示する数値が、カウントダウンする(1

ずつ減る)ようにプログラムして下さい。ずつ減る)ようにプログラムして下さい。

0の次は、0xFになるようにして下さい。

(A評価の条件とします。)(A評価の条件とします。)

Page 25: ハードウェア実験 組み込みシステム入門 第3回 2010年10月7 ...Hardware Experiments for Embedded Systems on XMOS 19 XK-1(XMOS)モジュール XK-1 Board Features

25Hardware Experiments for Embedded Systems on XMOS

次回の予告

次回は、次回は、(tutorial(tutorialを卒業して)、を卒業して)、XK-1XK-1をICトレーをICトレー

ナキットに接続します。ナキットに接続します。

XK-1上のLEDではなく、ICトレーナキット上のXK-1上のLEDではなく、ICトレーナキット上の

LEDを点灯させます。LEDを点灯させます。

正論理、負論理の考え方を学びます。正論理、負論理の考え方を学びます。