C Biblioteca para transformar un flash SPI físico en un número arbitrario de buffers circulares lógicos. La interfaz entre SFCB y SPI Core se realiza como memoria compartida.
-D en el tiempo de compilación| Versión | Fecha | Fuente | Registro de cambio |
|---|---|---|---|
| el último | último.zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitEl makfile construye el repositorio con la prueba unitaria:
$ 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_testLa parte de la biblioteca en sí se puede construir con:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o La memoria flash W25Q16JV se seleccionó mediante el interruptor de compilación -D .
Para ejecutar la llamada de prueba unitaria:
$ ./test/sfcb_testInicializa el mango común SFCB y asigna memoria.
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| CB | Memoria de cola de búfer circular |
| cblen | Max. Número de colas de CB |
| SPI | Buffer de intercambio de núcleo SFCB / SPI |
| espilado | Tamaño del búfer SPI en bytes |
Códigos de salida
Crea una nueva cola de búfer circular independiente lógica en el flash SPI.
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| mágico | Número mágico, debe ser único para cada cola en el mismo SPI Flash |
| ElemsizeByte | Tamaño de la carga útil en byte, cabeza de pie/pie de página |
| numelems | Número mínimo de elementos requeridos en la cola, redondeados al siguiente sector completo |
| cbid | ID asignado a esta cola, necesaria para todas las solicitudes adicionales |
Códigos de salida
Comprueba si SFCB está procesando otra solicitud.
int sfcb_busy ( t_sfcb * self );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
Códigos de salida
En la última solicitud terminó con error.
int sfcb_isero ( t_sfcb * self );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
Códigos de salida
Adquiere toda la información de la cola de SPI Flash. Necesario después de llamar a SFCB_ADD para actualizar toda la información de administración.
int sfcb_mkcb ( t_sfcb * self );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
Códigos de salida
Agregue bytes al elemento actual de cola de búfer circular seleccionado.
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| cbid | cola de búfer circular para interactuar |
| *datos | puntero para escribir datos |
| fila | número de bytes en *datos |
Códigos de salida
Force escribir el pie de página si no todos los bytes disponibles en el elemento de cola de búfer circular están ocupados por ADD. El pie de página se usa para detectar una escritura completa de un elemento. La recomendación general es llamar sfcb_add_done cada vez que completó la redacción del elemento de cola.
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| cbid | cola de búfer circular para interactuar |
Códigos de salida
Adquirir el número actual de bytes escritos al elemento de colas. Habilita la escritura de objetos de datos de varias etapas al elemento de búfer circular.
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| cbid | cola de búfer circular para interactuar |
Escriba el recuento de bytes del elemento de cola.
Lea el último elemento de cola escrito.
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| cbid | cola de búfer circular para interactuar |
| *datos | puntero para leer datos |
| fila | número de bytes en *datos |
| *Elemid | número de elemento de cola |
Códigos de salida
Datos sin procesar leídos de Flash.
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| ADR | Dirección de memoria flash SPI |
| *datos | puntero para leer datos |
| fila | número de bytes en *datos |
Códigos de salida
Servicios de solicitud de capa de búfer circular también procesamiento de paquetes SPI. Esta función debe llamarse en una materia basada en el tiempo. La transferencia de paquetes de datos SPI debe usar un flujo de datos basado en ISR.
void sfcb_worker ( t_sfcb * self );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
Ninguno.
Por SFCB_Worker creó el tamaño del paquete SPI en bytes.
uint16_t sfcb_spi_len ( t_sfcb * self );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
Byte Count of SPI Packet.
Obtenga un tamaño total de tipo de flash compilado SFCB .
uint32_t sfcb_flash_size ( void );Tamaño en bytes.
Obtenga el número de elemento más alto de cola de búfer circular CBid .
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| Argumento | Descripción |
|---|---|
| ser | Elemento de almacenamiento SFCB |
| cbid | cola de búfer circular para interactuar |
Número de elemento más alto.
| Valor | Descripción |
|---|---|
| SFCB_OK | Aceptado |
| SFCB_E_NO_FLASH | No hay tipo de flash seleccionado, use -D |
| Sfcb_e_mem | No hay suficiente memoria asignada en sfcb_init |
| SFCB_E_FLASH_FULL | Capacidad de flash superó |
| SFCB_E_WKR_BSY | sfcb_worker está ocupado, espera |
| SFCB_E_NO_CB_Q | cola de búfer circular cbID no existente |
| SFCB_E_WKR_REQ | Datos de gestión de búfer circular no preparado para solicitud, ejecute sfcb_mkcb |
| SFCB_E_CB_Q_MTY | No hay entradas válidas en la cola |
El SFCB admite un número arbitrario de colas de amortiguación circulares. Cada búfer circular comienza en la dirección flash SPI gratuita más baja. La arquitectura Flash requiere un claro datos dedicados, llamado borrado sectorial . A través de esta limitación, debe estar asignado al menos dos sectores. De lo contrario, la sobrescritura del primer elemento escrito daría como resultado una cola de búfer circular completa sobrescribir sin mantener entradas anteriores. Cada nueva entrada está marcada con el Idnum y MagicNum de 32 bits más alto incrementado. El MagicNum garantiza la detección de un elemento de cola de tampón circular ocupado.
Una organización de memoria ejemplar para la carga útil de 240 bytes y 32 elementos (= dos sectores) muestra la figura a continuación: