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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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õ.
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.
Đồ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".
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