Utilities

Utilities trong Arduino

Các tiện ích (Utilities) trong Arduino như PROGMEMsizeof() 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.