ฉันสามารถเขียนไปยังหน่วยความจำแฟลชโดยใช้ PROGMEM ได้หรือไม่


11

ในเอกสารของ Arduino ฉันพูด:

http://playground.arduino.cc/Learning/Memory หมายเหตุ: หน่วยความจำแบบแฟลช (PROGMEM) สามารถบรรจุได้ในเวลาที่โปรแกรมเขียนเท่านั้น คุณไม่สามารถเปลี่ยน> ค่าในแฟลชหลังจากที่โปรแกรมเริ่มทำงาน

และในคำอธิบาย PROGMEM:

http://arduino.cc/th/Reference/PROGMEM เก็บข้อมูลในหน่วยความจำแฟลช (โปรแกรม) แทน SRAM มีคำอธิบายของหน่วยความจำประเภทต่าง ๆ ที่มีอยู่ในบอร์ด Arduino

คำหลัก PROGMEM เป็นตัวดัดแปลงตัวแปรควรใช้เฉพาะกับประเภทข้อมูลที่กำหนดไว้ใน pgmspace.h มันบอกคอมไพเลอร์ "ใส่ข้อมูลนี้ในหน่วยความจำแฟลช" แทนที่จะเป็น SRAM ซึ่งมันจะไปตามปกติ

ดังนั้นเราสามารถหรือไม่เรา? หรือไม่ใช่สิ่งเดียวกัน


ในขณะที่คุณสามารถเขียนถึง (แฟลช) หน่วยความจำโปรแกรมในขณะใช้งาน (ยกเว้นกรณีที่ถูกล็อค) กระบวนการนั้นเกี่ยวข้องกับบิตมากกว่าเล็กน้อยและไม่สามารถทำได้ด้วยคำสั่ง PROGMEM ซึ่งโดยทั่วไปแล้วเพียงแค่ควบคุมกระบวนการจัดสรร หากคุณต้องการดูว่าสามารถทำได้อย่างไรให้ดูที่แหล่ง bootloader
Chris Stratton

บล็อกการเขียนเพจไม่ได้เขียนลงแฟลชแบบทำไม่ได้ ในความเป็นจริงมันเป็นสิ่งที่คาดหวัง
Anothercg Gmail

คำตอบ:


9

คำตอบสั้น ๆ คือไม่: ข้อมูล PROGMEM เป็นแบบอ่านอย่างเดียว

ข้อ จำกัด ของหน่วยความจำแฟลช
สิ่งแรกที่ต้องทำความเข้าใจคือหน่วยความจำแฟลช (ที่พื้นที่โปรแกรมอยู่) ได้รับการออกแบบสำหรับการจัดเก็บถาวรในระยะยาว การอ่านจากมันรวดเร็วและแม่นยำมาก อย่างไรก็ตามโดยทั่วไปคุณไม่สามารถแก้ไขได้แบบทีละไบต์ (เช่นการเปลี่ยนตัวแปรเฉพาะ) คุณมักจะต้องลบและเขียนใหม่ในบล็อกขนาดใหญ่ สิ่งนี้ทำให้การจัดการในเวลาทำงานไม่สมบูรณ์เนื่องจากคุณต้องเก็บข้อมูลซ้ำซ้อนจำนวนมากในที่อื่นขณะที่คุณลบและเขียนรอบ

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

เมื่อคุณใช้ตัวแก้ไข PROGMEM คุณกำลังบอกว่าจะไม่ทำสำเนาที่สองใน SRAM แต่ร่างของคุณจะเข้าถึงต้นฉบับใน Flash แทน มันมีประโยชน์มากถ้าคุณต้องอ่านข้อมูลเท่านั้นเพราะมันจะช่วยหลีกเลี่ยงการจัดสรรและคัดลอกข้อมูล

อย่างไรก็ตามการคัดลอกไปยัง SRAM เป็นสิ่งจำเป็นหากคุณต้องการแก้ไขข้อมูล นอกเหนือจากข้อ จำกัด ของ Flash ที่ฉันกล่าวถึงข้างต้นแล้วยังเป็นคำถามของความปลอดภัยของรหัส

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

ข้อมูลเพิ่มเติม
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับสิ่ง PROGMEM ระดับต่ำจากที่นี่:

รุ่นที่เก่ากว่าของการสอน PROGMEM เดียวกันมีให้ที่นี่:


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.