Saturday, November 8, 2025

FLASH - CLOCK - ART

Trong quá trình giảng dạy về Embedded firmware, tôi gặp bài toán tăng perfomance bằng cách tăng tốc độ xử lý của CPU. Tôi gặp vấn đề về CPU chạy nhanh hơn flash

  • Code đưc lưu ở flash

A white rectangular table with black text

AI-generated content may be incorrect.

--> Trong datasheet của STM32F411, ta thấy rằng tốc độ flash phụ thục vào điện áp hoạt động. Tôi sử dụng 3.0 Vol --> Tốc độ flash tối đa là 30MHz

  • Code sẽ đưc thực thi trên CPU --> Trong khi đó tốc độ CPU đưc config tối đa lên đến 100Mhz

--> Vấn đề ở đây là CPU đọc code ở flash lên chậm quá so với việc thực hiện code --> hiện tưng: làm treo chương trình

--> Giải quyết vấn đề: chúng ta cần config cho CPU để chờ thêm 3WS (wait states) để KỊP đọc code từ FLASH lên

--> Tiếp tục phát sinh vấn đề nữa: Set tốc độ nhanh làm gì mà phải chờ 3WS làm giảm performance

--> Giải pháp: Trong STM32F411 cung cấp ART Accelerator (Adaptive Real-Time)

ART Accelerator: Nó là phần cứng nằm giữa FLASH và CPU. Nhiệm vụ của nó để tăng performance để giảm wait states (WS)

Text Box: Nếu sử dụng ART ta thấy: 
•	Lần đâu đọc CODE từ FLASH lên CPU để thực E (execute - thực hiện) thì nó cần 4 cpu cycles bao gồm 1F (fetch) + 3WS
•	Trong lúc thực hiện CODE, thì bộ ART nó sẽ đọc CODE từ FLASH lên CPU. Nên mình thấy nó thực hiện CODE liên tục. Nên dường như không cần thêm WS nữa

Text Box: Nếu không sử dụng ART ta thấy: 
•	Một lần CPU đọc data từ FLASH lên thì nó cần 4 cpu cycles (4 xung clock) bao gồm 1F (fetch) + 3WS (wait states) - Do flash của STM32 là 128-bits (với 1 câu lệnh - instruction) là 32 bit (STM32F411 sử dụng kiến trúc 32bits) do đó một lần đọc code từ FLASH nó đọc 4 instruction
•	Ở lần tiếp theo nó cũng cần 4 cpu cycles bao gồm 1F + 3WS
A diagram of a staircase

AI-generated content may be incorrect.

Nếu chúng ta sử dụng ART

A diagram of a diagram

AI-generated content may be incorrect.

 

 

 

-------------------------------------

Ngoài ra, nếu MCU không support ART thì những đoạn code nào cần thực thi nhanh. thì chúng ta đưa hàm đó lên RAM. Vì tốc độ đọc dữ liệu từ RAM sẽ nhanh hơn FLASH rất nhiều

__attribute__((section(".ham_tren_ram"))) void update()

{

        __asm("CPSID i");

    flash_erase(0);

    for(int i = 0; i < RX_BUFFER_SIZE; i++)

    {

            flash_program((char*)0x08000000 + i, rx_buffer[i]);

    }

    uint32_t* AIRCR = (uint32_t*)0xE000ED0C;

    *AIRCR = (0x5FA << 16) | (1 << 2);

}

 

No comments:

Post a Comment