ฉันจะป้องกันการ์ด SD จากพลังงานที่ไม่คาดคิดได้อย่างไร


18

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

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

อีกวิธีคือให้เปิดไฟล์ไว้ แต่หลังจากเขียนครบ 10 หรือ 50 ครั้งฉันสามารถปิดไฟล์แล้วเปิดใหม่อีกครั้ง

ฉันยังสามารถบัฟเฟอร์ข้อมูลในหน่วยความจำแล้วล้างข้อมูลบางครั้งอาจหลังจาก kbyte หรือดังนั้น

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

ยังไงพวกคุณจะแนะนำอะไร?


2
หากคุณเปลี่ยนมาใช้แฟลช NAND แบบ raw ด้วยระบบไฟล์ขนาดเล็กคุณสามารถเจาะผ่านเลเยอร์ของสิ่งที่เป็นนามธรรมในปัจจุบันที่ขัดขวางความสามารถของคุณในการส่งการเขียนขนาดเล็กและมีความสามารถในการทำบล็อกการเขียนบางส่วนทันที นอกจากนี้คุณยังจะได้รับการปกป้องจากผู้ใช้ปลายทางแทนการ์ดที่มีรายละเอียดประสิทธิภาพที่แตกต่างกัน (อาจเป็นตลาดที่มีสีเทาเล็กน้อย) บนถนน
Chris Stratton

คำตอบ:


16

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

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

ลดเวลาการเขียนของคุณให้น้อยที่สุด

  • ตรวจสอบให้แน่ใจว่าไฟล์เก็บข้อมูลของคุณอยู่แล้วเมื่อคุณเขียนเซกเตอร์ หากคุณเริ่มต้นด้วยไฟล์ขนาดใหญ่และเขียนทับข้อมูลแทนการต่อท้ายข้อมูลข้อมูลจะปลอดภัยทันทีที่การเขียนเซกเตอร์การ์ด SD เสร็จสิ้น คุณสามารถกำจัดวัฏจักรการอ่าน - แก้ไข - เขียนได้หนึ่งถึงสองรอบ รหัสเริ่มต้นของฉันจะเขียน 0 ของไฟล์ในส่วนที่เพิ่มขึ้นจนกว่า SD การ์ดจะเต็มแล้วย้อนกลับไปที่จุดเริ่มต้นของไฟล์

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

  • สร้างชุดตัวเลือกของฟังก์ชัน FSwrite ที่ให้คุณสามารถเขียนส่วนทั้งหมดได้ หากคุณรักษาทั้งเซกเตอร์ไว้ใน SRAM วัฏจักรของคุณจะเปลี่ยนจาก "อ่าน - แก้ไข - เขียน" เป็น "แก้ไข - เขียน"

เปิดใช้งาน PIC และ SD ของคุณนานที่สุด

  • ตัวเก็บประจุขนาดใหญ่นั้นดี 470 ยูเอฟควรให้พลังมากพอที่จะทำให้วงจรการเขียนเสร็จ

  • ตรวจสอบให้แน่ใจว่าแหล่งพลังงานของคุณจะไม่ดูดพลังงานออกจากตัวเก็บประจุสำรองของคุณ! เพิ่มไดโอดหากจำเป็น

รู้ว่าเมื่อคุณหมดอำนาจ

  • ฝาปิดแหล่งจ่ายไฟขนาดใหญ่จะมอบ 10ms ขึ้นไปเพื่อห่อสิ่งต่าง ๆ ด้วยการ์ด SD แต่อย่ากดโชคของคุณ ใช้หมุดบนไมโครคอนโทรลเลอร์ของคุณเพื่อดูว่าแหล่งพลังงานของคุณยังดีอยู่หรือไม่และไม่เริ่มเขียนถ้าแหล่งที่มาของคุณตาย

ขอบคุณสำหรับข้อมูล. มีประโยชน์มาก ฉันจะดูว่าฉันสามารถทำอะไรกับมัน ...
PICyourBrain

คุณคิดว่าจะใช้เวลานานเท่าใดในการเขียนเลขศูนย์ทั้งหมดลงในการ์ด 4GB ดูเหมือนว่าจะนาน นอกจากนี้คุณมีตัวอย่างรหัสใด ๆ ที่คุณสามารถแชร์เพื่อแก้ไขฟังก์ชั่น fswrite เพื่อให้การเขียนทั้งหมดไปยังส่วนทั้งหมด
PICyourBrain

นอกจากนี้หากคุณเขียนศูนย์ทั้งหมดลงในไฟล์ คุณติดตามจุดสิ้นสุดของข้อมูลจริงของคุณได้อย่างไร คุณเพิ่งอ่านข้อมูลทั้งหมดที่จุดเริ่มต้นและค้นหาสตริงของศูนย์หรือไม่
PICyourBrain

