บทความ ESPino32 ตอนที่ 11 การใช้งานมัลติทาสก์บนบอร์ด ESPino32

สารบัญ บทความ ESPino32

บทความ ESPino32 ตอนที่ 11 การใช้งานมัลติทาสก์บนบอร์ด ESPino32

        บทความ ESPino32 ตอนที่ 11 การใช้งานมัลติทาสก์บนบอร์ด ESPino32 เป็นการใช้งานบอร์ด ESPino32 ทำงานหลายฟังก์ชันพร้อมๆกันโดยอาศัยฟังก์ชันต่างๆ เช่น millis, timer, และ task เพื่อให้โปรแกรมทำงานหลายฟังก์ชันพร้อมๆกันได้ ตัวอย่างเช่น ใช้บอร์ด ESPino32 ในการอ่านค่าจากเซ็นเซอร์ ไฟกระพริบ และแสดงข้อมูลออกทาง Serial Monitor พร้อมๆกัน เป็นต้น ดังรูป การใช้งาน millis, timer, task บนบอร์ด ESPino32

การใช้งาน millis, timer, task บนบอร์ด ESPino32

        สำหรับการทำงานของบอร์ดไมโครคอนโทรเลอร์ โดยทั่วไปแล้วจะใช้งานบอร์ดไมโครคอนโทรเลอร์ทำงานครั้งละ 1 ฟังก์ชัน เมื่อทำงานฟังก์ชันแรกสำเร็จ จึงจะทำงานในฟังก์ชันต่อไป ตามลำดับขั้นของโปรแกรมที่ผู้ใช้ได้กำหนดไว้ ตัวอย่างเช่น ลำดับที่หนึ่งใช้งานบอร์ด ESPino32 อ่านค่าของเซ็นเซอร์ ลำดับที่สองให้บอร์ด ESPino32 ใช้งานไฟกระพริบ ลำดับที่สามใช้งานบอร์ด ESPino32 แสดงข้อมูลออกทาง Serial Monitor เป็นต้น ดังรูป ลำดับขั้นการทำงานของโปรแกรม

ลำดับขั้นการทำงานของโปรแกรม

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

        ในบทความนี้จะอาศัยฟังก์ชันที่เป็นกระบวนการทางซอร์ฟแวร์ของบอร์ด ESPino32 เพื่อทำให้บอร์ดสามารถทำงานหลายฟังก์ชันพร้อมๆกันได้ ตัวอย่างเช่น ใช้งานบอร์ด ESPino32 อ่านค่าของเซ็นเซอร์ ใช้งานไฟกระพริบ และแสดงข้อมูลออกทาง Serial Monitor เป็นต้น

ลำดับขั้นการทำงานของโปรแกรมหลายฟังก์ชันพร้อมกัน

การทำงานแบบมัลติทาสก์บนบอร์ด ESPino32

        การทำงานแบบมัลติทาสก์บนบอร์ด ESPino32 คือ การสั่งงานให้ CPU ของบอร์ด ESPino32 ทำงานหลาย ฟังก์ชันในเวลาเดียวกัน ทำให้เวลาการทำงานโดยรวมของโปรแกรมในบอร์ดน้อยลงกว่าเดิม บอร์ดจึงมีประสิทธิภาพในการทำงานมากขึ้น ในบทความนี้มีตัวอย่างการใช้งานมัลติทาสก์ทั้งหมด 3 แบบ คือ millis, timer, และ task โดยมีรายละเอียดการใช้งานดังนี้

การใช้งาน millis()

        millis() คือฟังก์ชันสำหรับนับเวลาในหน่วยมิลลิวินาที โดยจะนับตั้งแต่บอร์ดเริ่มทำงานจนกว่าจำนวนนับจะเกิดการ overflow แล้วกลับไปเริ่มนับที่ 0 ใหม่อีกครั้งหลังจากเวลาประมาณ 50 วัน

Syntax

time = millis()

Parameter

ไม่มี

Returns

เวลาในหน่วยมิลลิวินาที

ตัวอย่างการนำ “การทำงานแบบมัลติทาสก์แบบ millis()” มาประยุกต์ให้บอร์ด ESPino32 ทำงานพร้อมกัน โดยใช้ LED 3 ดวงในการแสดงผลในเวลาที่แตกต่างกัน

