예기치 않은 정전으로부터 SD 카드를 어떻게 보호합니까?


18

Microchip MDDFS 라이브러리를 사용하여 데이터를 SD 카드에 저장하는 장치에서 작업하고 있습니다. 로거는 1 분마다 최대 1 개의 항목 (56 바이트)으로 데이터를 기록합니다. 문제는 쓰기 시퀀스 도중에 언제라도 장치의 전원이 끊길 수 있다는 것입니다. 손상으로부터 데이터를 보호하는 가장 좋은 방법이 무엇인지 궁금합니다. 전원이 끊어졌을 때 파일이 열려 있으면 마지막 파일 닫기 후 파일에 기록 된 모든 데이터가 손실됩니다. 쓰기 시퀀스 도중에 전원이 끊기는 경우에도 마찬가지입니다.

쓰기 절차가 자주 발생하지 않기 때문에 데이터가 기록 될 때마다 파일을 열고 데이터를 쓴 다음 파일을 닫을 수 있습니다. 이 방법으로 시간이 지남에 따라 SD 카드가 손상됩니까?

다른 접근 방식은 파일을 열어 두는 것이지만 10 또는 50 쓰기마다 파일을 닫았다가 다시 열 수 있습니다.

또한 메모리에 데이터를 버퍼링 한 다음 kbyte 정도 후에 데이터를 플러시 할 수도 있습니다.

내가 마지막으로 생각한 것은 회로에서 파일을 빠르게 닫을 수 있도록 전원 연결이 끊어진 후 오랫동안 내 pic / sd 카드에 전원을 공급할 수있는 큰 커패시터를 추가 할 수 있다는 것입니다. 이 방법의 문제점은 파일을 닫거나 데이터를 저장하는 데 걸리는 시간이 매우 일관성이 없다는 것입니다. 내 이해에 따르면,이 시간은 파일이있는 플래시 페이지의 현재 위치에 따라 매우 달라질 수 있습니다.

어쨌든, 당신은 무엇을 제안 하시겠습니까?


2
최소한의 파일 시스템으로 원시 NAND 플래시로 전환 한 경우 현재 소규모 쓰기를 저지르는 기능을 방해하는 많은 추상화 계층을 뚫고 데이터를 사용할 수있게되면 즉시 부분 블록 쓰기를 수행 할 수 있습니다. 또한 다른 성능 세부 사항 (아마도 회색 시장 일 수도 있음)을 가진 카드를 대체하는 최종 사용자로부터 보호받을 수 있습니다.
Chris Stratton

답변:


16

파일에 데이터를 쓸 때 몇 가지 일이 발생할 수 있습니다. 라이브러리 호출이 아니라 데이터가 안전하기 위해 발생해야하는 순서를 설명하겠습니다.

파일을 작성하고 파일 끝에 추가 할 때 (일반 쓰기 모드) 파일의 마지막 블록을 메모리로 읽고 쓰기 데이터로 파일을 수정 한 다음 전체 블록을 다시 SD 카드에 씁니다. . 블록이 가득 찬 경우 파일 할당 테이블 (FAT)에서 새 블록을 찾아야합니다. 새 블록을 찾은 후에는 FAT를 업데이트해야합니다. 읽기-수정-쓰기주기입니다. 파일을 다 사용한 경우 루트 디렉토리의 파일 속성 (예 : 파일 길이)을 업데이트해야합니다. 이로 인해 또 다른 읽기-수정-쓰기주기가 발생합니다.

