C Pustaka untuk mengubah flash SPI fisik menjadi sejumlah penyangga bundar logis sewenang -wenang. Antarmuka antara SFCB dan Core SPI direalisasikan sebagai memori bersama.
-D pada waktu kompilasi| Versi | Tanggal | Sumber | Ubah log |
|---|---|---|---|
| terbaru | terbaru.zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitMakefile membangun repositori dengan tes unit:
$ 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_testBagian perpustakaan itu sendiri dapat dibangun dengan:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o Memori flash W25Q16JV dipilih melalui sakelar kompilasi -D .
Untuk menjalankan panggilan tes unit:
$ ./test/sfcb_testMenginisialisasi pegangan umum SFCB dan memberikan memori.
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| CB | Memori antrian buffer bundar |
| Cblen | Max. Jumlah antrian CB |
| SPI | SFCB / SPI Core Exchange Buffer |
| Spilen | Ukuran buffer SPI dalam byte |
Kode keluar
Membuat antrian buffer sirkular independen logis baru dalam flash SPI.
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| Magicnum | Nomor ajaib, harus unik untuk setiap antrian di flash SPI yang sama |
| ElemsizeByte | Ukuran muatan dalam byte, header/footer penyebab |
| numelems | Jumlah minimal elemen yang diperlukan dalam antrian, dibulatkan ke sektor penuh berikutnya |
| cbid | ID yang ditugaskan untuk antrian ini, diperlukan untuk semua permintaan lebih lanjut |
Kode keluar
Periksa apakah SFCB memproses permintaan lain.
int sfcb_busy ( t_sfcb * self );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
Kode keluar
Dalam permintaan terakhir berakhir dengan kesalahan.
int sfcb_isero ( t_sfcb * self );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
Kode keluar
Memperoleh semua informasi antrian dari SPI Flash. Diperlukan setelah menelepon SFCB_ADD untuk memperbarui semua informasi manajemen.
int sfcb_mkcb ( t_sfcb * self );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
Kode keluar
Tambahkan byte ke elemen antrian buffer sirkular yang dipilih saat ini.
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| cbid | antrian buffer melingkar untuk berinteraksi |
| *data | Pointer untuk menulis data |
| Len | Jumlah byte dalam *data |
Kode keluar
Paksa Menulis footer jika tidak semua byte yang tersedia dalam elemen antrian buffer melingkar ditempati oleh ADD. Footer digunakan untuk mendeteksi tulisan lengkap elemen. Rekomendasi umum adalah menghubungi sfcb_add_done setiap kali ketika Anda menyelesaikan penulisan elemen antrian.
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| cbid | antrian buffer melingkar untuk berinteraksi |
Kode keluar
Memperoleh jumlah byte tertulis saat ini untuk elemen antrian. Mengaktifkan penulisan objek data multistage ke elemen buffer melingkar.
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| cbid | antrian buffer melingkar untuk berinteraksi |
Tulis Hitungan Byte dari Elemen Antrian.
Baca elemen antrian tertulis terakhir kembali.
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| cbid | antrian buffer melingkar untuk berinteraksi |
| *data | penunjuk untuk membaca data |
| Len | Jumlah byte dalam *data |
| *Elemid | Nomor Elemen Antrian |
Kode keluar
Data mentah dibaca dari flash.
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| ADR | Alamat memori flash spi |
| *data | penunjuk untuk membaca data |
| Len | Jumlah byte dalam *data |
Kode keluar
Layanan Permintaan Lapisan Buffer Layanan serta Pemrosesan Paket SPI. Fungsi ini harus dipanggil dalam materi berbasis waktu. Transfer Paket Data SPI harus menggunakan DataFlow berbasis ISR.
void sfcb_worker ( t_sfcb * self );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
Tidak ada.
Oleh sfcb_worker membuat ukuran paket SPI dalam byte.
uint16_t sfcb_spi_len ( t_sfcb * self );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
Hitungan byte paket SPI.
Dapatkan SFCB Compiled Flash Type Total Ukuran.
uint32_t sfcb_flash_size ( void );Ukuran dalam byte.
Dapatkan Jumlah Elemen Tertinggi dari Buffer Buffer Antrian CBID .
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| Arg | Keterangan |
|---|---|
| diri sendiri | Elemen Penyimpanan SFCB |
| cbid | antrian buffer melingkar untuk berinteraksi |
Nomor elemen tertinggi.
| Nilai | Keterangan |
|---|---|
| SFCB_OK | Diterima |
| SFCB_E_NO_FLASH | tidak ada jenis flash yang dipilih, gunakan -D |
| SFCB_E_MEM | tidak cukup memori yang ditetapkan dalam sfcb_init |
| Sfcb_e_flash_full | Kapasitas flash terlampaui |
| SFCB_E_WKR_BSY | sfcb_worker sibuk, tunggu |
| SFCB_E_NO_CB_Q | antrian buffer sirkular cbID tidak ada |
| SFCB_E_WKR_REQ | Data manajemen buffer melingkar tidak disiapkan untuk permintaan, jalankan sfcb_mkcb |
| SFCB_E_CB_Q_MTY | Tidak ada entri yang valid dalam antrian |
SFCB mendukung jumlah antrian buffer bundar sewenang -wenang. Setiap buffer melingkar dimulai pada alamat flash SPI gratis terendah. Arsitektur Flash membutuhkan data khusus yang jelas - yang disebut sektor hapus . Melalui keterbatasan ini harus setidaknya dua sektor yang dialokasikan. Kalau tidak, akan menimpa elemen tertulis pertama yang menghasilkan antrian penyangga melingkar yang ditimpa tanpa menyimpan entri sebelumnya. Setiap entri baru ditandai dengan bertambah tertinggi 32bit Idnum dan MagicNum . Magicnum memastikan deteksi elemen antrian penyangga bundar yang ditempati.
Organisasi memori contoh untuk payload 240 byte dan 32 elemen (= dua sektor) menunjukkan gambar di bawah ini: