อะไรคือความหมายของการใช้ PROGMEM


12

ที่มีจำนวนมากของตัวแปรข้อความฉันได้พบมันจำเป็นที่จะต้องเก็บไว้ในหน่วยความจำแฟลชใช้PROGMEM อะไรคือผลบวกและลบของการจัดเก็บตัวแปรขนาดใหญ่ใน Flash (โดยใช้ PROGMEM) เทียบกับ SRAM และ EEPROM บน Arduino

คำตอบ:


10

นี่คือการเปรียบเทียบอย่างรวดเร็วของ FLASH, EEPROM และ SRAM บน AtMega328 ซึ่งเป็นไมโครคอนโทรลเลอร์ในบอร์ด Arduino หลาย ๆ รุ่นปัจจุบัน (ยกเว้น Due, Leonardo, Arduinos ที่เก่ากว่าและบอร์ดอื่น ๆ ที่ใช้งานร่วมกันได้)

  • FLASH: 10,000 เขียน / ลบรอบ การเข้าถึงนั้นเร็ว แต่ช้ากว่า SRAM PROGMEMรหัสผ่านเข้าถึง
  • EEPROM: 100,000 รอบการเขียน / ลบ การเข้าถึงเป็น slooooooow ในหน่วยมิลลิวินาที ขั้นตอนการเข้าถึงค่อนข้างซับซ้อน
  • SRAM: รอบการเขียน / ลบไม่ จำกัด เข้าถึงเร็วมาก 2 รอบนาฬิกา การเข้าถึงโดยตรงด้วยรหัส

ดังนั้นผลลัพธ์เชิงลบที่สำคัญสมมุติฐานของการใช้ PROGMEM คือขีด จำกัด10,000 รอบการเขียน ผลกระทบเชิงลบที่สำคัญของการใช้ EEPROM คือความซับซ้อนของรหัสในการอ่าน / เขียน / คัดลอกข้อมูล SRAM ก็เพียงมากจำกัด ในความสามารถ


คุณได้รับข้อมูลเกี่ยวกับการเข้าถึง EEPROM อยู่ที่ไหน จากบิตของมอง เกี่ยวกับดูเหมือนว่า EEPROM อ่านเอาสิ่งที่ต้องการ ~ 5 รอบนาฬิกา การเขียนช้า แต่ไม่ได้อ่าน
Connor Wolf

OP ต้องการเก็บของมากมาย
Anindo Ghosh

ใช่ แต่นั่นคือการเขียนครั้งเดียวอ่านหลายคนหรือสิ่งที่ตรงกันข้าม? "ตัวแปรข้อความ" เป็นสิ่งที่ระบุในเวลารวบรวมเขียนไปยังอุปกรณ์และไม่เคยเปลี่ยนแปลงหลังจากนั้น (เช่นข้อความเมนูหรือซอมมาต)
Connor Wolf

ฉันอ่านร้านค้าในคำถามว่า "ร้านค้าในเวลารวบรวม / อัปโหลด" หากตัวแปรมีความหมายว่าจะต้องใช้การอ่าน / เขียน ณ รันไทม์มันไม่ควรถูกเก็บไว้ใน FLASH มีข้อ จำกัด เพิ่มเติมที่ไม่สามารถแก้ไข FLASH โดยไม่ลบหน้าทั้งหมดก่อนหรือไม่?
microtherion

... ตัวแปรข้อความ ไม่ใช่ค่าคงที่ของสตริง
Anindo Ghosh

2

ความหมายหลักคือคุณไม่สามารถแก้ไขข้อมูลที่เก็บไว้ใน PROGMEM นอกจากนี้คุณยังจะได้รับประสิทธิภาพการทำงานที่น้อยมากเนื่องจากสตริงจะต้องคัดลอกทีละ 1 ไบต์

การเสื่อมสภาพของ FLASH ไม่ได้เป็นข้อกังวล (หลัก) เนื่องจากการเปลี่ยนแปลงโปรแกรมของคุณคุณจะต้องตั้งโปรแกรม FLASH ใหม่อีกครั้ง

ด้วยการแนะนำ IDE 1.x ทำให้แมโคร F () รวมอยู่ด้วย สิ่งนี้ทำให้ง่ายต่อการเก็บสตริงใน PROGMEM

ตัวอย่างเช่นแทนที่จะใช้: Serial.print ("Hello World!");

ตอนนี้คุณสามารถใช้:

Serial.print (F ("Hello World!");

โปรดทราบว่า F () ไม่ใช่ฟังก์ชั่นมันเป็นเพียงมาโครดังนั้นการใช้งานจึงค่อนข้าง จำกัด


1

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

เกี่ยวกับ EEPROM - ลองบันทึกสิ่งนี้เพื่อสิ่งที่คงอยู่ IIRC มันช้ากว่าในการดึงข้อมูลจาก EEPROM ผ่าน SRAM / PROGMEM โดยปกติฉัน (และอื่น ๆ ) คัดลอกข้อมูลจาก EEPROM ไปยัง SRAM (แม้แต่ตัวอย่างที่เป็นทางการทำเช่นนี้) ก่อนที่จะใช้

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