Utilities
Utilities trong Arduino
Các tiện ích (Utilities) trong Arduino như PROGMEM
và sizeof()
cung cấp công cụ để tối ưu hóa và xử lý dữ liệu hiệu quả hơn trong chương trình của bạn.
1. PROGMEM
Mô tả:
PROGMEM
là từ khóa dùng để lưu trữ dữ liệu hằng số trong bộ nhớ Flash (Program Memory) thay vì bộ nhớ SRAM.- Arduino có dung lượng SRAM giới hạn, nên sử dụng
PROGMEM
giúp tiết kiệm bộ nhớ động.
Giải thích:
- Khi bạn khai báo một mảng hoặc hằng số lớn, mặc định chúng được lưu trữ trong SRAM. Với
PROGMEM
, dữ liệu sẽ được giữ trong Flash và chỉ truy xuất khi cần.
Ví dụ:
#include <avr/pgmspace.h> // Thư viện hỗ trợ PROGMEM
const char text[] PROGMEM = "Hello, PROGMEM!"; // Lưu chuỗi vào Flash
void setup() {
Serial.begin(9600);
// Đọc dữ liệu từ Flash từng ký tự
for (int i = 0; i < strlen_P(text); i++) {
char c = pgm_read_byte(&text[i]); // Truy xuất từng byte
Serial.print(c);
}
}
void loop() {}
Kết quả:
- Chuỗi
"Hello, PROGMEM!"
được in ra màn hình Serial Monitor, nhưng không tiêu tốn bộ nhớ SRAM.
2. sizeof()
Mô tả:
sizeof()
là một toán tử trong C++ được sử dụng để trả về kích thước (số byte) của một biến, mảng, hoặc kiểu dữ liệu.
Giải thích:
- Dùng để kiểm tra kích thước của dữ liệu trong bộ nhớ.
- Hữu ích khi làm việc với mảng để tránh vượt quá kích thước cho phép.
Ví dụ 1: Kiểm tra kích thước mảng
void setup() {
Serial.begin(9600);
int myArray[] = {10, 20, 30, 40, 50};
int arraySize = sizeof(myArray) / sizeof(myArray[0]); // Kích thước mảng
Serial.print("Số phần tử trong mảng: ");
Serial.println(arraySize);
}
void loop() {}
Kết quả:
- In ra:
Số phần tử trong mảng: 5
.
Ví dụ 2: Kiểm tra kích thước các kiểu dữ liệu
void setup() {
Serial.begin(9600);
Serial.print("Kích thước của int: ");
Serial.println(sizeof(int)); // Kết quả: 2 (trên Arduino UNO)
Serial.print("Kích thước của float: ");
Serial.println(sizeof(float)); // Kết quả: 4
Serial.print("Kích thước của char: ");
Serial.println(sizeof(char)); // Kết quả: 1
}
void loop() {}
Tóm tắt bảng so sánh
Utility | Mô tả | Ứng dụng | Ví dụ Kết quả |
---|---|---|---|
PROGMEM |
Lưu dữ liệu hằng số vào Flash thay vì SRAM để tiết kiệm bộ nhớ. | Dùng khi làm việc với mảng hoặc chuỗi lớn để tối ưu hóa bộ nhớ động (SRAM). | Hello, PROGMEM! in Serial Monitor |
sizeof() |
Trả về kích thước (số byte) của biến, mảng, hoặc kiểu dữ liệu. | Kiểm tra kích thước dữ liệu hoặc mảng, tránh lỗi vượt quá phạm vi hoặc tối ưu hóa bộ nhớ chương trình. | sizeof(int) = 2 bytes |
Lưu ý:
PROGMEM
chỉ cần thiết trên các board Arduino với bộ nhớ SRAM hạn chế (như Arduino UNO, Nano).sizeof()
là công cụ mạnh mẽ để quản lý và tối ưu hóa khi lập trình với mảng hoặc dữ liệu phức tạp.