was successfully added to your cart.

แนะนำคอร์สน้องใหม่เกี่ยวกับ RealTime, Multithreading & Multiprocess programming on Linux

By March 4, 2014Uncategorized

ปกติในการดีไซน์ซอฟแวร์มีประสิทธิภาพและทำงานทันเวลาบน Embedded linux จะมีหลายวิธีเช่น

  1.  Event-driven programming
  2.  Multi-threading programming
  3.  Multi-processing programming

ผมจะยกตัวอย่างง่ายๆ นะครับ

เคยมีไหมครับกรณีที่เราอยากให้ซอฟแวร์ทำงานอะไรบางอย่างพร้อมๆ กัน หรืออยากให้ทำทันเวลาเช่น

  •  หุ่นยนต์มีการประมวลผลภาพผ่านกล้อง แต่ในระหว่างนั้นก็ต้องบังคับมอเตอร์เพื่อควบคุมทิศทางด้วยระบบควบคุม PID
    ( ระหว่างประมวลผลภาพอาจจะทำให้เวลาของระบบควบคุมเปลี่ยนแปลงไปได้ทำให้ระบบควบคุมไม่ถูกต้อง )
  •  อยากให้เขียนข้อมูลลงบน Disk ไปพร้อมๆ กับ ติดต่อสื่อสารกับอุปกรณ์ตัวอื่นผ่าน Network โดยบางครั้งข้อมูลที่จะเขียนลงบนดิสก์ก็มีขนาดพอสมควร
    ( เขียนข้อมูลลง disk บางครั้งก็คอขวด )
  •  อยากให้ไฟกระพริบ พร้อมสามารถรับส่งข้อมูลผ่าน Serial แล้วนำไปประมวลผลโดยที่ไฟยังกระพริบเหมือนเดิม
    ( ตัวอย่างง่ายๆ ที่เห็นได้ชัดสมมติอยากทำไฟกระพริบที่ 1 วินาที แต่อยากให้รับข้อมูลจาก Serial แล้วทำอย่างอื่นได้ด้วย )

กรณีดังกล่าวข้างต้นนับว่าเป็นปัญหาสำหรับนักพัฒนาซอฟแวร์มือใหม่บน Embedded Linux
วันนี้ผมจะยกตัวอย่างซักหัวข้อหนึ่งที่จะเรียนในคอร์สครับในที่นี้ครับคือ Multi-threading programming ( ในคอร์สจะเรียนทั้งหมด 3 หัวข้อ )


Multithreading Programming

Thread อาจจะเป็นสิ่งที่ขยาดสำหรับนักพัฒนาทั้งหลาย จนถึงขนาดมีคำกล่าวว่า thread are evil avoid them !!!!
สาเหตุเนื่องจากมาจาก การใช้ thread เป็นเหมือนอาวุธสองคม ถ้าเราใช้งานมันถูกต้อง application ของเราจะมีประสิทธิภาพสูงมากกว่าการพัฒนาซอฟแวร์แบบปกติ
แต่ถ้าใช้ผิดวิธีหรือไม่เข้าใจการทำงาน Bug มหาศาลแถม debug ยากสุดๆ จะตามมา

ตัวอย่างวันนี้เราจะใช้ pthread และวันสอนเราจะใช้ pthread เหมือนเดิมเนื่องจากเป็นไลบรารี่ที่ค่อนข้างชัวร์ว่า Embedded Linux ทุกตัวมี
แต่ถ้าไครอยากจะนำความรู้ที่เรียนไปประยุกต์บน Library ที่เป็น multithread high level กว่า pthread ก็ได้นะครับเช่น boost::thread, OpenMP เป็นต้น
สิ่งสำคัญคือหัวใจการดีไซน์มากกว่า

ตัวอย่างของ platform ที่จะนำมาเขียนโปรแกรมแบบ multithread ให้ดูวันนี้คือ intel galileo ครับ สาเหตุที่เหลือ intel galileo เนื่องจากใกล้มือตอนนี้ และ setup ในการเขียนง่าย ( ประยุกต์ใช้งานจริงกับบอร์ดไหนก็ได้นะครับ )


สมมติผมมีโจทย์อยู่ว่า

  • ต้องการให้ LED บนบอร์ดกระพริบสม่ำเสมอที่ 1 วินาที
  • ถ้าเมื่อไรที่ส่งตัว ‘A’ จากคอมพิวเตอร์ผ่าน Serial Port ไปที่บอร์ดจะต้องตอบคำว่า Hello กลับมาทันที

โจทย์แบบนี้ใช้ interrupt ง่ายกว่าประสิทธิภาพดีกว่าด้วย หรือใช้ polling event เอาก็ได้ทำได้เหมือนกัน …
แต่อย่าเพิ่งจับผิดเรื่องโจทย์กันเลยครับ ถ้าโจทย์ยากไปเดี๋ยวโค้ดจะดูยากปล่าวๆ มือใหม่จะถอดใจได้

เอาละมาดูโค้ดกัน

thread

ให้สังเกตุที่ task1 และ task2 ครับ ทั้งสอง task นี้จะทำงานไปพร้อมๆ กัน ถ้าไครเคยเขียน Arduino มาก่อนคงเดาได้ว่าสอง task นี้ทำงานพร้อมกันจะเป็นเช่นไร
แต่เนื้อหา multithread เยอะกว่านี้มากครับ คงไม่ใช่สร้าง task มาแล้วก็จบๆ กันไปแน่นอน

ในวันเรียนเราจะเน้นไปที่เนื้อหาเหล่านี้ละครับ โดยเฉพาะการออกแบบซอฟแวร์ ข้อดีข้อเสีย ของแต่ละแบบ เอามาผสมกันได้ไหม และแชร์ประสบการณ์ของผลิตภันฑ์ที่อยู่บน Production ของผู้สอน
ไครสนใจก็ตามไปอ่านรายละเอียดแบบเต็มกันได้เลยที่

http://www.deaware.com/event/real-time-and-multithreading-programming-on-linux-course/

Leave a Reply

*