🌱 Bootloader 4. Endianness - Little or Big?
Một thuật ngữ tương đối mới lạ @@ Câu hỏi đặt ra: nó là gì? Tại sao lại giới thiệu nó ở đây, nó liên quan gì đến bootloader chứ?
👉 Câu trả lời: thật ra mình thấy hay thì share thôi 😁 Mong là nó giúp ích cho các bạn, đặc biệt là các bạn đang hứng thú với phần Bootloader này. Ngoài ra, việc hiểu kiến trúc bộ nhớ cũng như cách truy xuất sẽ giúp ích cho quá trình học về Vi điều khiển.
Bootloader liên quan nhiều đến việc nạp Firmware vào Vi điều khiển, cụ thể hơn là chúng ta nạp file nhị phân xuống bộ nhớ của Vi điều khiển. Vậy, có 2 điều quan trọng để lưu tâm:
- File nhị phân - Cấu trúc, nội dung, ... (Sẽ được giới thiệu ở bài sau)
- Sắp xếp chúng trong Bộ nhớ như thế nào? - Cụ thể là sắp xếp như thế nào để Vi điều khiển đọc ra theo đúng thứ tự, vì việc tìm nạp lệnh của chúng là tự động.
💬 Big Endian vs Little Endian
Sự khác biệt của Little Endian và Big Endian khi lưu trữ chính là ở việc sắp xếp thứ tự các byte dữ liệu.
Trong cơ chế lưu trữ Little Endian (xuất phát từ "little-end" nghĩa kết thúc nhỏ hơn), byte cuối cùng trong biểu diễn nhị phân trên sẽ được ghi trước, tương ứng với byte LSB (trong số thấp nhất) sẽ được ghi trước, ở địa chỉ nhỏ nhất trên bộ nhớ.
Ngược lại với Little Endian, với Big Endian thì byte MSB sẽ được ghi trước, ở địa chỉ lớn nhất trên bộ nhớ.
Little Endian vs Big Endian |
💚 Big Endian
Có thể thấy, Big Endian sắp xếp byte MSB trong bộ nhớ trước, vì vậy nó hợp tự nhiên hơn, giống như chúng ta đọc viết chữ từ trái sang phải, thì Big Endian cũng sắp xếp các byte lần lượt từ trái sang phải. Big Endian có lẽ hợp với cách nhìn tự nhiên của con người chúng ta hơn (chắc trừ mấy ông Nhật Bản viết truyện từ phải qua trái).
Big Endian thường được sử dụng trong một số dòng chip: Motorola 68K processors, PowerPC (by Motorola) and SPARK (by Sun) processors.
- Với việc đọc byte có trọng số cao (MSB) trước (vì MSB có địa chỉ thấp nhất), chúng ta có thể dễ dàng ước lượng kích thước của một số, cùng với đó là xác định số đó là số dương hay âm.
- Dạng nhị phân và dạng thập phân được sắp xếp giống nhau, vì vậy việc chuyển đổi giữa 2 dạng số này sẽ dễ dàng hơn.
- Với 2 điểm trên, Big-Endian vẫn được sử dụng trong các bài toán về giao thức mạng.
💚 Little Endian
Có vẻ như Little Endian hơi "trái tự nhiên" so với Big Endian.
Nhưng đó là với con người chúng ta, còn với máy tính thì sao? Hãy đến với ví dụ sau:
👉 Chúng ta có một con số 20, biểu diễn dưới dạng hexa là 20 = 0x14. Vậy, nếu con số này được đặt trong các hệ điều hành khác nhau, hoặc gán vào các biến với kích thước khác nhau, chúng ta sẽ có:
- 64 bit ⇒ 20 = 0x14 = 14 00 00 00 00 00 00 00
- 32 bit ⇒ 20 = 0x14 = 14 00 00 00
- 8 bit ⇒ 20 = 0x14 = 14 00
👉 Chính vì lí do đó, Little Endian thường sử dụng trong các dòng chip của Intel, và nhiều Vi điều khiển (trong đó có STM32) và hiện nay trong các dòng chip thì nó được sử dụng nhiều hơn so với Big-Endian.
Các bạn có thể test thử, xem máy tính và vi điều khiển của mình sử dụng Endianness nào, bằng một đoạn code nhỏ sau:
Việc chuyển đổi giữa 2 kiểu sắp xếp này cũng khá đơn giản, bạn có thể tham khảo trên Internet với từ khóa "Convert Little Endian to Big Endian"...