程式設計實作

Download Report

Transcript 程式設計實作

程式設計實作
平行處理


NXT可以執行多個task,這就是「多功(multitasking)」的概念。
同時執行多個task時要小心,因為它們有可能會
互相干擾。
互相干擾
task bumping(){
while (true){
…….
Bumping負責,當感應器被按下,會退後一點點再轉90度灣。
}
}
task square(){
while (true){
…….
Square負責,機器人行走正方形路線。
}
}
task main(){
SetSensorTouch(S1);
start bumping;
start square;
}
在main裡呼叫,bumping和square。
也可以寫成Precedes(bumping, square);
關鍵區與互斥變數
mutex move;
task bumping(){

while (true){
Acquire(move)
…….
Release(move)

}}
task square(){
Acquire(move)
…….
Release(move)
}}
task main(){
SetSensorTouch(S1);
Precedes(bumping, square);
}

解決互相干擾的方法就是
確保隨時只有一個task在控
制機器人。
Mutex特性:同一時間只有
一個task可以擁有它。
存取mutex是透過Acquire()
與Release()指令來完成的。
使用號誌

使用一個變數來只輸到底是哪一個task在控制馬
達,其他的task除非收到正在使用該變數的task
說:「我已經使用完畢」的訊息,否則不能去
控制馬達。
if (smp == 0){
smp = 1; //抓住號誌器→開始使用
//這裡就是關鍵區
smp = 0; //釋放號誌器→使用完畢
}
//EX9-4
bool smp;
task bumping(){
SetSensorTouch(S1);
task square()
while (true)
{
{
while (true)
if (Sensor(S1) == 1)
{
{
until (smp == 0);
until (smp == 0); smp = 1;
smp = 1;
OnRev(OUT_AC,75); Wait(500);
OnFwd(OUT_AC,
OnFwd(OUT_A, 75); Wait(850);
75);
smp = 0;
smp = 0;
}
Wait (1000);
}
until (smp == 0);
}
smp = 1;
OnRev(OUT_C,
task main(){
75);
smp = 0;
smp = 0;
Wait(850);
}
Precedes(square, bumping);
}
實作
實作一
寫一個可以讓機器人走一正方形路線,但當10公分內出現障礙物時會
閃避的程式。城市需要使用號誌器以及多個task來管理機器人的各部分功能。
實作一
請將EX9-4用mutex改寫。
PPT下載位址:
http://oss.csie.fju.edu.tw/~neilsun100/program.html