🌱 Bootloader 5. Cấu trúc file Hex

🌱 Bootloader 5. Cấu trúc file Hex

    Như đã nói ở post trước thì Bootloader chủ yếu quan tâm đến nạp file nhị phân xuống bộ nhớ của Vi điều khiển. Cụ thể là 2 vấn đề: 

  • Sắp xếp chúng trong Bộ nhớ như thế nào?
    👉 Xem bài
    Endianness - Little or Big?
  • File nhị phân - Cấu trúc, nội dung, ... sẽ được giới thiệu trong post này.

    👉 Cụ thể, như các bạn đã biết, chúng ta có một số định dạng nhị phân, chúng sinh ra sau qua trình biên dịch, linking (Cụ thể có trong bài Build Process)

  • Định dạng .BIN - Đây là kiểu định dạng cơ bản nhất của file nhị phân, nó không có bất cứ chỉnh sửa nào, hay quá trình relocation, các câu lệnh sẽ được tải xuống trực tiếp đến từng địa chỉ.
  • Định dạng .ELF - Extensible Linking Format - Định dạng này có thêm một số symbol cũng như quá trình relocation bộ nhớ. Tức là chúng ta có thể nạp bộ nhớ vào địa chỉ mà mình muốn, các symbol cũng thể di chuyển theo mà không phải cố định. Định dạng này thường được sử dụng để nạp chương trình cũng như sử dụng cho quá trình debug

    ELF File

  • Định dạng .HEX - Định dạng này có lẽ là quen thuộc nhất đối với chúng ta rồi, thường được gen ra bởi phần mềm Keil C, các dòng 8 bit cũng gen ra file hex, dưới đây chúng ta sẽ cùng tìm hiểu kỹ hơn về cấu trúc của nó. 

    👉 Tại sao cần nắm được cấu trúc HEX file

    Nên nhớ chúng ta đang làm việc với Bootloader, nên việc nạp code sẽ không thông qua mấy phần mềm hay IDE nữa, chúng ta hãy nghĩ đến việc phải nạp code qua mạng không dây, hay qua các giao thức UART, SPI, I2C. 
    
    Nếu nạp code thông thường thì các phần mềm đã làm cho chúng ta phần việc khó nhất rồi, đó là phân tích cấu trúc HEX file, tải data xuống FLASH qua ST-link, ... 
    Ở đây chúng ta cần tự tay làm những điều trên, phân tích HEX file, truyền dữ liệu qua 1 mạng không dây/hoặc có dây, sau đó ghi vào FLASH với địa chỉ mong muốn. 

    Việc hiểu cấu trúc HEX File là điều tối thiểu cần biết !!!

    👉 Cấu trúc HEX file

    Hãy thử mở một file hex, chúng ta sẽ thấy chúng bao gồm khá nhiều dòng, và mỗi dòng đều mà định dạng mã ASCII. Mỗi dòng sẽ bao gồm các thành phần sau đây:

Hex file
  • Start Code: Ở mỗi dòng sẽ luôn bắt đầu bằng dấu hai chấm ':'
  • Byte Count: Ở đây bao gồm 2 chữ số (1 byte) để chỉ thị số byte data có trên dòng tương ứng. 
  • Address: 4 chữ số, đây là địa chỉ offset, địa chỉ này cộng thêm địa chỉ base (chúng ta có thể chọn - ví dụ 0x0800.0000 chẳng hạn) sẽ ra địa chỉ mà data được nạp xuống bộ nhớ FLASH. 
  • Record Type: 2 chữ số, từ 00 đến 05, nói lên ý nghĩa của data. 

    Record tpye

  • Data: Phần này là dữ liệu sẽ lưu lên FLASH, số byte sẽ được quy định ở trường Byte Count.
  • Checksum: gồm 2 chữ số, dùng để kiểm tra lỗi. Theo quy định thì một line sẽ đúng khi mà byte checksum sẽ bằng đảo của tổng tất cả các byte còn lại cùng dòng, cộng thêm 1
    Ví dụ với dòng file hex sau:
     


    Ta có: 03 + 00 + 30 + 00 + 02 + 33 + 7A = E2 ⇒ Đảo của E2 là 1D, cộng thêm 1 sẽ thành 1E. Vì vậy line này là đúng. 
    ⇒ Một cách đơn giản hơn là chúng ta hãy cộng tất cả byte trên 1 line lại, nếu kết quả là 00 thì line đó là chuẩn 😆😆😆

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn