Introduction
ประสิทธิภาพแบบเรียลไทม์ของระบบหมายถึงการตอบสนองที่ถูกต้องต่อเหตุการณ์ภายนอกในระยะเวลาที่แน่นอน ในระหว่าง "เวลา" นี้ ระบบจะประมวลผลบางอย่าง เช่น การวิเคราะห์ข้อมูลป้อนเข้า การคำนวณ การประมวลผล และอื่นๆ และนอกเวลานี้ ระบบอาจไม่ได้ใช้งานและทำงานสำรอง ยกตัวอย่างเทอร์มินัลมือถือ: เมื่อโทรศัพท์โทรเข้า ระบบควรจะดังขึ้นในเวลาที่เหมาะสมเพื่อแจ้งให้โฮสต์ของการโทรและถามว่าจะรับสายหรือไม่และเมื่อโทรศัพท์ไม่ได้โทรเข้าผู้คนสามารถใช้เพื่อ ทำงานอย่างอื่น เช่น ฟังเพลง เล่นเกม เป็นต้น
RT-thread Architecture
 |
| Source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/ |
ในกรณีนี้ แนวคิดของ IoT OS ได้ถูกยกขึ้น IoT OS หมายถึงแพลตฟอร์มซอฟต์แวร์ที่อิงตามเคอร์เนลของระบบปฏิบัติการ (เช่น RTOS, Linux เป็นต้น) และรวมถึงส่วนประกอบมิดเดิลแวร์ที่ค่อนข้างสมบูรณ์ เช่น ระบบไฟล์ ไลบรารีกราฟิก เป็นต้น มีการบริโภคต่ำและมีปริมาณสูง ความปลอดภัย ปฏิบัติตาม Communication Protocol และมีความสามารถในการเชื่อมต่อบนคลาวด์ RT-Thread เป็นระบบปฏิบัติการ IoT
RT-thread Kernal
 |
source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/
|
- Object management
- Real-time scheduler
- thread management
- Inter-thread communication
- Mailbox
- Message queue
- signal
- Inter-thread Synchronization
- Clock management
- Memory management
- Device management
thread control block
 |
| source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/ |
แผนภาพสถาปัตยกรรมหลักของ RT-Thread เคอร์เนลอยู่ด้านบนของเลเยอร์ฮาร์ดแวร์ เคอร์เนลประกอบด้วยไลบรารีเคอร์เนลและการใช้งานเคอร์เนลแบบเรียลไทม์ ไลบรารีเคอร์เนลเป็นชุดย่อยของการนำฟังก์ชันที่คล้ายกับไลบรารี C ไปใช้ชุดเล็กเพื่อให้แน่ใจว่าเคอร์เนลสามารถทำงานได้อย่างอิสระ ไลบรารี C ในตัวจะแตกต่างกันบ้างขึ้นอยู่กับคอมไพเลอร์ เมื่อใช้คอมไพเลอร์ GNU GCC จะมีการใช้งานไลบรารี C มาตรฐานมากขึ้น การใช้งานเคอร์เนลแบบเรียลไทม์รวมถึงการจัดการอ็อบเจ็กต์ การจัดการเธรดและตัวกำหนดเวลา การจัดการการสื่อสารระหว่างเธรด การจัดการนาฬิกา การจัดการหน่วยความจำ ฯลฯ อาชีพทรัพยากรขั้นต่ำของเคอร์เนลคือ 3KB ROM, 1.2KB RAM
switching thread state
 |
| source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/ |
เธรดเข้าสู่สถานะเริ่มต้น (RT_THREAD_INIT) โดยการเรียกใช้ฟังก์ชัน rt_thread_crate/init(); เธรดในสถานะเริ่มต้นเข้าสู่สถานะพร้อม (RT_THREAD_READY) โดยการเรียกใช้ฟังก์ชัน rt_thread_startup(); เธรดในสถานะพร้อมถูกกำหนดโดยตัวกำหนดเวลาและเข้าสู่สถานะกำลังทำงาน (RT_THREAD_RUNNING) เมื่อเธรดที่รันเรียกใช้ฟังก์ชันเช่น rt_thread_delay(), rt_sem_take(), rt_mutex_take() หรือ rt_mb_recv() หรือไม่สามารถรับทรัพยากร เธรดจะเข้าสู่สถานะถูกระงับ (RT_THREAD_SUSPEND) หากเธรดในสถานะถูกระงับรอจนกว่าจะหมดเวลาและยังไม่ได้รับทรัพยากร หรือเธรดอื่นๆ ที่ปล่อยทรัพยากร เธรดจะกลับสู่สถานะพร้อม
RT-thread memory distribution
 |