– LED ดวงที่ 1 กระพริบทุกๆ 0.1 วินาที

– LED ดวงที่ 2 กระพริบทุกๆ 0.5 วินาที

– LED ดวงที่ 3 กระพริบทุกๆ 1 วินาที

ต่อวงจรดังรูป วงจรไฟกระพริบด้วย LED 3 ดวง

วงจรไฟกระพริบ LED 3 ดวง

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         define ค่าคงที่ LED1 ให้มีค่าเท่ากับ 27
บรรทัดที่ 2         define ค่าคงที่ LED2 ให้มีค่าเท่ากับ 25
บรรทัดที่ 3         define ค่าคงที่ LED3 ให้มีค่าเท่ากับ 26
บรรทัดที่ 4         ประกาศตัวแปร previousMillis1, previousMillis2, previousMillis3 ชนิด unsigned long
บรรทัดที่ 5         สร้างฟังก์ชัน setup()
บรรทัดที่ 6         เปิดฟังก์ชัน setup()
บรรทัดที่ 7         กำหนดให้ LED1 เป็น OUTPUT
บรรทัดที่ 8         กำหนดให้ LED2 เป็น OUTPUT
บรรทัดที่ 9         กำหนดให้ LED3 เป็น OUTPUT
บรรทัดที่ 10        ปิดฟังก์ชัน setup()
บรรทัดที่ 11        สร้างฟังก์ชัน loop()
บรรทัดที่ 12        เปิดฟังก์ชัน loop()
บรรทัดที่ 13        ฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis1 ว่ามีค่ามากกว่าหรือเท่ากับ 100
บรรทัดที่ 14        เปิดฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis1 ว่ามีค่ามากกว่าหรือเท่ากับ 100
บรรทัดที่ 15        กำหนดให้ค่าในตัวแปร previousMillis1 มีค่าเท่ากับ millis()
บรรทัดที่ 16        สั่งงาน LED1 มีสถานะเท่ากับ การอ่านค่าสถานะของขา LED1 แล้วกลับสถานะทางลอจิก (สลับ state ของ LED1)
บรรทัดที่ 17        ปิดฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis1 ว่ามีค่ามากกว่าหรือเท่ากับ 100
บรรทัดที่ 18        ฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis2 ว่ามีค่ามากกว่าหรือเท่ากับ 500
บรรทัดที่ 19        กำหนดให้ค่าในตัวแปร previousMillis2 มีค่าเท่ากับ millis()
บรรทัดที่ 20        เปิดฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis2 ว่ามีค่ามากกว่าหรือเท่ากับ 500
บรรทัดที่ 21        สั่งงาน LED2 มีสถานะเท่ากับ การอ่านค่าสถานะของขา LED2 แล้วกลับสถานะทางลอจิก (สลับ state ของ LED2)
บรรทัดที่ 22        ปิดฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis2 ว่ามีค่ามากกว่าหรือเท่ากับ 500
บรรทัดที่ 23        ฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis3 ว่ามีค่ามากกว่าหรือเท่ากับ 1000
บรรทัดที่ 24        เปิดฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis3 ว่ามีค่ามากกว่าหรือเท่ากับ 1000
บรรทัดที่ 25        กำหนดให้ค่าในตัวแปร previousMillis3 มีค่าเท่ากับ millis()
บรรทัดที่ 26        สั่งงาน LED3 มีสถานะเท่ากับ การอ่านค่าสถานะของขา LED3 แล้วกลับสถานะทางลอจิก (สลับ state ของ LED3)
บรรทัดที่ 27        ปิดฟังก์ชันตรวจสอบค่าในตัวแปร millis() – previousMillis3 ว่ามีค่ามากกว่าหรือเท่ากับ 1000
บรรทัดที่ 28        ปิดฟังก์ชัน loop()

ผลการทดลอง

          เมื่อบอร์ด ESPino32 เริ่มทำงาน ฟังก์ชัน millis() จะเริ่มนับเวลาตั้งแต่ที่บอร์ดเริ่มทำงาน จากนั้นโปรแกรมภายในบอร์ดจะตรวจสอบการทำงานในและสั่งงาน LED แต่ละดวง โดยแบ่งการทำงานออกเป็น 3 ส่วนดังนี้

