C -Bibliothek, um einen physischen SPI -Blitz in eine willkürliche Anzahl logischer kreisförmiger Puffer zu verwandeln. Die Schnittstelle zwischen SFCB und SPI -Kern wird als gemeinsamer Speicher realisiert.
-D zur Kompilierungszeit| Version | Datum | Quelle | Protokoll ändern |
|---|---|---|---|
| letzte | neuest.zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitDas Makefile erstellt das Repository mit Unit -Test:
$ 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_testDer Bibliotheksteil selbst kann gebaut werden mit:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o Der Flash -Speicher W25Q16JV wurde über den Kompilierschalter -D ausgewählt.
So führen Sie den Unit -Testanruf aus:
$ ./test/sfcb_testInitialisiert SFCB Common Griff und weist Speicher zu.
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| CB | Rundpufferwartespeicher |
| cblen | Max. Anzahl der CB -Warteschlangen |
| spi | SFCB / SPI -Kernaustauschpuffer |
| Spilen | SPI -Puffergröße in Bytes |
Ausgangscodes
Erstellt eine neue logische unabhängige kreisförmige Pufferwarteschlange im SPI -Blitz.
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| Magicnum | Magische Nummer, muss für jede Warteschlange auf demselben SPI -Blitz eindeutig sein |
| Elemsizebyte | Nutzlastgröße in Byte, Header/Fußzeile Ursachen |
| Numelems | Minimale Anzahl der erforderlichen Elemente in der Warteschlange, abgerundet auf den nächsten vollständigen Sektor |
| CBID | Zugewiesene ID für diese Warteschlange, die für alle weiteren Anfragen erforderlich ist |
Ausgangscodes
Überprüft, ob SFCB eine andere Anfrage bearbeitet.
int sfcb_busy ( t_sfcb * self );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
Ausgangscodes
In der letzten Anfrage endete mit einem Fehler.
int sfcb_isero ( t_sfcb * self );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
Ausgangscodes
Erfasst alle Warteschlangeninformationen von SPI Flash. Benötigt nach dem Aufrufen von SFCB_ADD , um alle Verwaltungsinformationen zu aktualisieren.
int sfcb_mkcb ( t_sfcb * self );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
Ausgangscodes
Bytes an das aktuell ausgewählte Element für kreisförmige Pufferwarteschlangen anhängen.
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| CBID | Kreispufferwarteschlange zur Interaktion |
| *Daten | Zeiger zum Schreiben von Daten |
| Len | Anzahl der Bytes in *Daten |
Ausgangscodes
Erzwingen Sie das Schreiben der Fußzeile , wenn nicht alle verfügbaren Bytes im kreisförmigen Puffer -Warteschlangenelement durch Add belegt werden. Die Fußzeile wird verwendet, um ein vollständiges Schreiben eines Elements zu erkennen. Die allgemeine Empfehlung lautet, sfcb_add_done jedes Mal aufzurufen, wenn Sie das Warteschlangenelement schreiben.
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| CBID | Kreispufferwarteschlange zur Interaktion |
Ausgangscodes
Erwerben Sie die aktuelle Anzahl der geschriebenen Bytes an Warteschlangenelemente. Aktiviert mehrstufiges Datenobjekt, das das Schreiben von zirkulärem Pufferelement schreibt.
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| CBID | Kreispufferwarteschlange zur Interaktion |
Schreiben Sie die Byte -Anzahl des Warteschlangenelements.
Lesen Sie das letzte geschriebene Warteschlangenelement zurück.
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| CBID | Kreispufferwarteschlange zur Interaktion |
| *Daten | Zeiger zum Lesen von Daten |
| Len | Anzahl der Bytes in *Daten |
| *Elemid | Warteschlangenelementnummer |
Ausgangscodes
Rohdaten von Flash lesen.
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| ADR | SPI -Flash -Speicheradresse |
| *Daten | Zeiger zum Lesen von Daten |
| Len | Anzahl der Bytes in *Daten |
Ausgangscodes
Services Circular Puffer Layer -Anfrage sowie SPI -Paketverarbeitung. Diese Funktion sollte in einer zeitbasierten Angelegenheit aufgerufen werden. Die SPI -Datenpaketübertragung sollte einen ISR -basierten Datenfluss verwenden.
void sfcb_worker ( t_sfcb * self );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
Keiner.
Von SFCB_WERKER hat die SPI -Paketgröße in Bytes erstellt.
uint16_t sfcb_spi_len ( t_sfcb * self );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
Bytezahl von SPI -Paket.
Holen Sie sich die Gesamtgröße von SFCB -kompilierter Flash -Typ.
uint32_t sfcb_flash_size ( void );Größe in Bytes.
Holen Sie sich die höchste Elementnummer der kreisförmigen Pufferwarteschlange.
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| Arg | Beschreibung |
|---|---|
| selbst | SFCB -Speicherelement |
| CBID | Kreispufferwarteschlange zur Interaktion |
Höchste Elementnummer.
| Wert | Beschreibung |
|---|---|
| SFCB_OK | Akzeptiert |
| Sfcb_e_no_flash | Kein Flash -Typ ausgewählt, verwenden Sie -D |
| SFCB_E_MEM | Nicht genug Speicher, das in sfcb_init zugewiesen ist |
| Sfcb_e_flash_full | Flash -Kapazität überschritten |
| SFCB_E_WKR_BSY | sfcb_worker ist beschäftigt, warte |
| SFCB_E_NO_CB_Q | cbID Pufferwarte |
| Sfcb_e_wkr_req | Daten zur Anforderung, die nicht für Anforderung vorbereitet sind, führen Sie sfcb_mkcb aus |
| SFCB_E_CB_Q_MTY | Keine gültigen Einträge in der Warteschlange |
Das SFCB unterstützt eine willkürliche Anzahl von kreisförmigen Pufferwarteschlangen. Jeder kreisförmige Puffer beginnt mit der niedrigsten kostenlosen SPI -Flash -Adresse. Die Flash -Architektur erfordert eine dedizierte Daten, die so genannt wird - Sektorlösche . Durch diese Einschränkung muss mindestens zwei Sektoren zugewiesen werden. Andernfalls würde das Überschreiben des ersten schriftlichen Elements zu einem vollständigen Überschreiben von Rundpuffer -Warteschlangen führen, ohne frühere Einträge zu behalten. Jeder neue Eintrag ist mit dem inkrementierten höchsten 32 -Bit -Idnum und MagicNum gekennzeichnet. Das MagicNum sorgt für die Erkennung eines besetzten Kreispuffer -Warteschlangenelements.
Eine beispielhafte Speicherorganisation für 240 Bytes Nutzlast und 32 Elemente (= zwei Sektoren) zeigt die folgende Abbildung: