.bản văn
Phân đoạn .text chứa mã thực tế và được lập trình vào bộ nhớ Flash cho các bộ vi điều khiển. Có thể có nhiều hơn một phân đoạn văn bản khi có nhiều khối bộ nhớ Flash không liền kề; ví dụ: vectơ bắt đầu và vectơ ngắt nằm ở đầu bộ nhớ và mã bắt đầu từ 0; hoặc các phần riêng biệt cho một chương trình bootstrap và chính.
.bss và .data
Có ba loại dữ liệu có thể được phân bổ bên ngoài cho một chức năng hoặc thủ tục; đầu tiên là dữ liệu chưa được khởi tạo (theo lịch sử gọi là .bss, cũng bao gồm dữ liệu khởi tạo 0) và dữ liệu thứ hai được khởi tạo (không phải bss) hoặc .data. Cái tên "bss" trong lịch sử xuất phát từ "Khối bắt đầu bằng biểu tượng", được sử dụng trong một trình biên dịch khoảng 60 năm trước. Cả hai khu vực này đều nằm trong RAM.
Khi một chương trình được biên dịch, các biến sẽ được phân bổ cho một trong hai khu vực chung này. Trong giai đoạn liên kết, tất cả các mục dữ liệu sẽ được thu thập cùng nhau. Tất cả các biến cần được khởi tạo sẽ có một phần bộ nhớ chương trình được đặt sang một bên để giữ các giá trị ban đầu và ngay trước khi hàm main () được gọi, các biến sẽ được khởi tạo, thông thường bởi một mô-đun gọi là crt0. Phần bss được khởi tạo cho tất cả các số không bằng cùng một mã khởi động.
Với một vài bộ vi điều khiển, có các hướng dẫn ngắn hơn cho phép truy cập vào trang đầu tiên (256 vị trí đầu tiên, đôi khi được gọi là trang 0) của RAM. Trình biên dịch cho các bộ xử lý này có thể bảo lưu một từ khóa như near
chỉ định các biến được đặt ở đó. Tương tự, cũng có những bộ vi điều khiển chỉ có thể tham chiếu các khu vực nhất định thông qua một thanh ghi con trỏ (yêu cầu thêm hướng dẫn) và các biến như vậy được chỉ định far
. Cuối cùng, một số bộ xử lý có thể giải quyết một phần của bộ nhớ từng bit và trình biên dịch sẽ có cách để xác định điều đó (chẳng hạn như từ khóa bit
).
Vì vậy, có thể có các phân đoạn bổ sung như .gầnbss và .gầndata, v.v., trong đó các biến này được thu thập.
.rodata
Loại dữ liệu thứ ba bên ngoài một chức năng hoặc thủ tục giống như các biến được khởi tạo, ngoại trừ nó là chỉ đọc và không thể được sửa đổi bởi chương trình. Trong ngôn ngữ C, các biến này được biểu thị bằng const
từ khóa. Chúng thường được lưu trữ như một phần của bộ nhớ flash chương trình. Đôi khi chúng được xác định là một phần của phân đoạn .rodata (dữ liệu chỉ đọc). Trên các vi điều khiển sử dụng kiến trúc Harvard , trình biên dịch phải sử dụng các hướng dẫn đặc biệt để truy cập các biến này.
chồng chất
Cả stack và heap đều được đặt trong RAM. Tùy thuộc vào kiến trúc của bộ xử lý, ngăn xếp có thể lớn lên hoặc tăng xuống. Nếu nó lớn lên, nó sẽ được đặt ở dưới cùng của RAM. Nếu nó phát triển xuống, nó sẽ được đặt ở cuối RAM. Heap sẽ sử dụng RAM còn lại không được phân bổ cho các biến và phát triển theo hướng ngược lại của ngăn xếp. Kích thước tối đa của ngăn xếp và đống thường có thể được chỉ định làm tham số liên kết.
Các biến được đặt trên ngăn xếp là bất kỳ biến nào được xác định trong hàm hoặc thủ tục mà không có từ khóa static
. Chúng từng được gọi là biến tự động ( auto
từ khóa), nhưng từ khóa đó là không cần thiết. Trong lịch sử, auto
tồn tại bởi vì nó là một phần của ngôn ngữ B có trước C, và ở đó nó là cần thiết. Các tham số chức năng cũng được đặt trên ngăn xếp.
Dưới đây là cách bố trí điển hình cho RAM (giả sử không có phần 0 trang đặc biệt):
EEPROM, ROM và NVRAM
Trước khi bộ nhớ Flash xuất hiện, EEPROM (bộ nhớ chỉ đọc có thể lập trình có thể xóa bằng điện) đã được sử dụng để lưu trữ chương trình và dữ liệu const (phân đoạn .text và .rodata). Bây giờ chỉ có một lượng nhỏ (ví dụ: 2KB đến 8KB byte) của EEPROM, nếu có, và nó thường được sử dụng để lưu trữ dữ liệu cấu hình hoặc một lượng nhỏ dữ liệu khác cần được giữ lại khi mất điện chu kỳ. Chúng không được khai báo là biến trong chương trình, mà thay vào đó được ghi vào sử dụng các thanh ghi đặc biệt trong vi điều khiển. EEPROM cũng có thể được triển khai trong một chip riêng và được truy cập thông qua bus SPI hoặc I²C.
ROM về cơ bản giống như Flash, ngoại trừ nó được lập trình tại nhà máy (không được người dùng lập trình). Nó chỉ được sử dụng cho các thiết bị âm lượng rất cao.
NVRAM (RAM không bay hơi) là một thay thế cho EEPROM và thường được triển khai như một IC bên ngoài. RAM thông thường có thể được coi là không bay hơi nếu được dự phòng bằng pin; trong trường hợp đó không cần phương pháp truy cập đặc biệt.
Mặc dù dữ liệu có thể được lưu vào Flash, nhưng bộ nhớ Flash có số chu kỳ xóa / chương trình hạn chế (1000 đến 10.000) vì vậy nó không thực sự được thiết kế cho điều đó. Nó cũng yêu cầu xóa các khối bộ nhớ cùng một lúc, vì vậy việc cập nhật chỉ một vài byte là bất tiện. Nó dành cho mã và các biến chỉ đọc.
EEPROM có giới hạn cao hơn nhiều đối với các chu kỳ xóa / chương trình (100.000 đến 1.000.000) vì vậy sẽ tốt hơn cho mục đích này. Nếu có EEPROM có sẵn trên vi điều khiển và nó đủ lớn, đó là nơi bạn muốn lưu dữ liệu không bay hơi. Tuy nhiên, bạn cũng sẽ phải xóa các khối trước (thường là 4KB) trước khi viết.
Nếu không có EEPROM hoặc nó quá nhỏ, thì cần có chip bên ngoài. EEPROM 32KB chỉ 66 và có thể bị xóa / ghi thành 1.000.000 lần. Một NVRAM có cùng số thao tác xóa / chương trình đắt hơn nhiều (x10) NVRAM thường nhanh hơn để đọc so với EEPROM, nhưng chậm hơn khi viết. Chúng có thể được ghi vào một byte mỗi lần hoặc theo khối.
Một thay thế tốt hơn cho cả hai loại này là FRAM (RAM sắt điện), về cơ bản có chu kỳ ghi vô hạn (100 nghìn tỷ đồng) và không có độ trễ ghi. Nó có cùng mức giá với NVRAM, khoảng $ 5 cho 32KB.