문제

내가 개발중인 Linux 임베디드 애플리케이션에서는 때때로 발생하는 일부 이벤트를 기록해야합니다. 이 레코드는 MTD 플래시 장치에 저장되며 일단 작성한 후에는 변경하거나 효율적인 검색을 수행 할 필요가 없지만 데이터를 사용자에게 다시 표시하려면 읽기 액세스가 필요합니다. 큰 문제는 적절한 셧다운 시퀀스없이 언제든지 전원이 사라질 수 있다는 것입니다. 이러한 사건이 발생하는 빈도는 매우 느리게 (일/주), 그 중 일부는 한 번에 발생합니다. 각 이벤트에 대해 저장할 데이터는 날짜, 시간, 몇 개의 짧은 텍스트 문자열 및 여러 정수입니다.

현재 DB 파일이 때때로 손상되기 때문에 JFFS2 및 SQLITE를 기반으로 한 솔루션을 상속했습니다. 이런 일이 발생하면 전체 파일을 읽을 수없고 JFFS2의 버그로 인한 것인지 또는 SQLITE 또는 플래시 섹터가 나쁜지 또는 잘못된 시간에 전원이 절단되었는지 이해할 방법이 없습니다.

이런 종류의 문제를 더 잘 해결하는 데 도움이되는 파일 시스템/라이브러리의 라이브러리 또는 조합이 있습니까? 아니면 CSV와 같은 형식의 텍스트 파일 만 사용해야합니까?

도움이 되었습니까?

해결책

우리는 NAND Flash의 YAFFS2 파티션에 평범한 오래된 syslogd를 사용하고 있습니다. 메시지가 로거로 전송되고 (<100ms) 즉시 전원이 제거되고 로그가 손상되지 않은 것으로 보입니다.

이것은 모든 것이 항상 디자인, 마음에 의해 일관성이 있다는 것을 알고있는 것을 알고있는 것이 아니라 관찰을 기반으로합니다.

다른 팁

나는 임베드 시스템에 대한 전문가는 아니지만 CSV가 가장 좋을 것이라고 생각합니다. 기본적으로 손상 될 수 없거나 그렇다면 오류를 쉽게보고 수동으로 수정할 수 있습니다 (새 라인 또는 라인을 제거). 나는 부패 문제가 많은 임베드 시스템으로부터 데이터를 수신하기 위해 노력하고 있습니다 (부분적으로는 시스템 및 부분적으로 전화선 전송 중). CSV 유형 형식 인 경우 전체 데이터 세트를 손상시키는 대신 오류를 찾아 제거하거나 수정할 수 있습니다.

시스템 내에서 검색 할 필요가 없다면 CSV는 완벽하게 작동합니다.

이 목적을 위해 정확하게 설계된 많은 임베디드 파일 시스템 (지방 호환되지 않음)이 있습니다. 나는 결코 사용하지 않았기 때문에 제안 할 수는 없지만 여기 Google에서 뭔가. 나는 당신이 더 많이 파낼 수 있다고 확신하고, 여기 누군가가 더 많은 정보를 제공 할 수 있기를 바랍니다. GPL 기반이있을 수 있습니다. 다른 파일 시스템의 비교는 다음과 같습니다 여기

두 개의 CSV/텍스트 파일. 시스템이 다시 시작될 때마다 새 쌍을 시작하십시오. 각 이벤트를 첫 번째 파일에 쓰고 파일을 플러시하고 저장하고 레코드를 두 번째 파일에 쓰고 다시 플러시합니다.

이런 식으로, 첫 번째 쓰기 중에 충돌하면 두 번째 사본의 모든 데이터가 (해당 쓰기까지) 여전히 존재합니다.

플러시가 Clib 버퍼 플러시뿐만 아니라 전체 파일 시스템 플러시인지 확인하십시오.

파일을 별도의 파일 시스템에 배치 할 수도 있습니다. 필요한 것보다 공간을 예약하면 프로세스 속도를 높이는 데 도움이 될 수 있습니다.

어떤 시설을 이용할 수 있습니까? 최선의 선택은 종종입니다 외부 리소스에 로그인하고 예를 들어 Syslog, SNMP, 원시 소켓 또는 직렬 포트를 통해. 이를 통해 장치 자체의 불쾌한 상태로부터 로그를 보호합니다.

내부적으로 로그를 저장 해야하는 경우, 임베디드 장치에서는 일반 텍스트, 인간이 읽을 수있는 파일이 최상의 옵션이라고 생각했습니다. "쓰기/플러시"사이클은 빠르며,이를 유지하기 위해 도구가 필요하지 않으며 실시간으로 모니터링 할 수 있습니다. 파일 크기가 문제 인 경우 포맷 된 텍스트가 아닌 정수로 타임 스탬프 할 수 있으며 숫자 "이벤트 ID"를 사용하여 각 로그를 약화 할 수 있습니다 (인스턴스 별 데이터 만 텍스트로 남겨 둡니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top