쓰기 시간 최소화

  • 섹터를 작성할 때 파일이 이미 데이터를 보유하고 있는지 확인하십시오. 큰 파일로 시작하여 데이터를 추가하는 대신 데이터를 덮어 쓰면 SD 카드 섹터 쓰기가 완료되는 즉시 데이터가 안전합니다. 이런 식으로 1 ~ 2 개의 읽기-수정-쓰기주기를 제거 할 수 있습니다. 내 시작 코드는 SD 카드가 가득 찰 때까지 섹터 단위로 파일에 0을 쓴 다음 파일의 시작 부분으로 되감습니다.

  • 정수 항목 수가 섹터에 맞도록 데이터 항목의 크기를 만드십시오. 귀하의 항목을 64 바이트로 올립니다. 이것은 비효율적이지만 두 섹터를 읽고 수정하고 쓸 필요가 없습니다.

  • 전체 섹터를 쓸 수있는 FSwrite 기능의 변형을 작성하십시오. 전체 섹터를 SRAM에 유지하면주기가 "읽기-수정-쓰기"에서 "수정-쓰기"로 바뀝니다.

PIC 및 SD 전원을 최대한 오래 유지하십시오

  • 큰 커패시터가 좋습니다. 470uF는 쓰기주기를 완료하기에 충분한 전력을 제공해야합니다.

  • 전원이 백업 커패시터의 전원을 빨아 들이지 않도록하십시오! 필요한 경우 다이오드를 추가하십시오.

전원이 부족할 때 알기

  • 큰 전원 공급 장치 캡은 SD 카드로 물건을 포장하는 데 10ms 이상을 제공하지만 행운을 누르지 마십시오. 마이크로 컨트롤러의 핀을 사용하여 전원이 여전히 양호한 지 확인하고 소스가 죽은 경우 쓰기를 시작하지 마십시오.

정보 주셔서 감사합니다. 매우 도움이됩니다. 나는 ... 나는 그것으로 무엇을 할 수 있는지 볼 수 있습니다
PICyourBrain

0을 모두 4GB 카드에 쓰는 데 얼마나 걸립니까? 오랜만이야 또한 전체 섹터에 대한 전체 쓰기를 허용하도록 fswrite 함수를 수정하기 위해 공유 할 수있는 코드 예제가 있습니까?
PICyourBrain

또한 파일에 0을 모두 쓰면. 실제 데이터의 끝 부분을 어떻게 추적합니까? 처음에 모든 데이터를 읽고 0의 문자열을 찾으십니까?
PICyourBrain

1
FAT16을 사용하는 경우 2GB로 제한됩니다. SD / MMC 카드에는 "블록 지우기"기능이 있으며 MDDFS 라이브러리에서는 구현되지 않은 것으로 보입니다. SD 카드 프로젝트에 독점 코드 라이브러리를 사용했기 때문에 코드 예제를 공유 할 수 없습니다. 마지막 데이터를 찾으려면 데이터 레코드에서 0을 모두 찾을 때까지 읽어야합니다. 귀하의 데이터 레코드가 모두 0 일 수 있다면 0이 아닌 데이터 또는 일부 구분 기호를 추가하는 것이 좋습니다.
W5VO

6

SD 카드 (또는 MMC, CompactFlash 등)에서 아직 언급되지 않은 한 가지 문제는 SD 카드가 호스트에 임의의 순서로 읽고 쓸 수있는 512 바이트 섹터의 간단한 모음으로 나타날 수 있지만 일반적으로 플래시 장치입니다. 528 바이트 페이지를 각각 32KB 인 그룹에 저장하고 지원되는 유일한 작업은 빈 페이지에 쓰거나 전체 그룹을 지우는 것입니다. 이 제한을 처리하기 위해 SD 카드의 컨트롤러는 테이블을 유지하여 논리 섹터를 실제 페이지에 맵핑 할 수있게합니다. 섹터 쓰기 요청이있을 때 컨트롤러는 칩 어딘가에 빈 페이지를 찾아 해당 섹터의 새 주소로 매핑을 업데이트합니다. 빈 페이지가 부족하거나 다른시기에 공급되는 경우,

이것의 중요성은 특정 논리 섹터에 쓰는 행위가 많은 논리 섹터의 데이터를 뒤섞을 필요가 있다는 것입니다. 이 과정에서 문제가 발생하면 카드에 쓰도록 요청 된 섹터뿐만 아니라 임의의 섹터가 손상 될 수 있습니다. 데이터 셔플 중 전원이 끊기면 작업 중 어느 부분이 완료되었고 어떤 부분이 완료되지 않았는지 파악할 수있는 방식으로 데이터 셔플 링 작업을 수행 할 수 있도록 올바른 SD 카드 컨트롤러를 설계해야합니다. 결과적으로 작업을 올바르게 완료 할 수 있습니다. 불행하게도, 할인점에서 수령 한 5 달러짜리 SD 카드가 어떤 점에서 좋은지 알 수있는 방법을 모르겠습니다.

확실하게, SD 카드가 완전히 완료되었다고하더라도 완료된 것으로보고 된 모든 쓰기 작업은 실제로 전원이 꺼진 상태에서도 살아남을 수 있습니다 (즉, 모든 작업이 쓰기 작업인지의 여부를 확인). 전원이 다시 공급 될 때 카드가 작동을 완료 할만큼 충분히 완료되었습니다. 이는 호스트 운영 체제가 일부 데이터를 수행하지만 의도 한 모든 데이터 쓰기를 수행하지 않아도 문제가 발생하지 않음을 의미하지는 않습니다. 그럼에도 불구하고 SD 카드가 "바겐 세일"의 끝을 지탱할 수없는 경우 정전으로 인한 데이터 손실을 방지하기 위해 호스트 측 소프트웨어에서 수행 할 수있는 작업이 없음을 명심해야합니다.


그것은 매우 통찰력있는 의견입니다.
프레드 바셋

5

또한 SD의 데이터를 읽을 때마다 올바른지 확인하기 위해 일종의 체크섬 을 사용하는 것이 좋습니다 .


3

아마도 이 슈퍼 커패시터 스파크 펀에서이 문제를 해결할 것입니다.


2
PIC의 메모리를 보유하지만 최대 10uA의 정격 전류를 갖습니다. 나는 당신이 그렇게 많은 전류로 SD 카드에 쓸 수 있다고 생각하지 않습니다.
W5VO

1
그래도 개념은 좋습니다. 빠른 검색 결과 일리노이 커패시터 ( illinoiscapacitor.com )에는 최대 8F의 슈퍼 커패시터가 있으며 최대 4A의 전류를 지원할 수 있습니다. 이들 중 하나 또는 배터리를 추가하면 마이크로가 쓰기를 끝내고 종료 할 수있는 기회를 제공합니다 주 전원이 고장난 경우에 좋습니다.
광자

3

쓰기 절차가 자주 발생하지 않기 때문에 데이터가 기록 될 때마다 파일을 열고 데이터를 쓴 다음 파일을 닫을 수 있습니다. 이 방법으로 시간이 지남에 따라 SD 카드가 손상됩니까?

모든 엔지니어링 문제와 마찬가지로 여기에서 트레이드 오프를 처리해야합니다.

데이터가 전혀 손실되지 않는 것이 중요합니까? 그런 다음 위의 작업을 수행합니다. 카드를 망치는 것보다 데이터를 잃으면 더 많은 피해를 입을 수 있습니다. 카드가 손상되기 전에 해당 작업을 몇 번 수행 할 수 있는지 확인하기 위해 일종의 스트레스 테스트를 수행 할 수 있습니다. 카드를 사용할 수 없을 때까지 시간이 오래 걸리고 카드를 교체하기 전에 허용되는 시간 인 것 같으면 해당 경로를 사용하겠습니다.


1

데이터 만 저장하려면 파일 시스템이 필요하지 않습니다. 쓰기 작업은 블록 주소를 선택하여 SPI를 통해 직접 수행됩니다. 이렇게하면 쓰기 시간이 최소화되고 데이터가 손상 될 위험이 있습니다.

정전 및 운이없는 경우에도 단 하나의 항목 만 손실됩니다 (일부 시스템에서는 허용 가능).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.