1
หากคุณใช้ FAT16 ฉันเชื่อว่าคุณ จำกัด ที่ 2GB ฉันเชื่อว่าการ์ด SD / MMC มีฟังก์ชั่น "ลบบล็อก" ซึ่งดูเหมือนจะไม่ถูกนำไปใช้ในห้องสมุด MDDFS ฉันใช้ไลบรารีรหัสที่เป็นกรรมสิทธิ์สำหรับโครงการการ์ด SD ของฉันดังนั้นฉันจึงไม่สามารถแชร์ตัวอย่างรหัสได้ ในการค้นหาข้อมูลล่าสุดคุณจะต้องอ่านจนกว่าคุณจะพบ 0 ทั้งหมดในบันทึกข้อมูล หากบันทึกข้อมูลของคุณเป็น 0 ทั้งหมดฉันขอแนะนำให้เพิ่มข้อมูลที่ไม่ใช่ศูนย์หรือตัวคั่นบางประเภท
W5VO

6

ปัญหาหนึ่งที่ยังไม่ได้กล่าวถึงกับการ์ด SD (หรือ MMC, CompactFlash ฯลฯ ) คือในขณะที่การ์ด SD อาจปรากฏขึ้นกับโฮสต์เพื่อรวบรวมเซ็กเตอร์ขนาด 512 ไบต์อย่างง่ายซึ่งอาจอ่านและเขียนตามลำดับอุปกรณ์แฟลชโดยทั่วไป เก็บหน้า 528- ไบต์ในกลุ่มซึ่งเป็น 32KB ถ้าไม่ใหญ่กว่าและการดำเนินการที่สนับสนุนเพียงอย่างเดียวคือการเขียนไปยังหน้าว่างหรืออย่างอื่นหรือลบทั้งกลุ่ม เพื่อจัดการกับข้อ จำกัด นี้คอนโทรลเลอร์บนการ์ด SD จะเก็บตารางซึ่งจะอนุญาตให้แมปภาคตรรกะใด ๆ ไปยังหน้าทางกายภาพใด ๆ เมื่อมีการร้องขอให้เขียนเซกเตอร์ตัวควบคุมจะค้นหาหน้าว่างที่ใดที่หนึ่งบนชิปและอัปเดตการแมปด้วยที่อยู่ใหม่ของเซกเตอร์ที่มีปัญหา หากหน้าเปล่ามีการขาดแคลนหรือในเวลาอื่น ๆ

ความสำคัญของสิ่งนี้คือการกระทำของการเขียนไปยังภาคตรรกะเฉพาะอาจต้องสับรอบข้อมูลจากภาคตรรกะจำนวนมาก หากมีสิ่งใดผิดพลาดในกระบวนการดังกล่าวอาจส่งผลให้เกิดการทุจริตของภาคส่วนใด ๆ โดยไม่เฉพาะภาคที่การ์ดถูกขอให้เขียน ตัวควบคุมการ์ด SD ที่ดีควรได้รับการออกแบบมาเพื่อการดำเนินการสับเปลี่ยนข้อมูลในลักษณะที่ว่าหากไฟฟ้าดับในระหว่างการสับเปลี่ยนข้อมูลจะสามารถคิดได้ว่าส่วนใดของการดำเนินการที่เสร็จสมบูรณ์และไม่ได้และ จึงสามารถปิดการทำงานได้อย่างถูกต้อง น่าเสียดายที่ฉันไม่รู้ว่าจะมีใครบอกได้ว่าการ์ด SD ราคา $ 5 ที่หยิบขึ้นมาที่ร้านค้าส่วนลดนั้นจะดีในเรื่องนั้นหรือไม่

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


นั่นคือความคิดเห็นที่ลึกซึ้งมาก
fred basset

5

ฉันขอแนะนำให้ใช้การตรวจสอบบางอย่างเพื่อตรวจสอบข้อมูลใน SD ว่าถูกต้องทุกครั้งที่จำเป็นต้องอ่าน


3

บางทีซุปเปอร์คาปาซิเตอร์นี้ที่ Sparkfun นี้จะแก้ปัญหาได้


2
มันจะเก็บความทรงจำของ PIC แต่มันมีพิกัดกระแสสูงสุด 10uA ฉันไม่คิดว่าคุณสามารถเขียนไปยังการ์ด SD ในปัจจุบันมาก
W5VO

1
แนวคิดนี้ดีแม้ว่า การค้นหาอย่างรวดเร็วพบตัวเก็บประจุอิลลินอยส์ ( illinoiscapacitor.com ) มีตัวเก็บประจุสูงถึง 8 F และสามารถรองรับกระแสได้ถึง 4 A การเพิ่มหนึ่งในนั้นหรือแบตเตอรี่จะทำให้ไมโครมีโอกาสที่จะเขียนและปิดสิ่งต่าง ๆ ลง ถ้าแหล่งพลังงานหลักล้มเหลว
โฟตอน

3

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

เช่นเดียวกับปัญหาทางวิศวกรรมใด ๆ คุณจะต้องจัดการกับการแลกเปลี่ยนที่นี่

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


1

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

แม้ในกรณีที่สูญเสียพลังงานและไม่มีโชคคุณจะสูญเสียเพียงหนึ่งรายการ (ซึ่งอาจเป็นที่ยอมรับในบางระบบ)

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