รูปในโพสแรกคือ Register ของ CPU ครับ ปกติเราจะไม่ค่อยได้มายุ่งในส่วนนี้
ถ้าเราไม่ได้เขียน assembly หรือเขียน OS
รายละเอียดก็ตามที่คุณ tha ลงมาในโพสที่ 2 เลยครับ แต่จะเห็นว่ามันมีส่วนแปลกๆ อยู่
เช่น Stack pointer มันมี 2 ตัว ตรงนี้ arm ทำมาเพื่อรองรับการทำงานของ OS ครับ
โดยปกติ CPU จะใช้ MSP เป็น Stack pointer ตัวหลักในการทำงานทั้งหมด แต่เราสามารถ
แยกให้การทำงานปกติใช้ PSP และเวลาอยู่ใน Interrupt จะใช้ MSP ได้ครับ เป็นการแยก
ให้การทำงาน 2 ส่วนใช้ stack memory คนละส่วน โดยเฉพาะพวก RTOS ที่แต่ละ Task
เราจะแบ่ง Stack Memory ไว้ให้แต่ละ Task ไม่เยอะ แล้วระหว่างนั้นถ้ามี Interrupt เกิดขึ้น
มันจะได้ไม่ไปแย่ง Stack Memory ของ Task มาใช้ใน Interrupt
Link Register ถ้าอธิบายง่ายๆ ก็คือเวลา code มีการ Call Function มันก็จะเอา Address
ที่ต้อง Return กลับไปฝากไว้ใน Link Register ถ้ามีการ Call Function ใน Function อีกที
มันก็จะเก็บค่า Address ที่อยู่ใน Link Register ลง Stack Memory ก่อนแล้วค่อยฝาก Address ใหม่ทับลงไป
PSR หรือ Program Status Registers ตัวนี้ประหลาดดี ตรงมี Register จริงๆ ตัวเดียว แต่เวลาเรียกใช้จะแยกเป็น 3 ตัวตือ
- APSR - Application Program Status Registers ตัวนี้เหมือนเป็น Flags เวลาเราบวกลบคูณหารเลข
มันจะมี Bit คอยบอกว่าผลลัพทํมีค่าติดลบนะ ผลลัพท์มีค่าเป้น 0 ผลลัพท์มีการทดเลข ผลลัพท์ Overflow อะไรพวกนี้
- IPSR - Interrupt Program Status Registers ตัวนี้จะบอกว่า Interrupt ที่รันอยู่นี่คือ Interrupt อะไร
มันจะมีค่าเป็นเลข Number ของ Interrupt อยู่
- EPSR - Execution Program Status Registers อันนี้ไม่เคยใช้ครับ ไม่รู้เหมือนกัน

PRIMASK คือ Interrupt mask register มีให้เซ็ตแค่บิตเดียว ถ้าเซ็ตคือ Block Interrupt ทั้งหมดยกเว้น
NMI กับพวก fault Handler ทั้งหลาย
FAULTMASK เหมือน PRIMASK แต่เอาไว้ Block พวก NMI กับพวก fault Handler ทั้งหลาย
BASEPRI มันนี้พิเศษหน่อย คือให้เรา Block Interrupt โดยการระบุ Priority เช่น Interrupt จะมี
Priority ได้ตั้งแต่ 15 - 0 (0 คือสูงที่สุด) ถ้าเซ็ต BASEPRI = 5 Interrupt ที่มี Priority ตั้งแต่ 15 ถึง 5 จะถูก Block
แต่ถ้า BASEPRI = 0 จะหมายถึงการเลิกใช้งาน BASEPRI เพราะฉะนั้น BASEPRI จะใช้ Block Interrupt ที่มี Priority 0 ไม่ได้
สุดท้ายคือ CONTROL Register อันนี้เอาไว้คุม Stack pointer ว่าจะให้ใช้ MSP หรือ PSP นั่นแหละครับ
แล้วก็ยังกำหนดให้ Thread ทำงานแบบ Privileged หรือ Unprivileged ได้ด้วย (แทรกนิดนึง ปกติเวลา
CPU ทำงานใน function main เราจะเรียกว่ามันทำงานใน Thread mode ส่วนเวลาที่ทำงานอยู่ใน Interrupt
เราจะเรียกว่า Handler mode ครับ) ปกติ CPU จะรัน Thread แบบ Privileged คือเข้าถึง Register หรือ
Config ค่า Register ได้ทุกอย่าง แต่ถ้าเราปรับเป็นแบบ Unprivileged จะทำให้ Thread เข้าถึง Register
บางตัวไม่ได้ มีปะรโยชน์คือเป็นการจำกัดสิทธิ์ของโปรแกรมที่ทำงานใน MCU ครับ ถ้าเราซีเรียสเรื่องความปลอดภัยมากๆ
ปล. เอาแค่นี้ก่อน ช่วงนี้ผมไม่ค่อยว่างเท่าไหร่ครับ ถ้าสนใจเรื่องสถาปัตยกรรมของ ARM Cortex M ผมแนะนำหนังสือ
The Definitive Guide to ARM® Cortex®-M3 and Cortex®-M4 Processors ของ โจเซฟ ยู ครับ เขียนได้ละเอียดดีครับ