NVOL은 지속적인 플래시 레지스트리이며 종종 EEPROM 에뮬레이션이라고합니다. 레지스트리와 유사한 플래시 메모리에 색인 된 키/값 쌍을 읽고 쓰는 기본 API를 제공합니다. 키와 값이 모두 플래시로 저장되어 런타임 동안 레지스트리를 수정할 수 있음을 언급하는 것이 중요합니다. NVOL의 일부 기능에는 다음이 포함됩니다.
라이브러리는 데이터 저장을 관리하기위한 두 가지 옵션을 제공합니다. 옵션 1 : 변경 될 때마다 플래시 메모리에 항목을 즉시 저장합니다. 옵션 2 : RAM에 항목을 저장하고 주문시 플래시 메모리에 저장하십시오.
플래시 메모리의 단점은 단일 바이트로 지우거나 기록 할 수 없다는 것입니다. 플래시 메모리는 큰 블록으로만 지우고 쓸 수 있습니다. 일반적인 지우기 블록 크기는 4K 또는 8K 바이트 일 수 있습니다. NVOL의 경우 플래시 구현은 부분 쓰기를 지원해야하며, 비트가 "1"(지우린 상태)에서 "0"(프로그래밍 상태)으로 변경되는 한 지우기 블록이 여러 번 작성 될 수 있습니다.
플래시의 경우 페이지는 지워질 수있는 가장 작은 블록 크기로 간주됩니다. 각 부문은이 페이지 중 하나 이상으로 구성 될 수 있습니다.
첫 번째 부문은 처음에 지워졌습니다. 새로운 레지스트리 항목은 플래시에 순차적으로 추가됩니다. 항목이 업데이트되면 이전 항목은 유효하지 않은 것으로 표시되고 다음 사용 가능한 플래시 주소로 새 항목이 작성됩니다. 첫 번째 부문이 용량에 도달하면 모든 유효한 항목이 제 2 부문에 복사되고 첫 번째 부문이 지워집니다. 이 과정은 반복됩니다.
NVOL은 유효한 항목과 해당 위치를 플래시의 효율적으로 처리하고 추적합니다. 부문은 동적으로 관리됩니다.
매크로는 NVOL의 정적 인스턴스를 생성하는 데 사용할 수 있으며 API와 함께 사용할 수 있습니다. 선언의 예는 다음과 같습니다.
#define NVOL3_REGISTRY_START 0
#define NVOL3_REGISTRY_SECTOR_SIZE STORAGE_32K
#define NVOL3_REGISTRY_SECTOR_COUNT 2
#define REGISTRY_KEY_LENGTH 24
#define REGISTRY_VALUE_LENGT_MAX 224
NVOL3_INSTANCE_DECL(_regdef_nvol3_entry,
ramdrv_read, ramdrv_write, ramdrv_erase,
NVOL3_REGISTRY_START,
NVOL3_REGISTRY_START + NVOL3_REGISTRY_SECTOR_SIZE,
NVOL3_REGISTRY_SECTOR_SIZE,
REGISTRY_KEY_LENGTH, /*key_size*/
DICTIONARY_KEYSPEC_BINARY(6), /*dictionary key_type (24 char string)*/
53, /*hashsize*/
REGISTRY_VALUE_LENGT_MAX, /*data_size*/
0, /*local_size (no cache in RAM)*/
0, /*tallie*/
NVOL3_SECTOR_VERSION /*version*/
) ;
이것은 플래시 시작시 2 개의 32k 부문으로 NVOL을 만듭니다. 입력 헤더를 포함한 키의 총 크기는 256 바이트입니다. 이것은 요구 사항이 아니지만 정렬을 고려해야합니다. 조회 사전의 해시 크기는 53입니다. 또한이 인스턴스는 RAM ( local_size = 0 )에 값을 저장하지 않으므로 필요할 때 항상 플래시에서 읽습니다.
데모에서 NVRAMDRV 드라이버는 RAM의 플래시 메모리 에뮬레이션을 사용하는 데 사용됩니다. 액세스 함수는 RAMDRV_READ, RAMDRV_WRITE 및 RAMDRV_ERASE입니다.
이제 _REGDEF_NVOL3_ENTRY는 NVOL API와 함께 사용할 수 있습니다. NVOL API가 약간 초대되어 간단한 레지스트리 예제가 제공됩니다.
제공된 테스트 예제는 GitHub 코드 스페이스에서 컴파일 및 실행 될 수 있습니다. 이 repostory에 대한 코드 스페이스를 열고 종료하는 터미널에서 make 유형으로여십시오 (터미널이 열리지 않은 경우 ctrl + ` 사용하여 터미널을 열면). 이제 터미널에서 ./build/nvol 입력하여 NVOL 예제를 시작할 수 있습니다. 모든 명령은 Codespace의 터미널에서 실행할 수 있습니다.
예제 프로그램이 시작되면 명령 쉘이 열리고 다음을 표시합니다.
@navaro /workspaces/nvol (main) $ ./build/nvol
REG : : resetting _regdef_nvol3_entry
NVOL3 : : '_regdef_nvol3_entry' 0 / 255 records loaded
Navaro corshell Demo v 'Jan 16 2023'
use 'help' or '?' for help.
# >
먼저 레지스트리를 값으로 채우기 위해 간단한 스크립트를 실행합니다. 프롬프트 유형에서 :
source ./test/reg.sh
이것은 레지스트리에 값으로 채워야합니다. 레지스트리 유형을 테스트하기위한 모든 명령을 나열하려면 ? reg , 다음 목록을 표시해야합니다.
# >? reg
reg [key] [value]
regadd <key> <value>
regdel <key>
regerase
regstats
regtest [repeat]
# >
이제 Reg 명령을 사용하여 레지스트리를보고 업데이트 할 수 있습니다.
# >reg
player.age: Ancient
player.gender: Otherworldly
player.level: legendary
player.location: Mount Olympus
player.name: cool_cat
player.points: 9000
player.power: invisibility
player.species: Dragon
player.status: awakened
player.weapon: lightning bolt
test: 123
user.address: 123 Main St.
user.age: 30
user.children: 0
user.email: [email protected]
user.favorite_color: blue
user.gender: male
user.marital_status: single
user.name: John Smith
user.occupation: contributor
user.phone_number: 555-555-5555
21 entries found.
# >reg user.favorite_color yellow
OK
# >reg user.favorite_color
user.favorite_color: yellow
# >regdel user.gender
OK
# >reg player
player.age: Ancient
player.gender: Otherworldly
player.level: legendary
player.location: Mount Olympus
player.name: cool_cat
player.points: 9000
player.power: invisibility
player.species: Dragon
player.status: awakened
player.weapon: lightning bolt
10 entries found.
# >regstats
NVOL3 : : '_regdef_nvol3_entry' 20 / 255 records loaded
record : 256 recordsize
: 0x000000 1st sector version 0x0155 flags 0xaaaaffff
: 0x010000 2nd sector version 0x0000 flags 0xffffffff
: 0x010000 sector size
: 20 loaded
: 20 inuse
: 2 invalid
: 0 error
: 640 lookup table bytes
: 53 dict hash size
: dict hash - max 2, empty 34, used 19
이 명령은 모두 src/registry/registrycmd.c 에서 구현됩니다. 구현은 직관적이고 자기 설명 적이며 더 이상의 설명이 필요하지 않아야합니다.
쉘은 그 자체로 프로젝트이지만 시연 목적 으로이 예에만 포함되어 있습니다. 확장하기 쉽습니다. 사용 ? 이 예제에 구현 된 전체 명령 목록을 보려면
레지스트리가 문자열을 사용하여 항목을 색인화하는 경우 문자열 테이블은 정수 값을 사용합니다. 이 접근법은 RAM 자원이 적습니다.
이 예에는 문자열 테이블을 값으로 채우는 스크립트도 있습니다. 프롬프트 유형에서 :
source ./test/strtab.sh
다시, 우리는 이제 간단한 명령으로 문자열 테이블을 나열 할 수 있습니다.
# >strtab
0000 ENGLISH
0001 The end of the world is our playground.
0002 The company is family. The family is the company.
0003 Escape the mundane. Embrace the extraordinary.
0004 Work hard, live easy.
0005 The future is now. Join us.
0006 There is no I in team. But there is in severance.
0007 We're not just a company. We're a movement.
0008 Success is a journey, not a destination.
0009 Innovation starts with you.
0010 Welcome to the beginning of something great.
0100 DUTCH
0101 Het einde van de wereld is onze speeltuin.
0102 Het bedrijf is familie. De familie is het bedrijf.
0103 Ontsnap aan het alledaagse. Omarm het buitengewone.
0104 Hard werken, makkelijk leven.
0105 De toekomst is nu. Doe met ons mee.
0106 Er is geen ik in team. Maar wel in ontslagvergoeding.
0107 We zijn niet alleen een bedrijf. We zijn een beweging.
0108 Succes is een reis, geen bestemming.
0109 Innovatie begint bij jou.
0110 Welkom bij het begin van iets groots.
0999 test
23 entries found.
# >
레지스트리와 마찬가지로 문자열 테이블 예제는 문자열 대체 라이브러리 자체로 등록되어 <>로 구분 된 인덱스 값을 문자열 테이블의 문자열로 바꿉니다. 예를 들어:
# >echo "<1>"
The end of the world is our playground.
# >
데모는 RAM의 플래시에 에뮬레이션 드라이버를 사용합니다. 이것은 "CRC/DRIVERS/RAMDRV.H/C"로 구현합니다.
같은 디렉토리에서 실제 플래시 칩의 샘플 드라이버는 "spiflash.h/c"파일에 제공됩니다. 이것은 Chibios/Hal SPI 드라이버를 사용하여 구현되었으며 NVOL을 자신의 플랫폼으로 포팅하기에 좋은 출발점이되어야합니다.