– ฟังก์ชันตรวจสอบว่าค่าในฟังชัน millis() – previousMillis1 >= 100 หรือไม่ ถ้าใช่โปรแกรมจะกำหนดให้ previousMillis1 มีค่าเท่ากับ millis() และให้ LED1 ติด/ดับสลับกัน ทำให้ LED1 ติด/ดับสลับกันทุก 0.1 วินาที

– ฟังก์ชันตรวจสอบว่าค่าในฟังชัน millis() – previousMillis2 >= 500 หรือไม่ ถ้าใช่โปรแกรมจะกำหนดให้ previousMillis2 มีค่าเท่ากับ millis() และให้ LED2 ติด/ดับสลับกัน ทำให้ LED2 ติด/ดับสลับกันทุก 0.5 วินาที

– ฟังก์ชันตรวจสอบว่าค่าในฟังชัน millis() – previousMillis3 >= 1000 หรือไม่ ถ้าใช่โปรแกรมจะกำหนดให้ previousMillis3 มีค่าเท่ากับ millis() และให้ LED3 ติด/ดับสลับกัน ทำให้ LED3 ติด/ดับสลับกันทุก 1 วินาที

ผลลัพธ์ของโปรแกรมไฟกระพริบด้วย millis()

*หมายเหตุ เนื่องจากการใช้งานมัลติทาสก์แบบ millis() ใช้การนับเวลาด้วยฟังก์ชันจึงควรใช้งานฟังก์ชันต่างๆ ที่ใช้เวลาไม่มาก เช่น อ่านค่าดิจิทัล อ่านค่าแอนะล็อก แสดงข้อความออกทาง Serial Monitor เพื่อให้เวลาโดยรวมของระบบเกิดความคลาดเคลื่อนน้อยที่สุด

** ไม่ควรใช้คำสั่ง delay() เพราะจะส่งผลกระทบกับการนับเวลา โปรเเกรมจึงอาจทำงานผิดพลาดได้

การใช้งาน timer

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

การทำงานแบบมัลติทาสก์ของ timer

ฟังก์ชันที่เกี่ยวกับการใช้งาน timer

hw_timer_t* timerBegin(byte timer, int divider, bool countUp);

        เป็นฟังก์ชันสำหรับเริ่มใช้งาน timer

Parameter

timer          หมายเลข timer ที่ต้องการใช้งาน (0-3)
divider        ตัวหารความถี่ (ใช้ prescaler ที่มีค่าเท่ากับ 80 จะได้ค่าความถี่ของ timer เท่ากับ 1 MHz)
countUp     นับเวลาขึ้น/นับลง

void timerAttachInterrupt(hw_timer_t *timer, void (*fn)(void), bool edge);

        เป็นฟังก์ชันสำหรับกำหนดฟังก์ชันที่ต้องการให้ทำงานเมื่อเกิดการอินเทอร์รัพท์

Parameter

timer          ออปเจ็คของ timer
*fn             ชื่อฟังก์ชันที่ต้องการเรียกใช้งานเมื่อเกิดการอินเทอร์รัพ
edge           เวกเตอร์ของอินเทอรรัพท์

void timerAlarmWrite(hw_timer_t *timer, long interruptAt, bool autoreload);

        เป็นฟังก์ชันสำหรับกำหนดเวลาของ timer ที่จะทำให้เกิดเหตุการณ์อินเทอร์รัพท์

Parameter

timer          ออปเจ็คของ timer
interruptAt  เวลาที่ต้องการให้เกิดการอินเทอร์รัพท์
autoreload  รีโหลดการนับใหม่หลังจากใช้งานหรือไม่

bool timerAlarmEnabled(hw_timer_t *timer);

        ฟังก์ชันสำหรับเปิดการใช้งาน timer

Parameter

timer          ออปเจ็คของ timer

ส่วนประกอบหลักในการใช้งานมัลติทาสก์แบบ timer จะมีอยู่ 3 ส่วนคือ

1. การประกาศตัวแปร

2. ฟังก์ชัน setup

3. ฟังก์ชันที่ถูกเรียกใช้งานเมื่อเกิดการอินเทอร์รัพท์

ตัวอย่างการนำ “การทำงานแบบมัลติทาสก์แบบที่ใช้งาน timer” มาประยุกต์ให้บอร์ด ESPino32 ทำงานหลายฟังก์ชันพร้อมกัน โดยใช้ LED 3 ดวงในการแสดงผลในเวลาที่แตกต่างกัน

