Cuộc chiến Thao tác Bit trong Vi điều khiển
❗️
Trong các hệ thống nhúng, việc thay đổi một bit duy nhất trong một thanh ghi là thao tác cơ bản nhưng đầy rủi ro. Một xung đột nhỏ có thể dẫn đến lỗi dữ liệu nghiêm trọng. Hai phương pháp chính để giải quyết bài toán này là Read-Modify-Write (RMW) và Bit-band.
RMW là phương pháp mặc định, thực hiện thay đổi bit thông qua một chuỗi ba hành động tuần tự.
Đọc toàn bộ giá trị 32-bit của thanh ghi.
Dùng phép toán logic để thay đổi bit mong muốn.
Ghi lại toàn bộ giá trị 32-bit đã sửa đổi.
Khi hai tác vụ cùng thực hiện RMW trên một thanh ghi, dữ liệu có thể bị ghi đè sai. Đây là "cơn ác mộng" của các hệ thống đa luồng hoặc có ngắt.
Tác vụ A
(Set bit 2)
Ngắt B
(Set bit 5)
Kết quả cuối cùng: 0b10000
Thao tác của Tác vụ A đã bị mất! ❌
Bit-band là một tính năng phần cứng trên ARM Cortex-M, cho phép thay đổi một bit chỉ bằng một lệnh ghi duy nhất, đảm bảo an toàn tuyệt đối, không thể bị xen ngang.
🛡️
1 Lệnh Ghi = 1 Bit Thay Đổi
An toàn. Nhanh chóng. Không xung đột.
Mỗi bit trong vùng nhớ (RAM/Ngoại vi) được "ánh xạ" tới một địa chỉ 32-bit riêng trong vùng Alias. Ghi vào địa chỉ Alias sẽ thay đổi bit gốc một cách nguyên tử.
0x40020014
Chứa nhiều bit
0x42400294
Đại diện cho 1 bit
Bit-band vượt trội về hiệu suất và an toàn, đồng thời giúp mã nguồn đơn giản hơn.
RMW là phương pháp phổ thông, trong khi Bit-band là một tính năng đặc biệt chỉ có trên một số dòng MCU.
| Tiêu chí | Read-Modify-Write | Bit-band | 
|---|---|---|
| Tính Nguyên tử | KHÔNG (3 bước) | CÓ (1 bước phần cứng) | 
| An toàn Đồng thời | Dễ xảy ra Race Condition ❌ | An toàn tuyệt đối ✅ | 
| Cần Đồng bộ hóa | Có (Tắt ngắt, Mutex) | Không cần | 
| Hiệu suất | Chậm hơn | Nhanh hơn | 
| Hỗ trợ Phần cứng | Hầu hết mọi MCU | Chỉ ARM Cortex-M3/M4/M7... | 
| Lời khuyên | Sử dụng khi không có lựa chọn khác, và phải bảo vệ cẩn thận. | Lựa chọn ưu tiên hàng đầu nếu phần cứng hỗ trợ. |