Trong IDE của bạn, sẽ có một bản đồ bộ nhớ có sẵn thông qua một số tệp liên kết. Nó sẽ chứa tất cả các địa chỉ trong chương trình. Đọc hướng dẫn MCU để xem địa chỉ nào có bộ nhớ hợp lệ cho mục đích của bạn, sau đó đặt trước một số bộ nhớ đó cho biến của bạn. Bạn phải đọc tài liệu về nền tảng phát triển cụ thể của bạn.
Tiếp theo, xin lưu ý rằng các biến bản đồ tại các địa chỉ cụ thể không có ý nghĩa trừ khi chúng là bộ đăng ký phần cứng hoặc biến không biến đổi nằm trong flash hoặc EEPROM.
Nếu nội dung của vị trí bộ nhớ như vậy sẽ thay đổi trong quá trình thực thi, vì nó là một thanh ghi, hoặc vì chương trình của bạn chứa thuật toán lập trình bộ nạp khởi động/NVM thay đổi ô nhớ NVM, thì các biến phải được khai báo là dễ bay hơi. Nếu không trình biên dịch sẽ phá vỡ hoàn toàn mã của bạn khi tối ưu hóa.
Trình biên dịch cụ thể rất có thể có cách không chuẩn để phân bổ biến tại các địa chỉ cụ thể, chẳng hạn như #pragma hoặc đôi khi toán tử lạ, phi tiêu chuẩn @
. Cách hợp lý duy nhất bạn có thể phân bổ một biến tại một vị trí cố định trong tiêu chuẩn C, là:
#define MY_REGISTER (*(volatile uint8_t*)0x12345678u)
nơi 0x12345678 là địa chỉ có 1 byte của vị trí đó. Khi bạn có khai báo macro như thế này, bạn có thể sử dụng nó như thể đó là một biến:
void func (void)
{
MY_REGISTER = 1; // write
int var = MY_REGISTER; // read
}
Thông thường bạn muốn loại biến này nằm trong không gian tên chung, do đó macro. Nhưng nếu bạn vì lý do nào đó muốn phạm vi của biến bị giảm, sau đó bỏ qua macro và truy cập địa chỉ theo cách thủ công bên trong mã:
void func (void)
{
*(volatile uint8_t*)0x12345678u = 1; // write
int var = *(volatile uint8_t*)0x12345678u; // read
}
Phổ biến trên hệ thống nhúng có đăng ký phần cứng tại địa chỉ cụ thể. Tuy nhiên, trên một máy tính bình thường, không thể dự đoán biến của bạn sẽ kết thúc ở đâu và bạn có thể không đặt biến vào vị trí bộ nhớ cụ thể tương tự như bản đồ bộ nhớ của chương trình không cố định. Đây có phải là cho một hệ thống nhúng hoặc cho một máy tính bình thường? –
Tại sao địa chỉ lại quan trọng? Nó là ** bộ nhớ ảo ** anyway. – UmNyobe
Xin chào, tôi phải làm như sau. Làm một loại nền tảng thử nghiệm cho một UC 32 bit, nhưng sau khi nhấp nháy qua OCD, nền tảng nên có (chạy) trên truyền thông UART. Và giả sử tôi có bộ đếm đếm số lần chương trình đã chạy, hoặc bộ đếm lưu trữ bao nhiêu thời gian chương trình chạy mà không có lỗi, thì giáo sư của tôi sẽ cung cấp thông tin gì qua đầu vào Hyper Terminal địa chỉ có bộ đếm biến đó, để có được giá trị của nó. Đó là những gì tôi cần .. bất kỳ ý tưởng nào: – Laurentiu