Tôi có thể ghi vào Flash Memory bằng PROGMEM không?


11

Về tài liệu của Arduino, tôi xin trích dẫn:

http://playground.arduino.cc/Learning/Memory Lưu ý: Bộ nhớ Flash (PROGMEM) chỉ có thể được điền vào thời gian ghi chương trình. Bạn không thể thay đổi> các giá trị trong flash sau khi chương trình đã bắt đầu chạy.

Và trên mô tả PROGMEM:

http://arduino.cc/en/Reference/PROGMEM Lưu trữ dữ liệu trong bộ nhớ flash (chương trình) thay vì SRAM. Có một mô tả về các loại bộ nhớ khác nhau có sẵn trên bo mạch Arduino.

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

Vậy chúng ta có thể hay không? Hay đó không phải là điều tương tự?


Mặc dù bạn có thể ghi vào (flash) bộ nhớ chương trình trong thời gian chạy (trừ khi nó bị khóa), quá trình này có liên quan nhiều hơn một chút và không thể được thực hiện bằng chỉ thị PROGMEM, về cơ bản chỉ kiểm soát quá trình phân bổ. Nếu bạn muốn xem làm thế nào nó có thể được thực hiện, hãy xem nguồn bootloader.
Chris Stratton

Các trang viết khối không làm cho việc viết thành flash không thực tế. Trong thực tế, một cái gì đó mong đợi.
Anothercg Gmail

Câu trả lời:


9

Câu trả lời ngắn gọn là không: Dữ liệu PROGMEM chỉ đọc.

Giới hạn bộ nhớ flash
Điều đầu tiên cần hiểu là bộ nhớ Flash (nơi không gian chương trình sống) được thiết kế để lưu trữ cố định lâu dài. Đọc từ nó rất nhanh và chính xác. Tuy nhiên, nói chung, bạn không thể sửa đổi nó trên cơ sở từng byte (ví dụ: thay đổi một biến cụ thể). Bạn thường phải xóa và viết lại thành các khối lớn. Điều đó làm cho nó hoàn toàn không thực tế đối với thao tác trong thời gian chạy, bởi vì bạn phải lưu trữ nhiều thông tin dư thừa ở một nơi khác trong khi bạn thực hiện chu trình xóa và ghi.

PROGMEM thực sự làm gì
Bất kỳ dữ liệu bằng chữ nào được chỉ định trong mã của bạn (chẳng hạn như chuỗi và số) luôn nằm trong không gian chương trình lúc đầu (ví dụ như trong Flash). Tuy nhiên, khi bản phác thảo của bạn thực sự muốn sử dụng dữ liệu đó trong thời gian chạy, thông thường nó phải phân bổ một số không gian cho nó trong SRAM và sao chép nó. Điều đó có nghĩa là bạn kết thúc với hai bản sao: bản gốc cố định trong Flash và bản sao tạm thời trong SRAM.

Khi bạn sử dụng công cụ sửa đổi PROGMEM, bạn sẽ bảo nó không tạo bản sao thứ hai đó trong SRAM. Thay vào đó, bản phác thảo của bạn sẽ chỉ truy cập vào bản gốc trong Flash. Điều đó rất hữu ích nếu bạn chỉ phải đọc dữ liệu vì nó tránh được các hoạt động phân bổ và sao chép.

Tuy nhiên, sao chép nó vào SRAM là điều cần thiết nếu bạn muốn sửa đổi dữ liệu. Ngoài các giới hạn Flash tôi đã đề cập ở trên, đây cũng là một câu hỏi về an toàn mã.

Nếu bạn có thể sửa đổi dữ liệu được lưu trữ trong không gian chương trình, thì nó sẽ tuân theo logic rằng bạn cũng có thể sửa đổi được lưu trữ trong không gian chương trình. Điều đó có nghĩa là một lỗi đơn giản (hoặc trên lý thuyết là một cuộc tấn công độc hại) có thể dẫn đến bản phác thảo của bạn được viết lại một phần hoặc toàn bộ vào thời gian chạy. Điều này có thể có kết quả rất khó lường, từ đơn giản là ngừng hoạt động, cho đến làm hỏng / phá hủy bất kỳ thiết bị kết nối nào.

Thêm thông tin
Bạn có thể tìm hiểu thêm về các công cụ PROGMEM cấp thấp từ đây:

Một phiên bản cũ hơn của cùng một hướng dẫn PROGMEM có sẵn ở đây:


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.