Ý nghĩa của việc sử dụng PROGMEM là gì?


12

Với số lượng lớn các biến văn bản, tôi thấy cần phải lưu trữ chúng trong bộ nhớ Flash bằng PROGMEM . Hậu quả tích cực và tiêu cực của việc lưu trữ các biến lớn trong Flash (sử dụng PROGMEM) so với SRAM so với EEPROM trên Arduino là gì?

Câu trả lời:


10

Dưới đây là so sánh nhanh về FLASH, EEPROM và SRAM trên AtMega328, bộ vi điều khiển trong nhiều bo mạch Arduino hiện tại (không bao gồm Do, Leonardo, Arduinos cũ và một số bảng tương thích khác).

  • FLASH: 10.000 chu kỳ ghi / xóa. Truy cập nhanh, nhưng chậm hơn SRAM. Mã truy cập thông qua PROGMEM.
  • EEPROM: 100.000 chu kỳ ghi / xóa. Truy cập là slooooooow, tính bằng mili giây. Thủ tục truy cập tương đối phức tạp.
  • SRAM: Chu kỳ ghi / xóa không giới hạn. Truy cập rất nhanh, 2 chu kỳ đồng hồ. Truy cập trực tiếp bằng mã.

Vì vậy, hậu quả tiêu cực giả định quan trọng của việc sử dụng PROGMEM là giới hạn chu kỳ 10.000 ghi . Hậu quả tiêu cực chính của việc sử dụng EEPROM là sự phức tạp của mã để đọc / ghi / sao chép dữ liệu. SRAM, nó chỉ rất hạn chế về năng lực .


Bạn lấy thông tin về quyền truy cập EEPROM ở đâu? Từ một chút tìm về , có vẻ như EEPROM đọc mất một cái gì đó giống như chu kỳ ~ 5 đồng hồ. Viết thì chậm, nhưng không đọc.
Sói Connor

OP muốn lưu trữ nhiều thứ.
Anindo Ghosh

Vâng, nhưng đó là viết một lần, đọc nhiều, hoặc ngược lại? "Biến văn bản" có thể là thứ được chỉ định tại thời điểm biên dịch, được ghi vào thiết bị và không bao giờ thay đổi sau đó (ví dụ: văn bản trình đơn hoặc sommat).
Sói Connor

Tôi đọc các cửa hàng trong câu hỏi là "lưu trữ tại thời gian biên dịch / tải lên". Nếu một biến có nghĩa là được sử dụng đọc / ghi trong thời gian chạy, thì nó chắc chắn không nên được lưu trữ trong FLASH. Không có hạn chế bổ sung rằng FLASH có thể được sửa đổi mà không xóa toàn bộ trang trước?
microtherion

... biến văn bản không phải là hằng chuỗi.
Anindo Ghosh

2

Hàm ý chính là bạn không thể sửa đổi thông tin được lưu trữ trong PROGMEM. Bạn cũng sẽ đạt được hiệu năng (rất nhỏ) vì chuỗi cần được sao chép 1 byte mỗi lần.

Sự hao mòn của FLASH không phải là mối quan tâm (chính) vì để thay đổi chương trình của bạn, bạn phải lập trình lại FLASH bằng mọi cách.

Với IDE 1.x giới thiệu, macro F () đã được bao gồm. Điều này làm cho việc giữ các chuỗi trong PROGMEM dễ dàng hơn.

Ví dụ: thay vì sử dụng: serial.print ("Hello World!");

Bây giờ bạn có thể sử dụng:

Serial.print (F ("Xin chào thế giới!");

Lưu ý rằng F () không phải là một hàm, nó chỉ là một macro nên việc sử dụng nó có phần bị hạn chế.


1

PROGMEM được sử dụng tốt nhất cho dữ liệu bất biến. Nếu bạn sẽ tiếp tục thay đổi nhanh chóng các biến, tôi sẽ chỉ lưu nó trong SRAM. Mặt khác, nếu bạn muốn có một số biến văn bản không thay đổi (ví dụ: nội dung sẽ được hiển thị) sẽ không được tải quá thường xuyên, PROGMEM là một ý tưởng tuyệt vời.

Về EEPROM - cố gắng lưu cái này cho những thứ liên tục. IIRC việc lấy dữ liệu từ EEPROM qua SRAM / PROGMEM chậm hơn. Thông thường tôi (và những người khác) sao chép dữ liệu từ EEPROM sang SRAM (Ngay cả ví dụ chính thức cũng làm điều này) trước khi sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.