ผลต่างระหว่างรุ่นของ "มัลติทาสกิ้งบนไมโครคอนโทรลเลอร์"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 5: แถว 5:
 
จะเห็นว่างานทั้งหมดประกอบด้วยงานย่อยสองงาน ที่ผ่านมานั้นหากใช้เฟรมเวิร์กของ Arduino การทำให้เพียง LED สีเขียวกระพริบตามที่กำหนดทำได้โดยการเขียนโค้ดในฟังก์ชัน <code>loop</code> ลักษณะนี้
 
จะเห็นว่างานทั้งหมดประกอบด้วยงานย่อยสองงาน ที่ผ่านมานั้นหากใช้เฟรมเวิร์กของ Arduino การทำให้เพียง LED สีเขียวกระพริบตามที่กำหนดทำได้โดยการเขียนโค้ดในฟังก์ชัน <code>loop</code> ลักษณะนี้
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 +
// LED สีเขียวติด 1 วินาที ดับ 0.5 วินาที
 
void loop()
 
void loop()
 
{
 
{
แถว 16: แถว 17:
 
ในขณะที่การทำให้ LED สีแดงกระพริบจะใช้โค้ดดังนี้
 
ในขณะที่การทำให้ LED สีแดงกระพริบจะใช้โค้ดดังนี้
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 +
// LED สีแดงติด 0.7 วินาที ดับ 0.3 วินาที
 
void loop()
 
void loop()
 
{
 
{
แถว 27: แถว 29:
 
อย่างไรก็ตาม การให้ LED ทั้งสองดวงกระพริบตามจังหวะของตัวเองขนานกันไปนั้นไม่อาจทำได้โดยการรวมงานทั้งคู่เข้าด้วยกันอย่างตรงไปตรงมาเช่นนี้ได้
 
อย่างไรก็ตาม การให้ LED ทั้งสองดวงกระพริบตามจังหวะของตัวเองขนานกันไปนั้นไม่อาจทำได้โดยการรวมงานทั้งคู่เข้าด้วยกันอย่างตรงไปตรงมาเช่นนี้ได้
 
<syntaxhighlight lang="C">
 
<syntaxhighlight lang="C">
 +
 +
// โค้ดด้านล่างไม่ได้ทำงานตามพึงประสงค์
 +
 
void taskGreen()
 
void taskGreen()
 
{
 
{

รุ่นแก้ไขเมื่อ 08:19, 19 ตุลาคม 2557

โปรแกรมควบคุมที่ใช้ในคอมพิวเตอร์แบบฝังตัวนั้นมักต้องการให้มีการทำงานหลายส่วนขนานกันไป อาทิเช่นการตรวจสอบสถานะของแสงเพื่อเปิดปิดไฟในขณะที่ต้องตรวจสอบสถานะการกดปุ่มสวิตช์ไปด้วยในเวลาเดียวกัน หรือการทำไฟกระพริบเป็นจังหวะเพื่อแสดงให้เห็นว่าอุปกรณ์กำลังทำงานในขณะที่ต้องคอยวนตรวจสอบข้อมูลที่มาจากพอร์ท USB เป็นต้น ในสถานการณ์เหล่านี้แม้ว่าแต่ละงานย่อยจะมีการทำงานที่ตรงไปตรงมา แต่การทำงานย่อยขนานกันไปพร้อมกันบนไมโครคอนโทรลเลอร์ที่มีหน่วยประมวลผลเดียวโดยไม่มีระบบปฏิบัติการคอยช่วยเหลือเป็นเรื่องที่ค่อนข้างซับซ้อน พิจารณาตัวอย่างโปรแกรมควบคุม LED สองดวงให้กระพริบเป็นอิสระต่อกันดังนี้

ตัวอย่าง: เขียนเฟิร์มแวร์ที่ทำให้ LED สีเขียวบนบอร์ดพ่วงติด 1 วินาทีและดับ 0.5 วินาทีสลับกันไป ในขณะเดียวกันทำให้ LED สีแดงติด 0.7 วินาทีและดับ 0.3 วินาทีสลับกันไป

จะเห็นว่างานทั้งหมดประกอบด้วยงานย่อยสองงาน ที่ผ่านมานั้นหากใช้เฟรมเวิร์กของ Arduino การทำให้เพียง LED สีเขียวกระพริบตามที่กำหนดทำได้โดยการเขียนโค้ดในฟังก์ชัน loop ลักษณะนี้

// LED สีเขียวติด 1 วินาที ดับ 0.5 วินาที
void loop()
{
  digitalWrite(PIN_PC2, HIGH);
  delay(1000);
  digitalWrite(PIN_PC2, LOW);
  delay(500);
}

ในขณะที่การทำให้ LED สีแดงกระพริบจะใช้โค้ดดังนี้

// LED สีแดงติด 0.7 วินาที ดับ 0.3 วินาที
void loop()
{
  digitalWrite(PIN_PC0, HIGH);
  delay(700);
  digitalWrite(PIN_PC0, LOW);
  delay(300);
}

อย่างไรก็ตาม การให้ LED ทั้งสองดวงกระพริบตามจังหวะของตัวเองขนานกันไปนั้นไม่อาจทำได้โดยการรวมงานทั้งคู่เข้าด้วยกันอย่างตรงไปตรงมาเช่นนี้ได้

// โค้ดด้านล่างไม่ได้ทำงานตามพึงประสงค์

void taskGreen()
{
  digitalWrite(PIN_PC0, HIGH);
  delay(700);
  digitalWrite(PIN_PC0, LOW);
  delay(300);
}

void taskRed()
{
  digitalWrite(PIN_PC0, HIGH);
  delay(700);
  digitalWrite(PIN_PC0, LOW);
  delay(300);
}

void loop()
{
  taskGreen();
  taskRed();
}
ผังภาพเครื่องจักรสถานะของการทำไฟสีเขียวติด 1 วินาที ดับครึ่งวินาที

การใช้ไลบรารี Protothreads