| source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/ |
MCU ทั่วไปมีพื้นที่เก็บข้อมูลที่มีแฟลชบนชิปและ RAM บนชิป RAM เทียบเท่ากับหน่วยความจำ และ Flash เทียบเท่ากับฮาร์ดดิสก์ คอมไพเลอร์แบ่งโปรแกรมออกเป็นหลายส่วน ซึ่งถูกเก็บไว้ในพื้นที่หน่วยความจำต่างๆ ของ MCU
Clock Management
RT-Thread timer มีกลไกการจับเวลาสองประเภท:
1.ประเภทแรกเป็นตัวจับเวลาแบบ one-shot ซึ่งจะทริกเกอร์เหตุการณ์ตัวจับเวลาเพียงครั้งเดียวหลังจากเริ่มต้นแล้วตัวจับเวลาจะหยุดโดยอัตโนมัติ
2.ตัวจับเวลาทริกเกอร์เป็นระยะ ซึ่งจะทริกเกอร์เหตุการณ์ตัวจับเวลาเป็นระยะๆ จนกว่าผู้ใช้จะหยุดเอง ผู้ใช้ไม่ได้กดหยุด การดำเนินการจะดำเนินการต่อไปเรื่อยๆ
RT-Thread สามารถแบ่งออกเป็นโหมด ก็คือ HARD_TIMER และโหมด SOFT_TIMER
 |
| source: https://www.rt-thread.io/document/site/programming-manual/timer/timer/ |
- HARD_TIMER: เมื่อเริ่ม function ของ timer timeout ในโหมด HARD_TIMER จะทำงานในบริบท interrupt context และสามารถระบุได้ด้วยพารามิเตอร์ RT_TIMER_FLAG_HARD_TIMER เมื่อเริ่มต้น/สร้างตัวจับ
- SOFT_TIMER: โหมด SOFT_TIMER สามารถกำหนดค่าได้ และเมื่อเปิดใช้งานโหมดนี้ ระบบจะสร้าง timer thread จากนั้น function timer timeout ของโหมด SOFT_TIMER จะถูกดำเนินการในบริบทของเธรดตัวจับเวลา และสามารถระบุได้โดยใช้พารามิเตอร์ RT_TIMER_FLAG_SOFT_TIMER เมื่อเริ่มต้น/สร้างตัวจับเวลา
Inter-thread Synchronization
 |
| source:https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/ |
ในระบบเรียลไทม์แบบมัลติเธรด หลายครั้งที่งานสำเร็จได้ผ่านการทำงายของเธรดหลาย ๆ Thread ดังนั้น Thread หลาย Thread เหล่านี้ทำงานร่วมกันเพื่อทำงานโดยไม่มีข้อผิดพลาด จึงทำให้เกิด critical section มีหลายวิธีในการ enter/exit the critical section
- Call rt_hw_interrupt_disable() เข้าสู่ critical section และ rt_hw_interrupt_enable() ในการ exit the critical section
- Call rt_enter_critical() เข้าสู่ critical section และ rt_exit_critical() ในการ exit the critical section
ในการทำ threadsynchronization จะใช้
Semaphores
แต่ละ semaphore object มีค่า semaphore และเธรดที่รอคิว Semaphore value สอดคล้องกับจำนวนอินสแตนซ์ที่แท้จริงของ semaphore object และจำนวน number of resources หากค่าสัญญาณเป็น 5 แสดงว่ามี semaphore instances(resources) 5 รายการที่ใช้ได้ ถ้าจำนวน semaphore instances เป็นศูนย์ เธรดที่ใช้สำหรับสัญญาณจะถูกระงับในคิวรอของสัญญาณ โดยรอ semaphore instances ที่พร้อมใช้งาน
 |
| Schematic diagram of semaphore
|
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/ |
Semaphore Control Block เป็นโครงสร้างข้อมูลที่ใช้โดยระบบปฏิบัติการเพื่อจัดการสัญญาณ ซึ่งแสดงโดย struct rt rt_semaphore และ rt_sem_t แสดงถึงหมายเลขอ้างอิงของสัญญาณ และการใช้งานในภาษา C เป็นตัวชี้ไปยัง semaphore control block
mutex
ความแตกต่างระหว่าง mutex และ semaphore คือ เธรดที่มี mutex มีความเป็นเจ้าของ mutex นั้น mutex รองรับการเข้าถึงแบบ recursive access และป้องกันthread priority ของเธรดจากการr eversing และ mutex สามารถปล่อยได้โดยเธรดที่ถือไว้เท่านั้น ในขณะที่ semaphore สามารถปล่อยโดยเธรดใดก็ได้
 |
