คำตอบสั้น ๆ คือไม่: ข้อมูล PROGMEM เป็นแบบอ่านอย่างเดียว
ข้อ จำกัด ของหน่วยความจำแฟลช
สิ่งแรกที่ต้องทำความเข้าใจคือหน่วยความจำแฟลช (ที่พื้นที่โปรแกรมอยู่) ได้รับการออกแบบสำหรับการจัดเก็บถาวรในระยะยาว การอ่านจากมันรวดเร็วและแม่นยำมาก อย่างไรก็ตามโดยทั่วไปคุณไม่สามารถแก้ไขได้แบบทีละไบต์ (เช่นการเปลี่ยนตัวแปรเฉพาะ) คุณมักจะต้องลบและเขียนใหม่ในบล็อกขนาดใหญ่ สิ่งนี้ทำให้การจัดการในเวลาทำงานไม่สมบูรณ์เนื่องจากคุณต้องเก็บข้อมูลซ้ำซ้อนจำนวนมากในที่อื่นขณะที่คุณลบและเขียนรอบ
PROGMEM จริง ๆ ทำ
อะไรข้อมูลตัวอักษรที่ระบุในรหัสของคุณ (เช่นสตริงและตัวเลข) อยู่ในพื้นที่ของโปรแกรมในตอนแรกเสมอ (เช่นใน Flash) อย่างไรก็ตามเมื่อร่างของคุณต้องการใช้ข้อมูลนั้นตอนรันไทม์ปกติแล้วมันจะต้องจัดสรรพื้นที่ให้กับมันใน SRAM และคัดลอกมันไป นั่นหมายความว่าคุณจะได้รับสำเนาสองชุด: ต้นฉบับคงที่ใน Flash และสำเนาชั่วคราวใน SRAM
เมื่อคุณใช้ตัวแก้ไข PROGMEM คุณกำลังบอกว่าจะไม่ทำสำเนาที่สองใน SRAM แต่ร่างของคุณจะเข้าถึงต้นฉบับใน Flash แทน มันมีประโยชน์มากถ้าคุณต้องอ่านข้อมูลเท่านั้นเพราะมันจะช่วยหลีกเลี่ยงการจัดสรรและคัดลอกข้อมูล
อย่างไรก็ตามการคัดลอกไปยัง SRAM เป็นสิ่งจำเป็นหากคุณต้องการแก้ไขข้อมูล นอกเหนือจากข้อ จำกัด ของ Flash ที่ฉันกล่าวถึงข้างต้นแล้วยังเป็นคำถามของความปลอดภัยของรหัส
หากคุณสามารถปรับเปลี่ยนข้อมูลที่เก็บไว้ในพื้นที่ของโปรแกรมได้ข้อมูลดังกล่าวจะเป็นไปตามหลักเหตุผลว่าคุณสามารถแก้ไขรหัสที่เก็บไว้ในพื้นที่โปรแกรมได้ นั่นหมายความว่าข้อผิดพลาดง่าย ๆ (หรือในทางทฤษฎีว่าเป็นการโจมตีที่มุ่งร้าย) อาจส่งผลให้ร่างของคุณถูกเขียนใหม่บางส่วนหรือทั้งหมดในเวลาทำงาน สิ่งนี้อาจมีผลลัพธ์ที่คาดเดาไม่ได้ตั้งแต่การหยุดทำงานจนถึงการทำลาย / ทำลายอุปกรณ์ที่เชื่อมต่อใด ๆ
ข้อมูลเพิ่มเติม
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับสิ่ง PROGMEM ระดับต่ำจากที่นี่:
รุ่นที่เก่ากว่าของการสอน PROGMEM เดียวกันมีให้ที่นี่: