← Quay lại Trang Chủ Blog
Hệ Thống Nhúng

Hệ Thống Nhúng: Từ Thanh Ghi Đến RTOS

11 tháng 7, 2026 · Lộ trình 16 bài học

Firmware thật, không có board cũng học được

Hầu hết tài liệu nhúng bắt đầu bằng danh sách linh kiện cần mua và hàng giờ vật lộn với driver USB trước khi nháy được cái LED đầu tiên. Series này đi khác: mọi khái niệm — từ đọc/ghi thanh ghi, ngắt, UART, ADC, DMA, đến scheduler và RTOS preemptive — được dạy bằng C bare-metal thật (đúng cú pháp, đúng thanh ghi kiểu Cortex-M) và minh hoạ sống động trên một bảng mạch ảo chạy ngay trong trình duyệt. Không cần mua board, không cần cài toolchain trước — nhưng mọi bài đều chỉ rõ lệnh/công cụ thật để khi cầm board thật lên tay, bạn không bỡ ngỡ.

Điểm khác biệt lớn nhất: mọi cạm bẫy kinh điển của firmware — quên volatile, race condition giữa ISR và main, tràn bộ đếm 49,7 ngày, priority inversion — đều được tái hiện để bạn tận mắt thấy nó hỏng, rồi tận tay sửa, thay vì chỉ đọc mô tả suông trong sách.

🔌

Về Series này

Xương sống của series là VMCU — một MCU ảo mức thanh ghi tự xây dần qua từng bài: GPIO (Bài 2) → SysTick (Bài 4) → Timer/PWM (Bài 6) → NVIC/EXTI (Bài 7) → UART (Bài 9) → ADC (Bài 10) → DMA (Bài 11) → mini-RTOS (Bài 14–15). Cột mốc trung tâm là Bảng Mạch Ảo: LED, nút nhấn, biến trở, buzzer thật sự sáng/kêu theo đúng giá trị bạn ghi vào thanh ghi — và một timeline vẽ chính xác lúc nào ISR chen ngang main loop.

Trước khi bắt đầu

📚 Điều kiện tiên quyết
Bắt buộc: Series C (con trỏ, kiểu số nguyên, toán tử bit — dùng liên tục từ Bài 2). Nên có: Series Điện Tử (điện áp, điện trở kéo, LED — giúp Bài 2–3, 6 dễ hình dung hơn hẳn), tuy không bắt buộc vì mọi mạch điện liên quan đều được nhắc lại ngắn gọn khi cần. Tài nguyên ngoài: STM32F1 Reference Manual, FreeRTOS — Mastering the FreeRTOS Kernel, Mars Pathfinder priority-inversion incident.

Bảng thuật ngữ nền tảng (Glossary)

Thuật ngữ Dịch nghĩa Định nghĩa ngắn gọn
MCU Vi điều khiển Máy tính chuyên dụng tích hợp CPU, Flash, RAM và ngoại vi trên cùng một chip.
MMIO Ánh xạ vào/ra vào bộ nhớ Kỹ thuật điều khiển ngoại vi bằng cách đọc/ghi vào các địa chỉ bộ nhớ cố định, thay vì lệnh CPU riêng cho vào/ra.
volatile Từ khoá "biến động" Từ khoá C ép compiler luôn đọc/ghi bộ nhớ thật, không tối ưu hoá bằng cách giữ giá trị cũ trong thanh ghi CPU.
GPIO Chân vào/ra đa dụng Chân MCU có thể cấu hình làm input hoặc output tuỳ phần mềm.
Debounce Chống dội phím Kỹ thuật lọc bỏ các cạnh nhiễu do tiếp điểm cơ học nảy khi nhấn/nhả nút.
FSM Máy trạng thái hữu hạn Mô hình gồm tập trạng thái hữu hạn và quy tắc chuyển trạng thái theo sự kiện — xương sống của firmware không dùng RTOS.
ISR Trình phục vụ ngắt Hàm được phần cứng tự động gọi khi một ngắt xảy ra, thay vì được gọi trực tiếp từ code.
NVIC Bộ điều khiển ngắt lồng nhau Phần cứng quản lý bật/tắt, độ ưu tiên và trạng thái chờ (pending) của mọi ngắt trên lõi ARM.
Critical section Vùng găng Đoạn code tắt ngắt tạm thời để đảm bảo một chuỗi thao tác không bị ISR chen vào giữa chừng.
Ring buffer Bộ đệm vòng Cấu trúc dữ liệu mảng vòng tròn cho phép một producer (thường là ISR) và một consumer chia sẻ dữ liệu an toàn mà không cần khoá.
UART Truyền nhận nối tiếp bất đồng bộ Giao thức truyền dữ liệu nối tiếp theo khung bit, không cần đường tín hiệu clock chung.
ADC Bộ chuyển đổi tương tự–số Mạch chuyển điện áp analog liên tục thành giá trị số rời rạc mà MCU đọc được.
DMA Truy cập bộ nhớ trực tiếp Bộ điều khiển chuyên chuyển dữ liệu giữa ngoại vi và RAM mà không cần CPU can thiệp từng byte.
Linker script Kịch bản liên kết Tệp mô tả cách chương trình được sắp xếp vào các vùng bộ nhớ thật của MCU (Flash, RAM).
RTOS Hệ điều hành thời gian thực Hệ điều hành nhỏ gọn đảm bảo các tác vụ được lập lịch theo độ ưu tiên với thời gian đáp ứng dự đoán được.
Context switch Chuyển ngữ cảnh Thao tác lưu trạng thái thanh ghi của tác vụ đang chạy và khôi phục trạng thái của tác vụ kế tiếp.
Mutex / Semaphore Khoá loại trừ / Cờ hiệu Công cụ đồng bộ giữa các tác vụ RTOS: mutex bảo vệ tài nguyên có chủ sở hữu, semaphore báo hiệu sự kiện hoặc đếm tài nguyên.
Priority inversion Đảo ngược ưu tiên Sự cố tác vụ ưu tiên thấp giữ tài nguyên khiến tác vụ ưu tiên cao phải chờ — nổi tiếng qua sự cố Mars Pathfinder 1997.

Danh sách 16 bài học trong lộ trình

Lộ trình chia 3 chặng: nền tảng bare-metal → ngoại vi → hệ thống & RTOS. Các bài sẽ được mở khoá dần khi xuất bản.

Chặng 1 — Nền tảng bare-metal
01

Hệ nhúng là gì & giải phẫu một MCU

MCU vs MPU vs SoC, Von Neumann vs Harvard, memory map Flash/SRAM/ngoại vi. Demo: tour Bảng Mạch Ảo + Memory Map Explorer.

02

Thanh ghi & Memory-Mapped I/O

Con trỏ volatile, đại số bit set/clear/toggle, read-modify-write không nguyên tử. Demo: gõ hex vào Register Inspector bật LED thật.

03

GPIO input: pull-up/down & đọc nút nhấn

Chân floating, điện trở kéo nội, quy ước active-low, polling và phát hiện cạnh. Demo: tắt pull-up xem giá trị nhảy loạn thật.

04

SysTick & thời gian: thoát khỏi delay blocking

Cái giá của busy-wait, tick counter, pattern millis() không chặn, bug tràn 49,7 ngày. Demo: 2 LED nhấp nháy song song không chặn.

05

Chống dội phím & Máy trạng thái (FSM)

Vật lý bounce, debounce lấy mẫu định kỳ, thiết kế FSM enum + switch. Demo: đếm nhấn nút có/không debounce chạy song song.

Chặng 2 — Ngoại vi
06

Timer đa năng & PWM

Prescaler/auto-reload, công thức tần số, duty cycle, ứng dụng servo RC. Demo: kéo thanh trượt nghe buzzer đổi cao độ thật.

07

Ngắt (Interrupt) & NVIC

Vector table, NVIC priority/pending/preemption, quy tắc "ISR càng ngắn càng tốt". Demo: timeline ngắt chen ngang main loop.

08

Chia sẻ dữ liệu ISR ↔ main: race & critical section

Race condition thật, critical section có kỷ luật, ring buffer SPSC không cần khoá. Demo: đếm 10.000 vòng lộ sai số race.

09

UART & giao tiếp nối tiếp

Khung 8N1, ngân sách sai số baud rate, TX/RX bằng ngắt + ring buffer. Demo: terminal UART điều khiển LED trên bảng ảo.

10

ADC & thế giới tương tự

Nguyên lý SAR, độ phân giải/LSB, oversampling và trung bình trượt. Demo: xoay biến trở xem lượng tử hoá và làm mượt.

11

DMA: chuyển dữ liệu không cần CPU

Ping-pong buffer, chi phí polling vs ngắt vs DMA. Demo: đồng hồ CPU-load ảo so sánh 3 cách đọc ADC.

Chặng 3 — Hệ thống & RTOS
12

Boot & bản đồ bộ nhớ chương trình

Trước main() là gì, .text/.data/.bss, vì sao firmware né malloc. Demo: Memory Layout Visualizer + mô phỏng stack overflow.

13

Super-loop vs Cooperative Scheduler

Trần của super-loop, viết scheduler hợp tác 30 dòng, đo jitter. Demo: task "tham" làm LED khựng thấy rõ.

14

RTOS preemptive: context switch & task states

Stack riêng từng task, Ready/Running/Blocked, priority preemptive. Demo: kéo priority thấy preemption đổi hình trên timeline.

15

Đồng bộ RTOS: mutex, semaphore, queue & priority inversion

Deadlock, priority inheritance, sự cố Mars Pathfinder 1997. Demo: tái hiện Pathfinder trên VMCU và "cứu tàu".

16

Capstone: Trạm đo nhiệt độ hoàn chỉnh

Ghép ADC+DMA, FSM giao diện, UART báo cáo, mini-RTOS — chạy trọn vẹn trên Bảng Mạch Ảo.

Bình luận