Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
ハードウェア実験
組み込みシステム入門
第3回
2010年10月7日
XCの文法/スイッチを読む
2Hardware Experiments for Embedded Systems on XMOS
前回予告した今日の内容
次回は、別のサンプルプログラム(二つ)を実行次回は、別のサンプルプログラム(二つ)を実行
させて、動作させながら、させて、動作させながら、XCXCのプログラム言語のプログラム言語
の文法的な説明を行います。の文法的な説明を行います。
while, select/case, if/elsewhile, select/case, if/elseなどのなどのXCXCの文法の文法
を学びます。を学びます。
LEDLEDへの出力だけではなく、ボタンの入力を学への出力だけではなく、ボタンの入力を学
びます。びます。
並列プログラミング(マルチスレッド)の書き方を並列プログラミング(マルチスレッド)の書き方を
導入します。導入します。
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の構造(終点がない=リング状
= 最後の次が最初になる)
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です。
自動生成
されます。
5Hardware Experiments for Embedded Systems on XMOS
前回の実行手順の確認
これまでの課題と同じ手順でビルドし、実行します。これまでの課題と同じ手順でビルドし、実行します。
プロジェクト名をクリックし、[ハンマー]でビルド
実行ファイル名をクリックし、▶をクリック、Run Asで[XCore Application]を選び、OK
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(巡回)
このことから、点滅を制御するロジックと、巡回を制御するロジッこのことから、点滅を制御するロジックと、巡回を制御するロジッ
クの、両方があることがわかる。クの、両方があることがわかる。
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までを実行
8Hardware Experiments for Embedded Systems on XMOS
行番号の表示方法
MenuMenuのの[Windows][Windows]からから[Preferences][Preferences]を開くを開く
General->Editors->Text EditorsGeneral->Editors->Text Editorsと開いてと開いて
いき、□ いき、□ Show line numbersShow line numbersにチェックを入にチェックを入
れる。れる。
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)
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 のセットで覚える。
11Hardware Experiments for Embedded Systems on XMOS
変数 ledValの使い方
3232行目行目
ledVal <<= 1;
if (ledVal == 0x10)
ledVal = 1;
ledValを、左に1ビット分シフトし、値が0x10に
なったら ledValに1を代入する。
初期値は、18行目で代入(1)している。
前回の「発展課題」の内容です。前回の「発展課題」の内容です。
12Hardware Experiments for Embedded Systems on XMOS
報告課題
ledledが逆向きに点灯するように、プログラムを改が逆向きに点灯するように、プログラムを改
変して下さい。変して下さい。
((CC評価の条件)評価の条件)
報告の様式として整っているもの(考察や感想も報告の様式として整っているもの(考察や感想も
十分にあるもの)については、この課題のみの十分にあるもの)については、この課題のみの
報告でも、B評価以上で判定します。報告でも、B評価以上で判定します。
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;
}}
(続く)(続く)
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;;
}}
}}
}}
}}
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]をクリックをクリック
定義ファイルの定義行が表示される。
16Hardware Experiments for Embedded Systems on XMOS
portのアドレスと名前
portportには、ハードウェには、ハードウェ
ア上の「ア上の「アドレスアドレス」があ」があ
る。(番地)る。(番地)
ここに、ここに、XCXCの言語上の言語上
で「名前」をつけて、アで「名前」をつけて、ア
クセスする。クセスする。
XS1_PORT_1KXS1_PORT_1K は、 は、portportで、で、0x109000x10900番地番地
この番地が「ボタン」だというこの番地が「ボタン」だという
のは、回路図(右の図よりものは、回路図(右の図よりも
もっと詳細な図)による。もっと詳細な図)による。
in in で宣言されているので、で宣言されているので、
「入力ポート」として使われる「入力ポート」として使われる
17Hardware Experiments for Embedded Systems on XMOS
Event Listener
JavaJavaの場合には、の場合には、EventEventを受け付ける関数を受け付ける関数
ButtonListenerや、MouseListener
MouseMoutionListner, WindowListener
などが、APIで定義されて提供されている。
WindowWindow((X-WindowX-Windowや、や、WindowsWindowsなど)のプなど)のプ
ログラミングの必須項目ログラミングの必須項目
但し、但し、XCXCでは、では、buttonListenerbuttonListenerは、ごく普通のは、ごく普通の
ユーザ定義関数!ユーザ定義関数!
特別扱いできない!
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; で宣言し、
独立して走るそれぞれの関数に渡す。
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がたったのこれだけ?
20Hardware Experiments for Embedded Systems on XMOS
chan と chanend
「互いに独立」のスレッドは、どうやって相手のこ「互いに独立」のスレッドは、どうやって相手のこ
とを知るか?とを知るか?
間にチャンネルを持っていて、その中身を見る。
一つのチャンネル一つのチャンネル(chan)(chan)は、二つのチャンネルは、二つのチャンネル
エンドエンド(chanend)(chanend)を持つ。を持つ。
二つのチャンネルエンドを、flashLedsと、buttonListenerとで共有している。
チュートリアルチュートリアルP9P9
チャンネルが同時進行の場合、出力操作は対応
する入力操作の準備が整うまで待機します。
同様に、入力処理は処理継続の前に対応する
出力操作を待ちます。
21Hardware Experiments for Embedded Systems on XMOS
チャンネルを使っての交信
buttonListenerbuttonListener内:内:7373行目行目
c <: led;
変数[ led ]の値をチャンネルに書き込み。
flashLedsflashLeds内:内:5656行目行目
case c :> ledVal : { break; }チャンネルから受け取った値を[ ledVal ]に代入
こうやって、複数のスレッド間でデータを受け渡こうやって、複数のスレッド間でデータを受け渡
ししている。ししている。
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からデータを受け取った時
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の値を変更し、ボタンがの値を変更し、ボタンが
離されるまで待つ。この処理を繰り返す。離されるまで待つ。この処理を繰り返す。
24Hardware Experiments for Embedded Systems on XMOS
発展課題
現在のプログラムは、ボタンを一つしか処理して現在のプログラムは、ボタンを一つしか処理して
いません。いません。
もう一つのボタンが押されたときには、もう一つのボタンが押されたときには、LEDLEDパパ
ターンが表示する数値が、カウントダウンする(1ターンが表示する数値が、カウントダウンする(1
ずつ減る)ようにプログラムして下さい。ずつ減る)ようにプログラムして下さい。
0の次は、0xFになるようにして下さい。
(A評価の条件とします。)(A評価の条件とします。)
25Hardware Experiments for Embedded Systems on XMOS
次回の予告
次回は、次回は、(tutorial(tutorialを卒業して)、を卒業して)、XK-1XK-1をICトレーをICトレー
ナキットに接続します。ナキットに接続します。
XK-1上のLEDではなく、ICトレーナキット上のXK-1上のLEDではなく、ICトレーナキット上の
LEDを点灯させます。LEDを点灯させます。
正論理、負論理の考え方を学びます。正論理、負論理の考え方を学びます。