22 มิ.ย. 2023 เวลา 06:19 • วิทยาศาสตร์ & เทคโนโลยี

Protothreads โปรโตเธรด

คือ Ligth Weight Stackless Thread ออกแบบสำหรับงาน Embedded ขนาดเล็ก หรือ Sensor Network Nodes.
กล่าวโดยรวม โปรโตเธรดคือ วิธีการจัดการงานแบบไม่มีแสต็กขนาดเล็ก ใช้หน่วยความจำน้อย เธรดแต่ละเธรดทำงานแบบลิเนียร์นั่นคือ ไม่มีการเรียกใช้ Timer Interrupt การเรียกแต่ละเธรดทำงานจึงเรียงลำดับกันไปเรื่อยๆ จึงเหมากับใช้ในระบบเครือข่ายเซนเซอร์ไร้สาย (Wireless Sensor Network)
Protothread เขียนด้วยภาษา C เท่านั้นแตกต่างจาก RTOS อื่นๆ ที่จะต้องมีการทำ Task Switch โดยจะต้องเขียนด้วย Assembly แยกแต่ละประเภทชิป
โปรโตเธรดสามารถทำงานภายใต้ RTOS ได้ หากเมื่อต้องการปิดกั้นเหตการณ์ Blocking Event Handlers.
ตัวอย่าง
#include "pt.h"
 
struct pt pt;
struct timer timer;
 
PT_THREAD(example(struct pt *pt))
{
PT_BEGIN(pt);
 
while(1) {
if(initiate_io()) {
timer_start(&timer);
PT_WAIT_UNTIL(pt,
io_completed() ||
timer_expired(&timer));
read_data();
}
}
PT_END(pt);
}
ข้อความจากเวปไซต์ของ Adam Dunkle กล่าวว่า
While protothreads originally were created for memory-constrained embedded systems, it has found many uses as a general purpose library too. Examples include multimedia streaming server software, grid computing research software, and MPEG decoding software for Internet TVs.
Adam Dunkle
เดิมทีนั้น Protothreads สร้างให้ใช้กับระบบ Embedded ซึ่งมีหน่วยความจำจำกัด(มีหน่วยความจำน้อย) พบว่าผู้ใช้หลายคนต้องการใช้กับไลบรารี่ทั่วไปด้วย เช่น ต้องการใช้กับระบบ Streaming Server, Grid Computer ในการวิจัย และ โปรแกรมถอดรหัส MPEG สำหรับทีวีผ่าน Internet(<อย่างหลังนี่ต้องใช้ทั้งเมมโมรี่มากและต้องมีความเร็วในการถอดรหัสสูงประมาณหนึ่ง จนระบบเก่าๆ ต้องสร้างชิปเฉพาะสำหรับถอดรหัส)
คุณสมบัติ
ใช้แรมน้อย เพียง 2 Byte ต่อ 1 Protothread และไม่อต้องการ Stack เพิ่มเติม
ย้าย Code ง่าย เพราะใช้ภาษา C เท่านั้น ไม่ขึ้นกับชนิดไอซีหรือสถาปัตยกรรมใดๆ ไม่ต้องการ Assembly Code
ใช้ร่วมกับ RTOS หรือไม่ใช้ร่วมกันก็ได้
มี Blocking, Wait ไม่ต้องใช้ Multithreading เต็มรูปแบบ หรือ ไม่ต้องใช้ Stack Switching
ไลเซ่นส์ภายใต้ BSD ใช้งานได้ฟรี
จากคุณสมบัติที่กล่าวมา จึงเหมาะกับระบบ
ระบบที่มีหน่วยความจะน้อย ทั้ง ROM และ RAM
ระบบ Event-Driven เช่นกลุ่มโปรโตคอลต่างๆ
ระบบ Embedded ขนาดเ,้ก
ระบบเครือข่ายเซนเซอร์ไร้สาย Wireless Sensor Network
ระบบที่ต้องย้าย Code C บ่อยๆ เช่น ระบบราคาถูก ชิปขาดตลาดเป็นต้น
โปรโตเธรด ได้แก้ปัญหาการเขียนโค้ดด้วย Switch/Case เช่น Switch/Case ใน State Machine ต่างๆ โดยการใช้ มาโคร(ทำให้ Protothread ย้ายระบบได้ง่าย ไม่ต้องอาศัย Assembly) ซึ่งทำให้ Code มีความเป็นเชิงเส้นมากขึ้น (ข้าม Threads น้อยลง Thread ที่ถูกข้ามก็จะใช้เวลารอคอยน้อยลง)
โปรโตเธรดทำงานบนสแต็กเดียวทั้งโปรเจก และสลับคอนเท็ก(เนื้อหาโปรแกรม)ด้วยการวนซ้ำสแต็กซ์ ซึ่งทำให้ Protothread ใช้หน่วยความจำน้อย อย่างไรก็ตาม Protothread ทำงานภายใต้ C เพียงฟังก์ชั่นเดียวและไม่สามารถข้าม/ขยายฟังก์ชั่นได้ แต่สามารถเรียกข้ามฟังก์ชั่นได้ (ไม่สามารถ Block เหตุการณ์ภายใต้ฟังก์ชั่นที่เรียกได้ ดังนั้นต้องมั่นใจว่าฟังก์ชั่นย่อยสามารถทำงานได้รวดเร็ว
ตัวแปร Local — Local Variables
เนื่องจากโปรโตเธดไม่จำตำแหน่ง Stack เมื่อเกิด Blocking ทำให้ตัวแปร Local อาจจะหายไปได้(ค่าเดิมหายไป) จะต้องใช้ตัวแปร Local อย่างระมัดระวัง ถ้าหลีกเลี่ยงได้ก็ควรหลีกเลี่ยงการใช้ตัวแปร Local ภายใใต้ Protothread (แต่ก็สามารถเรียกใช้ฟังก์ชั่นย่อยที่เรียกใช้ตัวแปร Local อีกทีได้ หรือใช้ static variable ภายใต้ ฟังก์ชั่นย่อยได้)
โฆษณา