– LED ดวงที่ 1 กระพริบทุกๆ 0.1 วินาที

– LED ดวงที่ 2 กระพริบทุกๆ 0.5 วินาที

– LED ดวงที่ 3 กระพริบทุกๆ 1 วินาที

ต่อวงจรดังรูป วงจรไฟกระพริบด้วย LED 3 ดวง

วงจรไฟกระพริบ LED 3 ดวง

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         define ค่าคงที่ LED1 ให้มีค่าเท่ากับ 27
บรรทัดที่ 2         define ค่าคงที่ LED2 ให้มีค่าเท่ากับ 25
บรรทัดที่ 3         define ค่าคงที่ LED3 ให้มีค่าเท่ากับ 26      
บรรทัดที่ 4         ประกาศตัวแปร timer แบบพอยเตอร์ชนิด hw_timer_t ให้มีค่าเท่ากับ NULL
บรรทัดที่ 5         ประกาศตัวแปร timer1 แบบพอยเตอร์ชนิด hw_timer_t ให้มีค่าเท่ากับ NULL
บรรทัดที่ 6         สร้างฟังก์ชัน onTimer() ใน Instruction RAM
บรรทัดที่ 7         เปิดฟังก์ชัน onTimer()
บรรทัดที่ 8         สั่งงาน LED1 มีสถานะเท่ากับ การอ่านค่าสถานะของขา LED1 แล้วกลับสถานะทางลอจิก (สลับ state ของ LED1)
บรรทัดที่ 9         ปิดฟังก์ชัน onTimer()
บรรทัดที่ 10        สร้างฟังก์ชัน onTimer1() ใน Instruction RAM
บรรทัดที่ 11        เปิดฟังก์ชัน onTimer1()
บรรทัดที่ 12        สั่งงาน LED2 มีสถานะเท่ากับ การอ่านค่าสถานะของขา LED2 แล้วกลับสถานะทางลอจิก (สลับ state ของ LED2)
บรรทัดที่ 13        ปิดฟังก์ชัน onTimer1()
บรรทัดที่ 14        สร้างฟังก์ชัน setup()
บรรทัดที่ 15        เปิดฟังก์ชัน setup()
บรรทัดที่ 16        กำหนดให้ LED1 เป็น OUTPUT
บรรทัดที่ 17        กำหนดให้ LED2 เป็น OUTPUT
บรรทัดที่ 18        กำหนดให้ LED3 เป็น OUTPUT
บรรทัดที่ 19        เริ่มใช้งาน timer โดยกำหนดให้ใช้งาน timer แชนแนล 0 ในการนับเวลา กำหนดตัวหารเท่ากับ 80 และกำหนดให้นับเวลาขึ้น และนำพารามิเตอร์ไปเก็บไว้ในตัวแปร timer
บรรทัดที่ 20        กำหนดให้ timer เมื่อนับเวลาครบให้เรียกใช้งานฟังก์ชัน onTimer
บรรทัดที่ 21        กำหนดให้ timer เมื่อนับเวลาครบ 100000 ไมโครวินาทีให้เกิดเหตุการอินเทอร์รัพท์ขึ้นและให้เริ่มนับเวลาใหม่หลังจากที่นับเวลาครบ
บรรทัดที่ 22        ให้ timer เริ่มนับเวลา
บรรทัดที่ 23        เริ่มใช้งาน timer1 โดยกำหนดให้ใช้งาน timer แชนแนล 1 ในการนับเวลา กำหนดตัวหารเท่ากับ 80 และกำหนดให้นับเวลาขึ้น และนำพารามิเตอร์ไปเก็บไว้ในตัวแปร timer1
บรรทัดที่ 24        กำหนดให้ timer1 เมื่อนับเวลาครบให้เรียกใช้งานฟังก์ชัน onTimer1
บรรทัดที่ 25        กำหนดให้ timer1 เมื่อนับเวลาครบ 500000 ไมโครวินาทีให้เกิดเหตุการอินเทอร์รัพท์ขึ้นและให้เริ่มนับเวลาใหม่หลังจากที่นับเวลาครบ
บรรทัดที่ 26        ให้ timer1 เริ่มนับเวลา
บรรทัดที่ 27        สร้างฟังก์ชัน loop()
บรรทัดที่ 28        เปิดฟังก์ชัน loop()
บรรทัดที่ 29        สั่งงาน LED3 มีสถานะเท่ากับ การอ่านค่าสถานะของขา LED3 แล้วกลับสถานะทางลอจิก (สลับ state ของ LED3)
บรรทัดที่ 30        หน่วงเวลา 1000 มิลลิวินาที
บรรทัดที่ 31        ปิดฟังก์ชัน loop()

