C Library pour transformer un flash SPI physique en un nombre arbitraire de tampons circulaires logiques. L'interface entre SFCB et SPI Core est réalisée en tant que mémoire partagée.
-D à l'heure de la compilation| Version | Date | Source | Modifier le journal |
|---|---|---|---|
| dernier | dernier.zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitLe makefile construit le référentiel avec un test unitaire:
$ 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 partie de la bibliothèque elle-même peut être construite avec:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o La mémoire flash W25Q16JV a été sélectionnée via Compile Switch -D .
Pour exécuter l'appel de test unitaire:
$ ./test/sfcb_testInitialise la poignée commune SFCB et affecte la mémoire.
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| cb | Mémoire de file d'attente de tampon circulaire |
| CBLEN | Max. Nombre de files d'attente CB |
| spice | Tampon d'échange de noyau SFCB / SPI |
| mélanger | Taille du tampon SPI en octets |
Codes de sortie
Crée une nouvelle file d'attente de tampon circulaire indépendante logique dans le flash SPI.
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| magie | Numéro magique, doit être unique pour chaque file d'attente sur le même flash SPI |
| elemsizebyte | Taille de la charge utile en octet, en tête / pied de page |
| numelems | Nombre minimal d'éléments requis dans la file d'attente, arrondi au prochain secteur complet |
| cbid | ID assigné à cette file d'attente, nécessaire pour toutes les autres demandes |
Codes de sortie
Vérifie si SFCB traite une autre demande.
int sfcb_busy ( t_sfcb * self );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
Codes de sortie
Dans la dernière demande, s'est terminée par une erreur.
int sfcb_isero ( t_sfcb * self );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
Codes de sortie
Acquiert toutes les informations de file d'attente de SPI Flash. Nécessaire après avoir appelé SFCB_ADD pour mettre à jour toutes les informations de gestion.
int sfcb_mkcb ( t_sfcb * self );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
Codes de sortie
Ajoutez les octets à l'élément de file d'attente de tampon circulaire sélectionné actuel.
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| cbid | file d'attente de tampon circulaire pour interagir |
| *données | pointeur pour écrire des données |
| Len | Nombre d'octets dans * Données |
Codes de sortie
La force d'écriture du pied de page sinon tous les octets disponibles dans l'élément de file d'attente de tampon circulaire est occupé par ADD. Le pied de page est utilisé pour détecter une écriture complète d'un élément. La recommandation générale est d'appeler sfcb_add_done à chaque fois que vous avez terminé la rédaction de l'élément de file d'attente.
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| cbid | file d'attente de tampon circulaire pour interagir |
Codes de sortie
Acquérir le nombre actuel d'octets écrits dans les files d'attente. Permet l'écriture d'objets de données à plusieurs étapes à l'élément de tampon circulaire.
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| cbid | file d'attente de tampon circulaire pour interagir |
Écrivez le nombre d'octets de l'élément de file d'attente.
Lisez le dernier élément de file d'attente écrit.
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| cbid | file d'attente de tampon circulaire pour interagir |
| *données | pointeur pour lire les données |
| Len | Nombre d'octets dans * Données |
| * Elemid | numéro d'élément de file d'attente |
Codes de sortie
Données brutes lues à partir de Flash.
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| ADR | Adresse de mémoire SPI Flash |
| *données | pointeur pour lire les données |
| Len | Nombre d'octets dans * Données |
Codes de sortie
Services Demande de couche de tampon circulaire ainsi que le traitement des paquets SPI. Cette fonction doit être appelée dans une matière temporelle. Le transfert de paquets de données SPI doit utiliser un flux de données basé sur ISR.
void sfcb_worker ( t_sfcb * self );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
Aucun.
Par SFCB_Worker a créé la taille des paquets SPI en octets.
uint16_t sfcb_spi_len ( t_sfcb * self );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
Nombre d'octets de paquet SPI.
Obtenez la taille totale du type de flash compilé SFCB .
uint32_t sfcb_flash_size ( void );Taille en octets.
Obtenez le nombre d'éléments le plus élevé de file d'attente de tampon circulaire Cbid .
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| Arg | Description |
|---|---|
| soi | Élément de stockage SFCB |
| cbid | file d'attente de tampon circulaire pour interagir |
Numéro d'élément le plus élevé.
| Valeur | Description |
|---|---|
| SFCB_OK | Accepté |
| Sfcb_e_no_flash | Aucun type de flash sélectionné, utilisez -D |
| Sfcb_e_mem | pas assez de mémoire attribuée dans sfcb_init |
| Sfcb_e_flash_full | La capacité de flash dépassait |
| Sfcb_e_wkr_bsy | sfcb_worker est occupé, attendez |
| Sfcb_e_no_cb_q | cbID d'attente de tampon circulaire n'existe pas |
| Sfcb_e_wkr_req | Données de gestion des tampons circulaires non préparés pour la demande, exécutez sfcb_mkcb |
| Sfcb_e_cb_q_mty | Aucune entrée valide dans la file d'attente |
Le SFCB prend en charge un nombre arbitraire de files d'attente de tampons circulaires. Chaque tampon circulaire commence à l'adresse flash SPI libre la plus basse. L'architecture flash nécessite une données dédiée claire - ce que l'on appelle le secteur effacer . Grâce à cette limitation, il faut être attribué au moins deux secteurs. Sinon, l'écrasement du premier élément écrit entraînerait-il une file d'attente de tampon circulaire complète sans garder les entrées précédentes. Chaque nouvelle entrée est marquée par le plus haut 32 bits IDNUM et MagicNum . Le Magicnum assure la détection d'un élément de file d'attente de tampon circulaire occupé.
Une organisation de mémoire exemplaire pour la charge utile de 240 octets et 32 éléments (= deux secteurs) montre la figure ci-dessous: