Từ bit trên đường truyền thành byte trong bộ đệm
Khi bạn kẹp máy phân tích logic vào một đường UART, SPI, I²C hay CAN, bản ghi thu được tính bằng bit. Còn phần sụn của bạn thì làm việc theo byte: bộ đệm nhận 64 ô, bản đồ thanh ghi 12 thanh ghi, trường dữ liệu giới hạn 8 byte. Mỗi lần đi qua lại giữa hai cách nhìn đó là một lần chia cho tám, và nhẩm phép chia ấy lúc 3 giờ sáng khi một khung cứ sai tổng kiểm tra chính là cách những lỗi lệch một đơn vị lọt ra bản phát hành.
byte = bit ÷ 8 (tương đương bit × 0,125). Một khung CAN 2.0A dài 108 bit là 108 ÷ 8 = 13,5 byte thời gian chiếm đường truyền — trong đó chỉ 8 byte là dữ liệu của bạn.Phép chia thì tầm thường. Thứ làm người ta vấp là loại bit vừa được đếm. Một byte dữ liệu ứng dụng gần như không bao giờ chiếm đúng tám khoảng bit trên đường vật lý, bởi phần đóng khung, phần đồng bộ và phần phát hiện lỗi đều mượn chỗ trên cùng sợi dây.
Bit đường truyền và bit dữ liệu
Độ rộng thanh ghi
Ngân sách thời gian
Quy đổi một bản ghi tín hiệu theo từng bước
Đếm đúng loại bit bạn định nói tới
Trước hết hãy quyết định bạn đang đếm bit dữ liệu hay mọi bit mà máy phân tích nhìn thấy. Với một byte UART 8N1, hai con số đó là 8 và 10 — hai câu trả lời khác nhau cho cùng một câu hỏi.
Gõ số bit vào ô nhập
Nhập con số vào ô bit. Giá trị byte đổi theo từng phím gõ, nên bạn rà hết bảng bóc tách một khung mà không phải bấm thêm gì. Bản xuất từ bộ giải mã thường kèm dấu cách hoặc dùng dấu phẩy làm dấu thập phân — cả hai đều được chấp nhận và dấu cách thì bị bỏ qua.
Sao chép số thẳng vào mã nguồn
Nút Sao chép ở mỗi ô trả về con số trần, không kèm đơn vị và không có khoảng trắng — đúng thứ bạn cần khi giá trị sắp đi vào một #define, một kích thước bộ đệm hay một câu lệnh kiểm thử.
Đảo chiều khi quay lại máy đo
Bấm nút Đảo đơn vị để đi ngược từ byte về bit — tiện lúc bạn biết dữ liệu của mình dài 32 byte và cần biết nó chiếm bao nhiêu khoảng bit. Hai danh sách đơn vị đều có ô tìm đơn vị, nên nhảy sang kilobit hay byte mỗi giây cũng ngay tại trang này.
Hao phí đóng khung UART: từ tốc độ baud tới byte thực nhận mỗi giây
Cấu hình 8N1 kinh điển bọc mỗi byte dữ liệu bằng một bit khởi đầu và một bit dừng, nên mười khoảng bit mới chở nổi tám bit dữ liệu — một khoản thuế cố định 25 %. Đó là lý do ước lượng ngây thơ "lấy tốc độ baud chia tám" luôn cao hơn những gì đường truyền thật sự giao được.
| Tốc độ baud (bit/s) | Chia 8 kiểu ngây thơ | Dữ liệu thật (8N1, 10 bit/byte) | Thời gian cho một byte |
|---|---|---|---|
| 9.600 | 1.200 B/s | 960 B/s | 1.042 µs |
| 19.200 | 2.400 B/s | 1.920 B/s | 521 µs |
| 38.400 | 4.800 B/s | 3.840 B/s | 260 µs |
| 57.600 | 7.200 B/s | 5.760 B/s | 174 µs |
| 115.200 | 14.400 B/s | 11.520 B/s | 86,8 µs |
| 921.600 | 115.200 B/s | 92.160 B/s | 10,9 µs |
Thêm một bit chẵn lẻ thì khung dài thành mười một khoảng bit, kéo mức 9.600 baud xuống còn khoảng 873 byte dữ liệu mỗi giây. Hai bit dừng ăn thêm một chỗ nữa. Không điều nào trong đó động tới phép chia cho 8 — chúng chỉ đổi số bit mà bạn nên đưa vào phép chia.
Hai ô cùng sống khi bạn so các khung
Gõ vào ô nào thì ô kia theo ngay, nên bạn giữ được một bên là số byte dữ liệu, một bên là thời gian chiếm dây mà chẳng phải nhập lại.
Kết quả dễ đọc với cụm truyền dài
Hàng nghìn được tách bằng dấu cách, còn bản ghi cực lớn thì chuyển sang dạng lũy thừa, nhờ vậy một vệt tín hiệu vài triệu bit vẫn đọc được thay vì thành bức tường chữ số.
Mọi đơn vị của bus trong một danh sách
Danh sách đơn vị có ô tìm kiếm và phủ cả bit, kilobit, byte lẫn các đơn vị tốc độ mỗi giây, nên một con số của CAN, SPI hay UART đều diễn đạt lại được mà không phải đi tìm trang khác.
Không có gì rời khỏi bàn thí nghiệm
Mọi phép tính chạy ngay trong trình duyệt sau khi trang tải xong, nên các con số lấy từ bản ghi của khách hàng không được gửi đi đâu cả.
Câu hỏi về giao thức nối tiếp
Vì sao đường truyền 9.600 baud chỉ chở 960 byte mỗi giây thay vì 1.200?
Vì baud đếm ký hiệu trên dây chứ không đếm bit dữ liệu. Trên một đường UART nhị phân chuẩn, mỗi ký hiệu là một bit, nên 9.600 baud là 9.600 khoảng bit mỗi giây — nhưng khung 8N1 tiêu tốn mười khoảng bit cho mỗi byte dữ liệu. Chia cho 8 ra con số lý thuyết 1.200 B/s, mức chỉ đạt được nếu đường truyền chẳng chở gì ngoài dữ liệu; chia cho 10 mới ra 960 B/s mà ứng dụng của bạn nhận thật.
Bit khởi đầu, bit dừng và bit chẵn lẻ đóng góp gì vào phép đếm?
Bit khởi đầu là một sườn xuống báo cho bên nhận bắt đầu lấy mẫu; bit dừng giữ đường ở mức nghỉ đủ lâu để sườn khởi đầu kế tiếp không bị hiểu nhầm. Cả hai đều không mang thông tin. Bit chẵn lẻ, khi được bật, thêm một bit thứ chín nằm cạnh dữ liệu, thuần túy để phát hiện lỗi một bit. Vậy khung 8E1 dài 11 khoảng bit — tức 1,375 byte thời gian đường truyền cho một byte dữ liệu.
Truyền MSB trước hay LSB trước có làm đổi số byte thu được không?
Không — số đếm y hệt nhau, chỉ giá trị ghép lại là khác. UART dịch ra LSB trước, còn SPI và I²C theo thông lệ dịch MSB trước. Lẫn lộn hai bên sinh ra các byte đảo bit nhưng vẫn chiếm đúng chừng ấy khoảng bit, và đó chính là lý do triệu chứng nhìn giống dữ liệu hỏng chứ không giống lệch độ dài.
Bit chèn của CAN làm thay đổi bức tranh bit sang byte thế nào?
CAN chèn thêm một bit ngược mức sau năm bit giống nhau liên tiếp để các bên nhận giữ đồng bộ đồng hồ. Một khung định danh 11 bit chuẩn với đủ 8 byte dữ liệu dài 108 bit trước khi chèn, và trường hợp xấu nhất có thể lên tới khoảng 135 bit. Số bit dôi ra đó thuần túy là thời gian chiếm dây: dữ liệu của bạn vẫn là 8 byte, bất kể bộ thu phát đã chèn thêm bao nhiêu bit.
Bộ giải mã xuất độ dài cụm truyền theo bit — tôi so nó với bộ đệm nhận kiểu gì?
Hãy chia con số xuất ra cho độ dài khung, chứ không phải cho tám, rồi mới đem số byte đó so với độ sâu bộ đệm. Một cụm 12.000 bit ở chế độ 8N1 là 1.200 khung, tức cần 1.200 byte chỗ chứa; còn phép tính thô 12.000 ÷ 8 = 1.500 lại mô tả mức chiếm dụng đường truyền. Đưa nhầm con số vào bài toán chọn cỡ FIFO là nguyên nhân quen thuộc của những cờ tràn bộ đệm không rõ từ đâu ra.
Chưa có bình luận nào. Hãy là người đầu tiên!