FROGFS (빠른 읽기 전용 일반 목적 파일 시스템)는 내장 된 용도로 설계된 읽기 전용 파일 시스템입니다. ESP-IDF를 포함한 CMAKE 프로젝트와 함께 쉽게 사용할 수 있습니다. 공간을 절약 할 수있는 필터가 내장되어 있습니다. frogfs-clockwise-demo 의 파일은 기본 필터를 사용하여 약 절반으로 줄어 듭니다. 예제 저장소에 대한 링크는 다음과 같습니다.
변환 필터는 다음과 같습니다.
압축 필터에는 다음이 포함됩니다.
변환 필터는 런타임 비용이 발생하지 않는 컴파일 타임 작업으로, 압축 필터는 런타임 감압 비용이 발생할 것으로 예상 됩니다.
이것은 HTTP 서버, Zlib (deflate), brotli (br) 또는 gzip compressed 파일의 것을 의미합니다. 이로 인해 처리 시간과 대역폭이 절약됩니다. 그러나 일부 브라우저는 다른 HTTP (HTTP) 만 Brotli 컨텐츠를 허용하지 않는다고 조심하십시오.
이 구성 요소를 ESP-IDF와 함께 사용하려면 프로젝트 디렉토리 실행 내에서
idf.py add-dependency jkent/frogfs
CMAKE 기능을 사용하여 프로젝트 바이너리에 FORGF를 포함시킵니다.
target_add_frogfs(<target> [CONFIG yaml] [NAME name])
구성이 지정되지 않으면 frogfs.yaml 사용됩니다. 이름이 지정되지 않은 경우 frogfs 로 기본값을받습니다.
ESP-IDF의 예로 프로젝트의 toplevel cmakelists.txt :
cmake_minimum_required ( VERSION 3.16)
include ( $ENV{IDF_PATH} /tools/cmake/project.cmake)
project (my_project)
target_add_frogfs( ${PROJECT_NAME} .elf)C에서는이 두 가지 글로벌 기호가 응용 프로그램에서 사용할 수 있습니다.
extern const uint8_t frogfs_bin [];
extern const size_t frogfs_bin_len ; 이진을 응용 프로그램과 연결하지 않고 바이너리를 만들 수있는 옵션이 있습니다. 대상 generate_${name} 과 함께 바이너리를 출력하기 위해 CMAKE 함수가 제공됩니다.
declare_frogfs_bin(path [CONFIG yaml] [NAME name])
구성이 지정되지 않은 경우 frogfs.yaml 이 사용됩니다. 이름이 지정되지 않은 경우 frogfs 사용됩니다.
다음은 Toplevel cmakelists.txt에 추가 할 수있는 예입니다.
set (FROGFS_NAME frogfs)
declare_frogfs_bin( NAME ${FROGFS_NAME} )
idf_component_get_property(main_args esptool_py FLASH_ARGS)
idf_component_get_property(sub_args esptool_py FLASH_SUB_ARGS)
esptool_py_flash_target( ${FROGFS_NAME} -flash " ${main_args} " " ${sub_args} " ALWAYS_PLAINTEXT)
esptool_py_flash_to_partition( ${FROGFS_NAME} -flash storage ${BUILD_DIR} /CMakeFiles/ ${FROGFS_NAME} .bin)
add_dependencies ( ${FROGFS_NAME} -flash generate_ ${FROGFS_NAME} _bin) idf.py frogfs-flash 를 실행하여 플래시 프로세스를 호출 할 수 있습니다.
FORGFS는 YAML 구성 파일을 기대합니다. 정의, 수집 및 필터의 세 가지 섹션이 있습니다. 수집을 제외한 모든 것은 선택 사항입니다.
정의는 변수 정의의 목록 또는 덕트입니다. 사전 정의 된 변수는 $cwd 와 $frogfs 입니다. ${ENV:varname} 구문으로 환경 변수를 참조 할 수도 있습니다.
'Gathers'업 파일과 디렉토리를 수집하여 Frogfs 루트에 배치하십시오. 길의 글로벌 패턴은 경로의 '베이스 이름'구성 요소에서 허용됩니다. 소스를 지정하는 3 가지 방법이 있습니다. 그들은 문자열, 목록 또는 사전입니다. 문자열이라면 경로가 루트 디렉토리가됩니다. 목록이면 경로는 순서대로 병합되어 루트 디렉토리가됩니다. Dict가 사용되면 경로는 선택한 대상으로 병합됩니다. 빈 문자열은 루트 디렉토리입니다. 소스와 대상 모두에 대해 변수가 확장됩니다.
필터를 사용하면 파일이 통합되기 전에 파일에서 후 처리 할 수 있습니다. 필터는 DICT의 목록 또는 덕트입니다. 동사 목록에 글로벌 패턴이 있습니다. 배변이 확장되고 모든 패턴은 각 파일 또는 디렉토리에 대해 상단으로 평가됩니다. 변환이 먼저 적용된 다음 파일을 캐싱하기 전에 선택적인 최종 압축입니다.
동사는 내림차순으로 적용됩니다. no 하려면 A 변환 또는 compress 동사를 접두사 할 수 있습니다. 빌드 캐시의 파일을 캐시하는 포함 및 cache (기본값)를 방지하는 discard 몇 가지 특별한 동사가 있습니다. 예를 들어 frogfs_example.yaml 참조하십시오.
Bare API 또는 IDF를 사용할 때 Bare API 위에 구축되는 VFS 인터페이스가 있습니다. 휴대용 및 친숙한 posix 및 stdio C 기능을 사용하므로 IDF 프로젝트에서 VFS 인터페이스를 사용해야합니다. 그러나 동시에 혼합 및 일치하는 것을 막는 것은 없습니다.
구성은 frogfs_config_t 구조를 정의하고 그것을 frogfs_init 에 전달합니다. 파일 시스템을 지정하는 두 가지 방법 :
addr 변수를 사용한 메모리 주소 : frogfs_config_t frogfs_config = {
. addr = frogfs_bin ,
};part_label 문자열을 사용한 파티션 이름 : frogfs_config_t frogfs_config = {
. part_label = "storage" ,
}; 그런 다음 frogfs_config frogfs_init 함수로 전달하고 반환 변수를 확인하는 문제입니다.
frogfs_fs_t * fs = frogfs_init ( & frogfs_config );
assert ( fs != NULL ); 완료되면 모든 파일 핸들이 닫히면 frogfs_deinit 에 전화 할 수 있습니다.
frogfs_deinit ( fs ); VFS 인터페이스는 유사한 초기화 방법을 가지고 있습니다. frogfs_vfs_conf_t 구조를 정의합니다.
frogfs_fs_t 인스턴스 frogfs_vfs_conf_t frogfs_vfs_conf = {
. base_path = "/frogfs" ,
. fs = fs ,
. max_files = 5 ,
};
frogfs_vfs_register ( & frogfs_vfs_conf );후드 아래에는 진입 오프셋으로 DJB2 경로 해시로 구성된 해시 테이블이있어 이진 검색 알고리즘을 사용하여 빠른 조회를 허용합니다. 루트 항목을 제외한 모든 항목에는 부모 로케이터 오프셋이 있습니다. 디렉토리 항목에는 차별화 된 오프셋 목록이 어린이 항목에 대한 항목 목록이 있습니다.
FROGFS 바이너리는 응용 프로그램에 포함되거나 메모리 매핑 된 I/O를 사용하여 액세스 할 수 있습니다. 데이터 주소 공간에 존재하는 파일 시스템 바이너리없이 FORFS를 사용하는 것은 (현재) 불가능합니다.
FROGFS 파일 시스템의 생성은 단일 도구 인 tools/mkfrogfs.py 로 처리됩니다. tools 디렉토리의 변환을 사용하거나 프로젝트 루트 디렉토리에서 tools 디렉토리를 만들어 자신의 변환을 추가 할 수 있으며, filename은 transform- 으로 시작하고 .js 또는 .py 로 끝납니다. 변환 도구는 stdin에서 데이터를 가져 와서 stdout에서 출력을 생성합니다.
변형과 동반자 모두 인수를 받아 들일 수 있습니다. 예를 들어 frogfs_example.yaml 참조하십시오.
Frogfs는 Chris Morgan (Chris Morgan)의 Libesphttpd Project (MPL 2.0)에서 나뉘어졌으며, 이것은 Jeroen Domburg (Sprite_TM)의 Libesphttpd (Beer-Ware)의 포크입니다. 이 프로젝트는 그들 없이는 결코 존재하지 않았을 것입니다.
이 프로젝트의 모든 기고자들에게 감사합니다!