| Schematic diagram of mutex |
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/#mutex-working-mechanism |
mutex control block เป็นโครงสร้างข้อมูลที่ระบบปฏิบัติการใช้เพื่อจัดการ mutexes ซึ่งแสดงโดย struct rt rt_mutex และ rt_mutex_t แสดงถึงหมายเลขอ้างอิงของ mutex
Event Set
จะคล้ายกับ Event Grop ใน FreeRTOS
- Event ใช้สำหรับการ synchronization เท่านั้นและไม่มี transfer functionality
- Event เกี่ยวข้องกับเธรดเท่านั้น และ Event ต่าง ๆ เป็นอิสระจากกัน แต่ละเธรดสามารถมี 32 event และ recorded with a 32-bit unsigned integer
- Events ไม่มีการเข้า queue
- ใช้ logical AND และ logical OR ในการตรวจสอบหรือสร้าง event
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/#event |
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc1/ipc1/#event |
event set control block คือโครงสร้างข้อมูลที่ระบบปฏิบัติการใช้เพื่อจัดการเหตุการณ์ ซึ่งแสดงโดยโครงสร้าง rt_event และ rt_event_t แสดงถึงหมายเลขอ้างอิงของ event set
Inter-thread Communication
ในการเขียน bare-metal programming ตัวแปร global variables มักใช้สำหรับการสื่อสารระหว่างฟังก์ชันต่างๆ ตัวอย่างเช่น บางฟังก์ชันอาจเปลี่ยนค่าของ global variables เนื่องจากการดำเนินการบางอย่าง ฟังก์ชันอื่นอ่าน global variables และจะดำเนินการที่เกี่ยวข้องเพื่อให้เกิดการสื่อสารและการทำงานร่วมกันตามค่าตัวแปรส่วนกลางที่อ่าน
Mailbox
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#mailbox |
ใช้สำหรับการสื่อสารระหว่างเธรด ซึ่งมีลักษณะพิเศษคือโอเวอร์เฮดที่ต่ำและประสิทธิภาพสูง แต่ละข้อความในเมลบ็อกซ์สามารถเก็บได้ 4 bytes
Mailbox Control Block ใน RT-Thread Mailbox Control เป็นโครงสร้างข้อมูลที่ใช้โดยระบบปฏิบัติการเพื่อจัดการกล่องจดหมาย แสดงโดยโครงสร้าง rt_mailbox และ rt_mailbox_t แสดงถึงหมายเลขอ้างอิงของกล่องจดหมาย
Message Queue
Message Queuing เป็นอีกวิธีหนึ่งในการสื่อสารระหว่างเธรดที่ใช้กันทั่วไป ซึ่งเป็นส่วนขยายของ mailbox ใช้งานได้หลากหลายโอกาส เช่น การแลกเปลี่ยนข้อความระหว่างเธรด
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#message-queue |
- หนึ่งเธรดขึ้นไปสามารถรับข้อความจาก message queueได้
- เป็นไปตามหลักการเข้าก่อนออกก่อน (FIFO) Message Queue Control Block ใน RT-Thread บล็อกควบคุมคิวข้อความเป็นโครงสร้างข้อมูลที่ใช้โดยระบบปฏิบัติการเพื่อจัดการคิวข้อความ ซึ่งแสดงโดยโครงสร้าง struct rt_messagequeue และ rt_mq_t แสดงถึงหมายเลขอ้างอิงของคิวข้อความ
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#message-queue |
message queue control block เป็นโครงสร้างที่มีพารามิเตอร์สำคัญที่เกี่ยวข้องกับ message queue และมีบทบาทสำคัญในการนำฟังก์ชันของ message queueไปใช้ interfaces ที่เกี่ยวข้องของ message queue แสดงในรูป การดำเนินการกับคิวข้อความประกอบด้วย: create a message queue - send a message - receive a message - delete a message queue.
Signal
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#signal |
คือการจำลองกลไกการขัดจังหวะ เมื่อพูดถึงหลักการ เธรดที่รับสัญญาณจะคล้ายกับ processor ที่ได้รับคำขอ interrupt และ signal ใช้สำหรับการสื่อสารแบบ asynchronous ใน RT-Thread และถูกใช้ในการแจ้งเตือน Thread ว่าเกิดการ asynchronous ได้เกิดขึ้นหรือไม่
การทำงานของสัญญาณ ได้แก่ install signal, block signal, unblock signal, send signal, และรอ signal interfaces ของสัญญาณแสดงในรูปต่อไปนี้
 |
| source: https://www.rt-thread.io/document/site/programming-manual/ipc2/ipc2/#signal |
RT-Thread API
source: https://www.rt-thread.io/document/site/tutorial/quick-start/introduction/introduction/
thread create
thread delay
Suspend and resume thread
Control thread
Conclusion
RT-thread ถือเป็น Platform IoT ที่มีส่วนประกอบระดับกลางที่สมบูรณ์เเละระบบนิเวศของ Hardware เเละ Software ที่ยอมเยี่ยม โดยมีองค์ประกอบพื้นฐานที่สำคัญเกือบทั้งหมดที่จำเป็นสำหรับอุปกรณ์ IoT เช่น โปรโตคอลเครือข่าย ระบบไฟล์ การจัดการพลังงานต่ำ เป็นต้น รองรับเครื่องมือรวบรวมกระแสหลักทั้งหมดเช่น GCC, Keil, IAR ฯลฯ และอินเทอร์เฟซมาตรฐานที่หลากหลาย เช่น POSIX, CMSIS, สภาพแวดล้อมแอปพลิเคชัน C++, Micropython และ Javascript ง่ายสำหรับนักพัฒนาในการพอร์ตแอปพลิเคชันที่หลากหลาย . RT-Thread ยังให้การสนับสนุนเชิงพาณิชย์ที่ดีเยี่ยมสำหรับสถาปัตยกรรม CPU หลักทั้งหมด เช่น ARM Cortex-M/R/A, RISC-V, MIPS, X86, Xtensa เป็นต้น
ความคิดเห็น
แสดงความคิดเห็น