ผลการทดลอง

            เมื่อบอร์ด ESPino32 เริ่มทำงาน สามารถอธิบายการทำงานแยกได้เป็น 3 ส่วนดังนี้

– โปรแกรมจะประกาศ timer ที่ใช้ timer แชนแนล 0 ทำการนับเวลา 0.1 วินาที เมื่อครบเวลาที่กำหนดจะเกิดเหตุการณ์อินเทอร์รัพท์ขึ้น เมื่อเกิดเหตุการณ์อินเทอร์รัพท์ขึ้นโปรแกรมจะเรียกใช้งานฟังก์ชัน onTimer() เพื่อสั่งงานให้ LED1 แสดงผลสลับจากสถานะเดิม

– โปรแกรมจะประกาศ timer1 ที่ใช้ timer แชนแนล 1 ทำการนับเวลา 0.5 วินาที เมื่อครบเวลาที่กำหนดจะเกิดเหตุการณ์อินเทอร์รัพท์ขึ้น เมื่อเกิดเหตุการณ์อินเทอร์รัพท์ขึ้นโปรแกรมจะเรียกใช้งานฟังก์ชัน onTimer1() เพื่อสั่งงานให้ LED2 แสดงผลสลับจากสถานะเดิม

– โปรแกรมในฟังก์ชัน loop() จะสั่งงานให้ LED3 แสดงผลสลับจากสถานะเดิม ทุกๆ 1 วินาที

ผลลัพธ์ของโปรเเกรมไฟกระพริบด้วย timer

การใช้งาน task

        task คือโปรเซสของงานอย่างใดอย่างหนึ่ง ในการใช้งานที่เกี่ยวกับไมโครคอนโทรเลอร์จะเกี่ยวข้องกับการทำงานแบบมัลติทาสก์หรือทำงานหลายๆอย่างในเวลาเดียวกัน ทาสก์แต่ละทาสก์สามารถทำงานอย่างเป็นอิสระหรือทำงานแบบเกี่ยวข้องกันก็ได้ เนื่องจากไมโครคอนโทรเลอร์นั้นมีทรัพยากรทางด้านฮาร์ดแวร์ เช่น CPU RAM Memory อยู่ค่อนข้างจำกัด ดังนั้นจำเป็นต้องมีระบบปฏิบัติการขนาดเล็กหรือ OS (บอร์ด ESPino32 ใช้ freeRTOS) ในการจัดสรรทรัพยากรต่างๆเพื่อให้บอร์ดสามารถทำงานตามโปรแกรมต่างๆ ที่ให้ความสำคัญในเกี่ยวกับเวลาได้ ตัวอย่างเช่น การเขียนโปรแกรมให้โปรแกรมแรกทำงานให้สำเร็จภายในเวลาหนึ่งวินาที และโปรแกรมที่สองทำงานให้สำเร็จในสองวินาที โดยให้โปรแกรมทั้งสองส่วนทำงานไปพร้อมๆกัน เป็นต้น

ส่วนประกอบหลักในการเขียนโปรแกรมแบบมัลติทาสก์ จะมีอยู่ 2 ส่วนคือ

1. ฟังก์ชัน setup

2. ฟังก์ชันที่เรียกใช้งาน

ตัวอย่างการนำ “การทำงานแบบมัลติทาสก์แบบ task” มาประยุกต์ให้บอร์ด ESPino32 ทำงานหลายฟังก์ชันพร้อมกัน โดยให้บอร์ด ESPino32 ทำงาน 3 อย่างพร้อมกันดังนี้

– อ่านค่าสวิทต์ทุกๆ 0.5 วินาที

– LED กระพริบทุกๆ 1 วินาที

– สแกนไวไฟทุกๆ 5 วินาที

ต่อวงจรดังรูป การทำงานแบบมัลติทาสก์ด้วย task

