Title Image

Blog Logo

Core 5. Reset Sequence

🌱 Core 5. Reset Sequence

    Topic này mình đã từng nói đến một lần trong bài Start Procedure & Startup file (trong series về Bare-Metal Embedded), trong bài viết này mình sẽ đi chi tiết hơn vào quá trình Reset của Vi điều khiển, đặc biệt là Vi điều khiển STM32. Để được hiểu bài này, trước hết các bạn cần có kiến thức về một số Core Registers mà mình đã đề cập đến trong bài Core 3. Core Registers.

    👉 Chúng ta đều biết, địa chỉ bắt đầu của bộ nhớ (đối với Vi điều khiển STM32 là bộ nhớ FLASH) là 0x0000.0000. Phần đầu tiên của bộ nhớ chứa đó là "Vector Table" - Chứa các vector ngắt, điển hình nhất chính là Vector Reset. Sau khi Reset, Vi điều khiển trải qua các bước sau đây (hình tham khảo Udemy Fastbit)

Startup
Reset Sequence

  1. CPU sẽ tìm kiếm bảng Vector Table của chương trình trên bộ nhớ (Đọc thanh ghi SCB_VTOR). Ở trạng thái reset, SCB_VTOR = 0, CPU sẽ tìm đến địa chỉ 0x0000.0000.
  2. Bộ xử lý tìm nạp giá trị tại ô nhớ đầu tiên của Vector Table (0x0000.0000), vào thanh ghi MSP - Main Stack Pointer (MSP ở trạng thái reset). Ví dụ trong hình MSP = 0x2000.8000.
  3. Tiếp theo, bộ xử lý sẽ lấy địa chỉ của Reset Handler được đặt trong ô nhớ thứ 2 của Vector Table, tại địa chỉ 0x0000.0004 và load vào PC để thực hiện hàm Reset Handler. Ví dụ trong hình PC = 0x2000.1000 (giá trị ô nhớ 0x0000.0004).
    Vector Reset cũng là một Exception của hệ thống, nó sẽ làm những công việc setup hệ thống ban đầu trước khi call đến hàm main.
  4. Sau khi nhảy đến Reset Handler, bộ xử lý bắt đầu thực hiện các lệnh trong Reset Handler. Reset Handler thường được viết bằng ngôn ngữ Assembly (có thể là C), và đảm nhận công việc khởi tạo ban đầu của hệ thống. 
    Như mình viết trong bài Start Procedure & Startup file, công việc trong Reset Handler thường là khởi tạo các vùng nhớ data, bss (copy từ Flash lên Ram), và khởi tạo thư việc C standard.
    Một số công việc khác có thể thực hiện trong Reset Handler có thể là khởi tạo lại vùng nhớ Stack, hay cấu hình xung clock cho hệ thống, ... (Cái này tùy thuộc vào người lập trình).
  5. Bước cuối cùng sau của Reset Handler là gọi đến hàm main() cũng chính là hàm main() trong file main.c của chúng ta. Và sau đó thực hiện các tác vụ trong hàm main().
    👉 Các công việc thực hiện sau khi reset, trước khi thực hiện hàm main() thường không được để ý đối với những bạn thích lập trình ứng dụng. Tuy nhiên, trong lập trình nhúng, việc hiểu được quá trình reset, các quá trình liên quan đến hệ thống (mà IDE hay Processor tự thực hiện) là rất quan trọng trong việc hiểu hệ thống và debug.

    👉 Dưới đây là video mô tả về Reset Sequence trong các Vi điều khiển lõi ARM Cortex-M và mô phỏng trên vi điều khiển KL46 (Lõi ARM CortexM0+)

>>>= Follow ngay =<<<

Để theo dõi 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 😊

                                        

Đăng nhận xét

0 Nhận xét