Biblioteca C para transformar um flash físico em um número arbitrário de buffers circulares lógicos. A interface entre SFCB e SPI Core é realizada como memória compartilhada.
-D no momento da compilação| Versão | Data | Fonte | Alterar log |
|---|---|---|---|
| mais recente | mais recente.zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitO Makefile constrói o repositório com o teste de unidade:
$ make
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV ./test/sfcb_test.c -o ./test/sfcb_test.o
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV -DSFCB_PRINTF_EN ./spi_flash_cb.c -o ./test/sfcb.o
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV ./test/spi_flash_model/spi_flash_model.c -o ./test/spi_flash_model.o
gcc ./test/sfcb_test.o ./test/sfcb.o ./test/spi_flash_model.o -Wall -Wextra -I. -lm -o ./test/sfcb_testA parte da biblioteca em si pode ser construída com:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o A memória flash w25q16jv foi selecionada via interruptor de compilação -D .
Para executar a chamada de teste de unidade:
$ ./test/sfcb_testInicializa o identificador comum do SFCB e atribui memória.
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| cb | Memória da fila de tampão circular |
| CBLEN | máx. Número de filas de CB |
| spi | Buffer de troca de núcleo SFCB / SPI |
| Spilen | Tamanho do tampão SPI em bytes |
Códigos de saída
Cria uma nova fila de tampão circular independente lógico no flash spi.
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| Magicnum | Número mágico, precisa ser único para cada fila no mesmo flash spi |
| elemsizebyte | Tamanho da carga útil em byte, cabeçalho/rodapé causa |
| NUMELEMS | Número mínimo de elementos necessários na fila, arredondados para o próximo setor completo |
| cbid | ID atribuído a esta fila, necessária para todas as solicitações adicionais |
Códigos de saída
Verifica se o SFCB está processando outra solicitação.
int sfcb_busy ( t_sfcb * self );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
Códigos de saída
No último pedido terminou com erro.
int sfcb_isero ( t_sfcb * self );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
Códigos de saída
Adquire todas as informações da fila do SPI Flash. Necessário depois de ligar para o SFCB_ADD para atualizar todas as informações de gerenciamento.
int sfcb_mkcb ( t_sfcb * self );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
Códigos de saída
Anexe bytes ao elemento atual da fila de tampão circular selecionado.
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| cbid | fila de tampão circular para interagir |
| *dados | ponteiro para escrever dados |
| Len | Número de bytes em *dados |
Códigos de saída
Força escrever o rodapé , se não todos os bytes disponíveis no elemento de fila de tampão circular, são ocupados por add. O rodapé é usado para detectar uma redação completa de um elemento. A recomendação geral é ligar para sfcb_add_done toda vez que você concluiu a escrita do elemento da fila.
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| cbid | fila de tampão circular para interagir |
Códigos de saída
Adquira o número atual de bytes escritos para filas. Ativa a gravação do objeto de dados de vários estágios no elemento buffer circular.
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| cbid | fila de tampão circular para interagir |
Escreva a contagem de bytes do elemento da fila.
Leia o último elemento da fila escrita de volta.
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| cbid | fila de tampão circular para interagir |
| *dados | ponteiro para ler dados |
| Len | Número de bytes em *dados |
| *Elemid | Número do elemento da fila |
Códigos de saída
Dados brutos lidos no flash.
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| ADR | Endereço de memória flash spi |
| *dados | ponteiro para ler dados |
| Len | Número de bytes em *dados |
Códigos de saída
Serviços Solicitação de camada de buffer circular e processamento de pacotes SPI. Esta função deve ser chamada em uma matéria baseada no tempo. A transferência de pacotes de dados SPI deve usar um fluxo de dados baseado em ISR.
void sfcb_worker ( t_sfcb * self );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
Nenhum.
Por SFCB_Worker criou o tamanho do pacote SPI em bytes.
uint16_t sfcb_spi_len ( t_sfcb * self );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
Contagem de bytes do pacote SPI.
Obtenha o tamanho total do tipo flash compilado SFCB .
uint32_t sfcb_flash_size ( void );Tamanho em bytes.
Obtenha o número mais alto de elemento da fila de tampão circular cbid .
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| Arg | Descrição |
|---|---|
| auto | Elemento de armazenamento SFCB |
| cbid | fila de tampão circular para interagir |
Número do elemento mais alto.
| Valor | Descrição |
|---|---|
| Sfcb_ok | Aceito |
| Sfcb_e_no_flash | Sem tipo de flash selecionado, use -D |
| SFCB_E_MEM | Memória insuficiente atribuída em sfcb_init |
| Sfcb_e_flash_full | Capacidade flash excedida |
| Sfcb_e_wkr_bsy | sfcb_worker está ocupado, espere |
| Sfcb_e_no_cb_q | fila de tampão circular cbID não existente |
| Sfcb_e_wkr_req | Dados de gerenciamento de buffers circulares não preparados para solicitação, execute sfcb_mkcb |
| Sfcb_e_cb_q_mty | Sem entradas válidas na fila |
O SFCB suporta um número arbitrário de filas de tampão circular. Cada tampão circular inicia no menor endereço de flash SPI gratuito. A arquitetura flash requer uma clara de dados dedicados - o chamado setor apagado . Através dessa limitação, precisa ser pelo menos dois setores alocados. Caso contrário, a substituição do primeiro elemento escrito resultaria em uma fila de tampão circular completa substituindo sem manter nenhuma entrada anterior. Cada nova entrada é marcada com o maior IDNUM e Magicnum mais altos. O MagicNum garante a detecção de um elemento de fila de tampão circular ocupado.
Uma organização exemplar de memória para 240 bytes e 32 elementos (= dois setores) mostra a figura abaixo: