พื้นฐาน การทำงานของ Kernel
การแนะนำเคอร์เนล กระบวนการเริ่มต้นของระบบ และการตั้งค่าบางส่วนของเคอร์เนล เพื่อเป็นรากฐานให้เข้าใจเนื้อหาในบทต่อ ๆ ไป
ในส่วนนี้จะเป็นการเกริ่นนำเกี่ยวกับโครงสร้างซอฟต์แวร์ของ RT-Thread Kernel เพื่ออธิบายองค์ประกอบและการทำงานของเคอร์เนลเรียลไทม์ พร้อมทั้งแนวคิดพื้นฐานที่ผู้เริ่มต้นควรรู้ หลังจากเรียนจบบทนี้ ผู้อ่านจะเข้าใจว่า
- เคอร์เนลประกอบด้วยอะไรบ้าง
- ระบบเริ่มทำงานอย่างไร
- หน่วยความจำถูกจัดสรรอย่างไร
- และวิธีการตั้งค่าเคอร์เนล

เคอร์เนล เป็นส่วนที่สำคัญที่สุดและพื้นฐานที่สุดของระบบปฏิบัติการ ใน RT-Thread เคอร์เนลทำงานอยู่เหนือชั้นฮาร์ดแวร์ ภายในประกอบด้วย 2 ส่วนหลัก คือ - Kernel Library (ไลบรารีของเคอร์เนล) - Real-Time Kernel Implementation (การทำงานของเคอร์เนลเรียลไทม์)
Kernel Library คือชุดฟังก์ชันย่อยที่คล้ายกับ C Library ซึ่งถูกทำขึ้นมาเพื่อให้เคอร์เนลสามารถทำงานได้อย่างอิสระ โดยฟังก์ชันที่รวมอยู่จะแตกต่างกันไปตาม Compiler ที่ใช้ เช่น ถ้าใช้ GNU GCC จะมีฟังก์ชันจาก C Library ที่รองรับมากกว่า Compiler อื่น
C Library หรือ C Runtime Library มีฟังก์ชันมาตรฐาน เช่น strcpy, memcpy, รวมถึงบาง Compiler ที่รองรับ printf และ scanf ด้วย ส่วน RT-Thread Kernel Service Library จะมีเพียงบางส่วนของ C Library ที่จำเป็นเท่านั้น และเพื่อไม่ให้ชื่อซ้ำกับ C Library มาตรฐาน ฟังก์ชันเหล่านี้จะมี Prefix rt_ นำหน้า
การทำงานของ Real-Time Kernel ประกอบด้วย
- การจัดการ Object Object Management object.c
- การจัดการ Real-time Scheduler schedule.c
- การจัดการ Thread Management thread.c
- การสื่อสาร Inter-Thread Communication ipc.c
- การจัดการ Clock clock.c, timer.c
- การจัดการหน่วยความจำ Memory Management mem.c, memheap.c
- Device Management device.c
ซึ่งใช้ทรัพยากรน้อยมาก โดยขั้นต่ำคือ 3KB ROM และ 1.2KB RAM
ได้เลยครับ นี่คือคำแปลเป็นภาษาไทย
กระบวนการเริ่มต้นการทำงานของ RT-Thread
การทำความเข้าใจโค้ดส่วนใหญ่มักจะเริ่มต้นจากการเรียนรู้กระบวนการเริ่มต้นการทำงาน (startup process) ก่อนอื่น เราจะมาดูที่มาของการเริ่มต้นนี้กันก่อน RT-Thread รองรับการทำงานบนหลายแพลตฟอร์มและหลายคอมไพเลอร์ โดยมีฟังก์ชัน rtthread_startup() เป็นจุดเริ่มต้นการทำงาน (entry point) ที่เป็นมาตรฐานเดียวกันซึ่ง RT-Thread ได้กำหนดไว้
ลำดับการทำงานโดยทั่วไปคือ: ขั้นแรก ระบบจะเริ่มทำงานจากไฟล์เริ่มต้น (Startup file) จากนั้น จึงเข้าสู่ฟังก์ชัน rtthread_startup() และสุดท้าย จะเข้าสู่ฟังก์ชัน main() ซึ่งเป็นจุดเริ่มต้นของโปรแกรมที่ผู้ใช้เขียนขึ้น กระบวนการเริ่มต้นการทำงานของ RT-Thread สามารถสรุปได้ดังแผนภาพด้านล่าง:

เมื่อยกตัวอย่าง MDK-ARM จุดเริ่มต้นของโปรแกรมผู้ใช้ (user program entry) ก็คือฟังก์ชัน $main() ซึ่งอยู่ในไฟล์ main.c การเริ่มต้นของระบบจะเริ่มจากโค้ดภาษาแอสเซมบลี startup_stm32f103xe.s จากนั้นจะข้ามไปทำงานในส่วนของโค้ดภาษา C เพื่อเตรียมการฟังก์ชันของระบบ RT-Thread และสุดท้ายจึงเข้าสู่ฟังก์ชัน $main() ซึ่งเป็นจุดเริ่มต้นของโปรแกรมผู้ใช้
เพื่อให้การเตรียมการฟังก์ชันของระบบ RT-Thread เสร็จสมบูรณ์ก่อนที่จะเข้าสู่ $main() เราได้ใช้ส่วนขยาย (extensions) ของ MDK ที่เรียกว่า $Sub$$ และ $Super$$ โดยเราสามารถเติมคำนำหน้า $Sub$$ เข้าไปที่ main เพื่อสร้างฟังก์ชันใหม่ชื่อว่า $Sub$$main ได้ ซึ่งใน $Sub$$main นี้ เราจะสามารถเรียกใช้ฟังก์ชันอื่น ๆ ที่ต้องการให้ทำงานก่อน main ได้ (ในที่นี้คือฟังก์ชันสำหรับเตรียมการระบบของ RT-Thread) จากนั้นจึงเรียก $Super$$main เพื่อไปที่ฟังก์ชัน $main() ดั้งเดิมต่อไป วิธีนี้ทำให้ผู้ใช้ไม่ต้องจัดการกับการเตรียมการระบบก่อนเข้า $main() ด้วยตนเอง
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้งานส่วนขยาย $Sub$$ และ $Super$$ สามารถดูได้จากคู่มือ ARM® Compiler v5.06 for μVision® armlink User Guide
Note
MDK ย่อมาจาก Microcontroller Development Kit
แปลเป็นไทยคือ "ชุดเครื่องมือสำหรับพัฒนาไมโครคอนโทรลเลอร์" ครับ
ถ้าจะอธิบายให้ละเอียดขึ้น MDK คือชุดซอฟต์แวร์แบบครบวงจร (IDE - Integrated Development Environment) ที่พัฒนาโดยบริษัท Keil (ซึ่งปัจจุบันเป็นส่วนหนึ่งของ ARM) สำหรับใช้สร้างโปรแกรมให้กับชิปไมโครคอนโทรลเลอร์ โดยเฉพาะตระกูลที่ใช้สถาปัตยกรรม ARM Cortex-M เช่น ชิปตระกูล STM32, NXP LPC, Nordic nRF เป็นต้น
ในชุด MDK จะประกอบไปด้วยเครื่องมือที่จำเป็นครบถ้วน ได้แก่:
- μVision IDE: โปรแกรมหลักสำหรับเขียนโค้ด, จัดการไฟล์โปรเจกต์ และคอมไพล์
- ARM C/C++ Compiler: ตัวแปลภาษา C/C++ ให้เป็นภาษาเครื่อง
- Debugger: เครื่องมือสำหรับค้นหาและแก้ไขข้อผิดพลาด (Bug) ในโปรแกรม
- Software Packs: ไลบรารีและไดรเวอร์สำเร็จรูปสำหรับไมโครคอนโทรลเลอร์เบอร์ต่างๆ
สรุปง่ายๆ MDK คือโปรแกรมที่นักพัฒนาใช้เขียนโค้ด, แปลโค้ด, และส่งโค้ดนั้นเข้าไปทำงานในชิปไมโครคอนโทรลเลอร์ ครับ