การทำงานแบบมัลติทาสก์ด้วย task

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1-3      ใช้งานไลบรารี่ WiFi, กำหนดค่าตัวแปร pushButton เท่ากับ 25 และ LED เท่ากับ 26 ตามลำดับ          
บรรทัดที่ 4-16     ฟังก์ชัน taskOne_SW() อ่านค่าจาก pushButton และแสดงผลออกทาง Serial Monitor ทุกๆ 500 มิลลิวินาที
บรรทัดที่ 17-26   ฟังก์ชัน taskTwo_LED() สลับการทำงานของ LED ทุกๆ 1000 มิลลิวินาที
บรรทัดที่ 27-32   ฟังก์ชัน setup() สร้าง task จำนวน 2 task โดยแบ่งเป็น

– task สำหรับเรียกใช้งาน ฟังก์ชัน taskOne_SW()

– task สำหรับเรียกใช้งาน ฟังก์ชัน taskTwo_LED()

บรรทัดที่ 33-58   ฟังก์ชัน loop() แสกน Wi-Fi และแสดงผลออกทาง Serial Monitor ทุกๆ 5 มิลลิวินาที

ผลการทดลอง

        เมื่อบอร์ด ESPino32 เริ่มทำงาน สามารถอธิบายการทำงานแยกได้เป็น 3 ส่วนดังนี้

– taskOne_SW() อ่านค่าจาก pushButton และแสดงผลออกทาง Serial Monitor ทุกๆ 0.5 วินาที
– taskTwo_LED() สลับการทำงานของ LED ทุกๆ 1 วินาที
– โปรแกรมในฟังก์ชัน loop() จะสั่งงานให้บอร์ด ESPino32 Scan Wi-Fi และแสดงผลออกทาง Serial Monitor ทุกๆ 5 วินาที

ผลลัพธ์ของโปรแกรม การทำงานด้วย task

            สำหรับบทความ ESPino32 ตอนการใช้งานมัลติทาสก์บนบอร์ด ESPino32 เป็นเนื้อหาที่เกี่ยวกับการทำงานพร้อมกันครั้งละหลายๆฟังก์ชัน ซึ่งประกอบไปด้วยเนื้อหาของการใช้งานแบบต่างๆ เช่น millis, timer และ task โดยการใช้งานแต่ละอย่างจะมีความเหมาะสม และข้อดีข้อเสียแตกต่างกันไป เช่น ถ้าใช้งาน millis จะต้องให้โปรแกรมทำงานให้เสร็จเร็วที่สุดแล้วนับเวลาใหม่ซึ่งบางฟังก์ชันอาจจะกินเวลามากทำให้เวลาการทำงานโดยรวมไปทำให้การทำงานผิดพลาด, ถ้าใช้ timer จะมีชุดฮาร์ดแวร์สำหรับนับเวลา 4 แชนแนลทำให้ถูกจำกัดการใช้งานด้วยฮาร์ดแวร์, ถ้าใช้งาน task จะต้องแบ่งทรัพยากรออกเป็นส่วนๆ เพื่อใช้งานหากควบคุมไม่ดีอาจมีการ error ทำให้บอร์ดเกิดการ reboot ตลอดเวลาได้ เป็นต้น และในการใช้งานมัลติทาสก์แบบ millis, timer และ task จะเป็นการทำงานโดยการประมวลผลบน CPU Core ใด Core หนึ่ง ซึ่งแท้จริงแล้วบอร์ด ESPino32 นั้นมี CPU ทั้งหมด 2 Core ดังนั้นเราจึงไม่สามารถดึงประสิทธิภาพของบอร์ดออกมาได้สูงสุด ในบทความถัดไปจะเป็นการเขียนโปรแกรมแบบมัลติคอร์ซึ่งเป็นการแยกโปรแกรมให้ทำงานแบบ 2 อย่างไปพร้อมๆกัน เพื่อดึงประสิทธิภาพการทำงานของ ESPino32 ให้เกิดประโยชน์สูงสุด

ขอขอบคุณแหล่งข้อมูลอ้างอิงจาก

– https://techtutorialsx.com/2017/10/07/esp32-arduino-timer-interrupts/

– https://techtutorialsx.com/2017/05/06/esp32-arduino-creating-a-task/

– http://esp32.info/docs/esp_idf/html/dd/d3c/group__xTaskCreate.html

สารบัญ บทความ ESPino32