Title Image

Blog Logo

🌱 AUTOSAR MemMap File

🌱 AUTOSAR MemMap File

autosar

    MemMap là một header file được sử dụng trong AUTOSAR (MemMap.h), được sử dụng để map các function, variable vào các vùng nhớ được chỉ định trên Flash hoặc RAM, mục đích nhằm tránh lãng phí bộ nhớ và sắp xếp các function, variable vào vùng nhớ mong muốn.

    👉 Lãng phí bộ nhớ và Cách giải quyết

    ➥ Vấn đề Lãng phí bộ nhớ

Khi viết một chương trình C/MCU thông thường, nếu chúng ta không sử dụng bất kỳ cách setup nào để set biến vào một vùng nhớ, Compiler sẽ sử dụng logic mặc định để đặt các biến và hàm vào các vùng nhớ mặc định (Quy định trong file Linker Script) - Thường là các biến có thể được đặt trong RAM, còn code sẽ nằm trên vùng text code Flash hoặc RAM.

    Theo trình logic mặc định như vậy có thể tạo ra những khoảng trống không cần thiết trong bộ nhớ khi các biến có kích thước khác nhau được đặt gần đó, dẫn tới việc lãng phí bộ nhớ.

    ➥ Vấn đề nhu cầu của người dùng

    Ngoài vấn đề kể trên, chúng ta cần quan tâm đến việc developer muốn đặt các biến/hàm cùng đặc tính vào cùng vị trí để có thể dễ dàng quản lý hơn.

    Thông thường đối với các dòng MCU có bộ nhớ Cache, developer có thể đưa code lên RAM, setup vùng nhớ text code với attribute là Cacheable, để tăng tốc độ thực thi lệnh của chương trình. 

    Tuy nhiên, có một thành phần của vùng text code là Vector Table, bảng Vector này sẽ cần được setup là Non-Cachable để đảm bảo hoạt động Interrupt là chính xác.

    Theo logic thông thường của compiler thì việc này cũng không thể nào thực hiện!

    ➥ Cách giải quyết

    Đối với vấn đề kể trên, việc chúng ta cần làm là tận dụng các vùng nhớ trống, và đặt các biến/hàm vào vùng nhớ mong muốn. Các developer có kinh nghiệm về nhúng thường sử dụng một macro là #pragma để làm điều đó.

    Một ví dụ về #pragma đặt biến vào một địa chỉ cụ thể 0x2000.0000

#pragma location = 0x20000000;
int Variable;

    Phương pháp đặt các biến/hàm vào địa chỉ mong muốn này là phương pháp phổ biến nhất, nhưng lại khó có thể được sử dụng trong AUTOSAR. Bởi vì AUTOSAR nhằm mục đích tiêu chuẩn hóa code, nên những chỉnh sửa về mặt địa chỉ như kể trên là không được phép.

    AUTOSAR sử dụng một header file có tên là MemMap.h để giải quyết vấn đề trên. File này sẽ cung cấp các macro dùng để đưa biến vào các section code được chỉ định. File này cũng dùng cả macro #pragma được đặt cùng macro #define.

    ➤ Dưới đây là một ví dụ nội dung trong MemMap file

#ifdef CAN_START_SEC_VAR_8BIT
         #undef CAN_START_SEC_VAR_8BIT
         #define START_SECTION_DATA_8BIT
#elif
/*Some more macros for different sections*/
#endif

#ifdef
START_SECTION_DATA_8BIT
     #pragma section data ".data_8bit"
     #undef START_SECTION_DATA_8BIT
     #undef MEMMAP_ERROR
#elif CAN_STOP_SEC_VAR_8BIT
     #undef CAN_STOP_SEC_VAR_8BIT
     #define STOP_SECTION_DATA_8BIT 
#endif

#ifdef STOP_SECTION_DATA_8BIT 
     #pragma section code ".data_8bit"
     #undef STOP_SECTION_DATA_8BIT 
     #undef MEMMAP_ERROR
#endif

    Đoạn code trên nhằm mục đích đưa các biến/hàm mong muốn vào vùng .data_8bit, được quy định trong file Linker Script. Vì vậy, tùy vào Project với Linker Script File khác sau, sẽ có các vùng nhớ khác nhau (Điển hình là các section như Code, Data, Bss, RAM_Cacheable, RAM_Noncacheable, Const, ...).

    Đối với AUTOSAR, các macro đặt ở trên cũng sẽ có một tiêu chuẩn nhất định. Ví dụ như với vùng Data Section trong ví dụ trên, macro mà AUTOSAR quy định sẽ tuân theo cú pháp bên dưới.

[MSN]_START_SEC_VAR_[SIZE]
[MSN]_STOP_SEC_VAR_[SIZE]

  • [MSN] tương ứng với module name
  • [SIZE] tương ứng với kích thước biến mà developer muốn đưa vào vùng nhớ - 8BIT / 16BIT / 32BIT / UNSPECIFIED.

    👉 Cách sử dụng file MemMap

    Đối với cách định nghĩa file MemMap bằng các macro như trên, AUTOSAR quy định cơ chế dưới đây khi developer muốn đưa một biến/hàm/đoạn code vào trong một vùng nhớ chỉ định.

#define CAN_START_SEC_VAR_8BIT
#include "MemMap.h"
static uint8 myvar;        // Your Code, Function, Variable
#define CAN_STOP_SEC_VAR_8BIT
#include "MemMap.h"

    Trong quá trình Preprocessing, nội dung của file MemMap.h sẽ được thay thế trực tiếp vào 2 vị trí trong đoạn code kể trên. 

  • Đầu tiên, tất cả đoạn code trong file MemMap.h, và không liên quan đến vùng CAN_START_SEC_VAR_8BIT sẽ bị bỏ qua, vì chúng đều có đoạn #ifdef [MSN]_START_SEC_VAR_[SIZE] tương ứng.
  • Chỉ riêng đoạn code ở phần đầu bài #ifdef CAN_START_SEC_VAR_8BIT, sẽ được thực hiện, vì ở đây chúng ta đã có #define CAN_START_SEC_VAR_8BIT
  • Đến đây thì dễ dàng phân tích thêm, START_SECTION_DATA_8BIT sẽ được define, và đoạn code #pragma section data ".data_8bit" sẽ xuất hiện trong chương trình.
  • Tương tự như thế, ở cuối phần này thì mình cần một macro CAN_STOP_SEC_VAR_8BIT để kết thúc phần lưu biến vào vùng nhớ tương ứng, tránh việc lưu trữ những thứ khác không cần thiết, với cơ chế hoạt động tương tự như phần Start.
    Trên đây là những chia sẻ về file MemMap được sử dụng trong các dự án AUTOSAR, đối với từng dự án thực tế sẽ có những file MemMap khác nhau, tuy nhiên ý tưởng chung vẫn là như kể trê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 😊

                                        

Đăng nhận xét

2 Nhận xét