c庫將物理SPI閃爍轉換為任意數量的邏輯圓形緩衝區。 SFCB和SPI核心之間的接口被實現為共享內存。
-D選擇| 版本 | 日期 | 來源 | 更改日誌 |
|---|---|---|---|
| 最新的 | 最新zip |
git clone --recursive https://github.com/andkae/SPI-Flash-Circular-Buffer.gitMakefile通過單元測試構建存儲庫:
$ 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_test圖書館部分本身可以建立:
gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o閃存W25Q16JV是通過Compile Switch -D選擇的。
運行單元測試呼叫:
$ ./test/sfcb_test初始化SFCB通用句柄並分配內存。
int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| CB | 圓形緩衝列隊內存 |
| cblen | 最大限度。 CB隊列的數量 |
| spi | SFCB / SPI核心交換緩衝區 |
| 斯皮倫 | 字節中的SPI緩衝尺寸 |
退出代碼
在SPI Flash中創建一個新的邏輯獨立的圓形緩衝區隊列。
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| 魔術 | 魔術數字,在同一SPI閃光燈上的每個隊列都必須是唯一的 |
| Elemsizebyte | 有效載荷大小,字節,標頭/頁腳原因 |
| 數字 | 隊列中所需元素的數量最少,舍入到下一個整個部門 |
| CBID | 分配給此隊列的ID ,所有其他請求所需的 |
退出代碼
檢查SFCB是否正在處理另一個請求。
int sfcb_busy ( t_sfcb * self );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
退出代碼
在最後一個請求中以錯誤結束。
int sfcb_isero ( t_sfcb * self );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
退出代碼
從SPI Flash獲取所有隊列信息。致電SFCB_ADD以更新所有管理信息後所需。
int sfcb_mkcb ( t_sfcb * self );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
退出代碼
將字節附加到當前選定的圓形緩衝器隊列元件上。
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| CBID | 圓形緩衝液相互作用 |
| *數據 | 指針寫數據 |
| 倫 | *數據中的字節數 |
退出代碼
在圓形緩衝區隊列元件中,如果不是所有可用的字節,請寫下頁腳。頁腳用於檢測元素的完整寫作。一般建議是每次完成隊列元素寫作時都會致電sfcb_add_done 。
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| CBID | 圓形緩衝液相互作用 |
退出代碼
獲取當前的書面字節數以排隊元素。啟用多階段數據對象寫入循環緩衝元素。
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| CBID | 圓形緩衝液相互作用 |
編寫隊列元素的字節數。
閱讀最後一個書面的隊列元素。
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| CBID | 圓形緩衝液相互作用 |
| *數據 | 指針讀取數據 |
| 倫 | *數據中的字節數 |
| *Elemid | 隊列元素號 |
退出代碼
從Flash讀取的原始數據。
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| ADR | SPI閃存地址 |
| *數據 | 指針讀取數據 |
| 倫 | *數據中的字節數 |
退出代碼
服務循環緩衝層請求以及SPI數據包處理。此功能應在基於時間的問題中調用。 SPI數據包傳輸應使用基於ISR的數據流。
void sfcb_worker ( t_sfcb * self );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
沒有任何。
由sfcb_worker創建了字節中的SPI數據包大小。
uint16_t sfcb_spi_len ( t_sfcb * self );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
SPI數據包的字節數。
獲取SFCB編譯的Flash類型總尺寸。
uint32_t sfcb_flash_size ( void );大小為字節。
獲得最高元素的圓形緩衝液隊列CBID 。
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| arg | 描述 |
|---|---|
| 自己 | SFCB存儲元素 |
| CBID | 圓形緩衝液相互作用 |
最高元素號。
| 價值 | 描述 |
|---|---|
| sfcb_ok | 公認 |
| sfcb_e_no_flash | 未選擇閃存類型,使用-D |
| sfcb_e_mem | 在sfcb_init中分配的記憶不足 |
| sfcb_e_flash_full | 閃存容量超過了 |
| sfcb_e_wkr_bsy | sfcb_worker很忙,等等 |
| sfcb_e_no_cb_q | 圓形緩衝列cbID不存在 |
| sfcb_e_wkr_req | 循環緩衝區管理數據未為請求準備,運行sfcb_mkcb |
| sfcb_e_cb_q_mty | 隊列中沒有有效的條目 |
SFCB支持任意數量的圓形緩衝液隊列。每個圓形緩衝區始於最低的自由SPI閃存地址。閃存體系結構需要一個專用的數據清除 - 所謂的sector擦除。通過這種限制,必須至少分配兩個部門。否則,第一個書面元素的覆蓋將導致完整的循環緩衝列表覆蓋,而無需保留任何以前的條目。每個新的條目都標有增量最高的32位IDNUM和MagicNum 。 MagicNum確保檢測到佔據的圓形緩衝液隊列元件。
240個字節有效載荷和32個元素(=兩個扇區)的模範內存組織顯示以下圖: