Tư vấn: 0979.466.469 / 0938.128.290

MENU

PROGMEM trong Arduino

Gia cong pcb 600*150px

PROGMEM là một công cụ sửa đổi biến, nó chỉ nên được sử dụng với các kiểu dữ liệu được xác định trong pgmspace.h. Nó yêu cầu trình biên dịch "đặt thông tin này vào bộ nhớ flash", thay vì vào SRAM, nơi nó thường đi.

PROGMEM là một phần của thư viện pgmspace.h. Nó được tự động đưa vào các phiên bản hiện đại của IDE. Tuy nhiên, nếu bạn đang sử dụng phiên bản IDE dưới 1.0 (2011), trước tiên bạn cần đưa thư viện vào đầu sketch như sau:

#include Mặc dù PROGMEM có thể được sử dụng trên một biến duy nhất, nhưng nó thực sự chỉ đáng để sử dụng nếu bạn có một khối dữ liệu lớn hơn cần được lưu trữ, thường dễ dàng nhất trong một mảng, (hoặc một cấu trúc dữ liệu C++ khác ngoài phạm vi bài viết).

Sử dụng PROGMEM cũng là một quy trình gồm hai bước. Sau khi đưa dữ liệu vào bộ nhớ Flash, nó yêu cầu các phương thức (hàm) đặc biệt, cũng được xác định trong thư viện pgmspace.h, để đọc dữ liệu từ bộ nhớ chương trình trở lại SRAM, vì vậy chúng ta có thể làm điều gì có ích với nó.

Cú pháp

const dataType variableName[] PROGMEM = {data0, data1, data3…};

Lưu ý rằng vì PROGMEM là một công cụ sửa đổi biến, nên không có quy tắc cứng nhắc và nhanh chóng nào về vị trí của nó, vì vậy trình biên dịch Arduino chấp nhận tất cả các định nghĩa bên dưới. Tuy nhiên, các thử nghiệm đã chỉ ra rằng, trong các phiên bản khác nhau của Arduino (liên quan đến phiên bản GCC), PROGMEM có thể hoạt động ở một vị trí chứ không phải ở một vị trí khác. Ví dụ về "bảng chuỗi" bên dưới đã được thử nghiệm để hoạt động với Arduino 13. Các phiên bản trước của IDE có thể hoạt động tốt hơn nếu có PROGMEM sau tên biến.

const dataType variableName[] PROGMEM = {}; // sử dụng mẫu này
const PROGMEM dataType variableName[] = {}; // hoặc cái này
const dataType PROGMEM variableName[] = {}; // không phải cái này

Thông số

dataType: Các loại dữ liệu được phép: bất kỳ loại biến nào.
variableName: tên cho mảng dữ liệu của bạn.

Mã ví dụ

Các đoạn mã sau đây minh họa cách đọc và ghi các ký tự không dấu (byte) và int (2 byte) vào PROGMEM.
// lưu các unsigned ints
const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};

// lưu các chars
const char signMessage[] PROGMEM = {"I AM PREDATOR, UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};

unsigned int displayInt;
char myChar;


void setup() {
Serial.begin(9600);
while (!Serial); // đợi cổng nối tiếp kết nối. Cần thiết cho USB gốc

// đặt mã thiết lập của bạn ở đây, để chạy một lần:
// đọc lại int 2 byte
for (byte k = 0; k < 5; k++) {
displayInt = pgm_read_word_near(charSet + k);
Serial.println(displayInt);
}
Serial.println();

// đọc lại một ký tự
for (byte k = 0; k < strlen_P(signMessage); k++) {
myChar = pgm_read_byte_near(signMessage + k);
Serial.print(myChar);
}

Serial.println();
}

void loop() {
// đặt mã chính của bạn ở đây để chạy lặp lại:
}

Mảng các chuỗi

Việc thiết lập một mảng các chuỗi thường thuận tiện khi làm việc với số lượng lớn văn bản, chẳng hạn như một dự án với màn hình LCD. Bởi vì bản thân các chuỗi là mảng, đây là một ví dụ về mảng hai chiều.

Module điện tử 932*50

Chúng có xu hướng là các cấu trúc lớn nên việc đặt chúng vào bộ nhớ chương trình thường được mong muốn. Mã dưới đây minh họa ý tưởng.

/*
Trình diễn chuỗi PROGMEM
Cách lưu trữ một bảng chuỗi trong bộ nhớ chương trình (flash),
và truy xuất chúng.

Thông tin tổng hợp từ:
http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

Việc thiết lập một bảng (mảng) chuỗi trong bộ nhớ chương trình hơi phức tạp, nhưng
đây là một mẫu để làm theo.

Thiết lập các chuỗi là một quá trình gồm hai bước. Đầu tiên, xác định các chuỗi.
*/

#include
const char string_0[] PROGMEM = "String 0"; // "Chuỗi 0", v.v. là các chuỗi để lưu trữ - thay đổi cho phù hợp.
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";


// Sau đó thiết lập một bảng để tham chiếu đến các chuỗi của bạn.

const char *const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};

char buffer[30]; // đảm bảo rằng cái này đủ lớn cho chuỗi lớn nhất mà nó phải chứa

void setup() {
Serial.begin(9600);
while (!Serial); // đợi cổng nối tiếp kết nối. Cần thiết cho USB gốc
Serial.println("OK");
}


void loop() {
/* Việc sử dụng bảng chuỗi trong bộ nhớ chương trình yêu cầu sử dụng các hàm đặc biệt để truy xuất dữ liệu.
Hàm strcpy_P sao chép một chuỗi từ không gian chương trình sang một chuỗi trong RAM ("bộ đệm").
Đảm bảo rằng chuỗi nhận của bạn trong RAM đủ lớn để chứa bất cứ thứ gì
bạn đang truy xuất từ không gian chương trình. */


for (int i = 0; i < 6; i++) {
strcpy_P(buffer, (char *)pgm_read_word(&(string_table[i]))); // chỉ cần sao chép.
Serial.println(buffer);
delay(500);
}
}

 

Lưu ý và cảnh báo

Xin lưu ý rằng các biến phải được xác định toàn cục HOẶC được xác định bằng từ khóa tĩnh để hoạt động với PROGMEM.

Đoạn mã sau sẽ KHÔNG hoạt động khi ở bên trong một hàm:

const char long_str[] PROGMEM = "Xin chào, tôi muốn giới thiệu đôi chút về bản thân. ";
Đoạn mã sau SẼ hoạt động, ngay cả khi được xác định cục bộ trong một hàm:

const static char long_str[] PROGMEM = "Xin chào, tôi muốn giới thiệu đôi chút về bản thân. "

Macro F()
Khi một câu lệnh như:

Serial.print("Viết gì đó trên Serial Monitor");
được sử dụng, chuỗi được in thường được lưu trong RAM. Nếu sketch của bạn in nhiều thứ trên Màn hình nối tiếp, bạn có thể dễ dàng lấp đầy RAM. Nếu bạn có dung lượng bộ nhớ FLASH trống, bạn có thể dễ dàng chỉ ra rằng chuỗi phải được lưu trong FLASH bằng cú pháp:

Serial.print(F("Viết nội dung nào đó trên Màn hình nối tiếp được lưu trong FLASH"));

Gia công pcb 932*150
Sản phẩm nổi bật
Sale 0%
75000 /Cái
/ Cái

Code: 7203-028 Còn hàng

Lưu xem sau
Sale 0%
50000 /Cái
/ Cái

Code: 7006-060 Còn hàng

Lưu xem sau
Sale 0%
90000 /Cái
/ Cái

Code: 7204-242 Còn hàng

Lưu xem sau
Sale 0%
50000 /Cái
/ Cái

Code: M-7004-016 Còn hàng

Lưu xem sau
Hỗ trợ liên kết
0979466469
0899909838
0938128290
0899909838
Khiếu nại: 0964238397
0979466469
0868565469
0868565469

Hotline: 0979 466 469

Loading
0964238397
Bạn cần linh kiện mẫu ? 7-11 ngày