
Neste exemplo, um arquivo chamado Networking é criado em root/config. Se o arquivo de configuração não existir, o Bonsai o criará e colocará a rede dentro dele. O diretório raiz é criado por padrão quando uma classe Bonsai é instanciada.
Bonsai bonsai;
bonsai.create_file( " root/config/networking " );O arquivo antigo_data é excluído, juntamente com seu conteúdo.
Bonsai bonsai;
bonsai.delete_file( " root/config/old_data " );Consulte a API completa para obter mais informações.
As contribuições são muito bem -vindas.
Confira como contribuir.
Uma vez escrito, um arquivo reside contiguamente em um limite de linha na memória flash. Um arquivo pode abranger várias linhas, desde que ele adere aos limites de tamanho de seus campos constituintes e que se encaixa na partição do flash de bonsai. Seus quatro primeiros campos são fixados em tamanho e compõem o cabeçalho do arquivo. O tamanho dos campos seguintes - e, portanto, o arquivo na íntegra - é derivado do cabeçalho. Os últimos três campos variam em tamanho e compõem o corpo da estrutura do arquivo. Notavelmente, um arquivo não armazena seu próprio endereço, pois o endereço de um arquivo é o endereço de seu primeiro membro.
| Tamanho da alça | Tamanho dos dados | Endereço pai | # de endereços infantis | Lidar | Dados | Endereços infantis |
|---|---|---|---|---|---|---|
| 1 byte | 2 bytes | 4 bytes | 1 byte | variável | variável | variável |
| Cabeçalho | Corpo | |||||
Consequentemente, a tabela acima é expressa no firmware como uma estrutura file_t .
typedef struct {
uint8_t handle_size; // the size of handle in bytes
uint16_t data_size; // the size of data in bytes
uint32_t parent_addr; // the address of this file's parent file
uint8_t num_child_addrs; // the number of children immediately descendant from this file
uint8_t *handle; // the handle or name of this file
uint8_t *data; // the actual data this file contains
uint32_t *child_addrs; // children addresses
/* ... */
} file_t ; O tamanho de qualquer arquivo pode ser expresso em termos de um file_t , assim:
handle_size + sizeof (handle_size) + // handle_size bytes plus one more for storing the size of handle_size
data_size + sizeof (data_size) + // same for data
sizeof (parent_addr) + // four bytes for the parent address
sizeof (num_child_addrs) + // one byte for storing the number of child addresses
(num_child_addrs * sizeof ( uint32_t )); // four bytes for every child address Após a inicialização, a Bonsai procurará um arquivo do sistema no início de sua partição flash. Se não houver, o Bonsai criará um e também um arquivo root. O arquivo root é, sem surpresa, o pai de todos os arquivos criados pelo usuário. Sua alça é root e é inicializada sem dados. O arquivo do sistema é um arquivo especial que reside uma linha antes do endereço do arquivo root. Não possui endereços de pais nem filhos e são usados para gerenciamento geral de memória. Crucialmente, o arquivo do sistema armazena o endereço do espaço livre (FSA), que é usado para determinar a localização do próximo arquivo a ser escrito (novamente, o arquivo do sistema armazena o FSA como dados, não como um endereço filho. O FSA não é um arquivo e tratá -lo como se não fosse sentido). Esse mecanismo funciona de modo que, quando um arquivo é escrito, o FSA é incrementado para o endereço da linha imediatamente após o final do arquivo escrito. Por outro lado, quando um arquivo é excluído, o FSA é diminuído no endereço da linha no qual o arquivo excluído estava localizado. Portanto, é o caso de que o tamanho máximo de um fragmento de memória é ROW_SIZE - 1 ou 255 bytes.
A classe Bonsai implementa um conjunto de métodos para leitura e escrita básicas de arquivos. Esses métodos não estão envolvidos com a travessia do caminho do arquivo. Em vez disso, eles interagem diretamente com os endereços e geralmente são chamados pela API de nível superior. Eles são:
void put ( file_t &file); // writes a file to flash memory
file_t get ( const uint32_t address); // retrieves a file from memory
void del ( const uint32_t address); // erases all rows containing a file
void mov ( const uint32_t dest, const uint32_t src); // moves a file from src to dest