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 mã đượ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: