Cライブラリの物理的なSPIフラッシュを任意の数の論理円形バッファーに変換します。 SFCBとSPIコアの間のインターフェイスは、共有メモリとして実現されます。
-D経由で選択可能な任意のSPIフラッシュサポート| バージョン | 日付 | ソース | ログを変更します |
|---|---|---|---|
| 最新 | 最新.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は、コンパイルスイッチ-Dを介して選択されました。
ユニットテストコールを実行するには:
$ ./test/sfcb_testSFCB共通ハンドルを初期化し、メモリを割り当てます。
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フラッシュに新しい論理独立循環バッファーキューを作成します。
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| arg | 説明 |
|---|---|
| 自己 | SFCBストレージ要素 |
| MagicNum | マジックナンバー、同じSPIフラッシュのすべてのキューにユニークである必要があります |
| ElemsizeByte | バイトのペイロードサイズ、ヘッダー/フッターの原因 |
| numelems | キューに必要な要素の最小数、次の完全なセクターに丸められた |
| 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 | 相互作用する円形のバッファーキュー |
| *データ | データを書き込むためのポインター |
| レン | *データのバイト数 |
出口コード
循環バッファーキュー要素で利用可能なすべてのバイトではない場合、フッターの強制書き込みは、ADDで占められています。フッターは、要素の完全な書き込みを検出するために使用されます。一般的な推奨事項は、キュー要素の書き込みを完了するたびにsfcb_add_doneに電話することです。
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| arg | 説明 |
|---|---|
| 自己 | SFCBストレージ要素 |
| cbid | 相互作用する円形のバッファーキュー |
出口コード
現在の書面によるバイトの数を獲得してから、キュー要素を使用します。 MultiStage Data Object write buffer要素を有効にします。
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 | 相互作用する円形のバッファーキュー |
| *データ | データを読むためのポインター |
| レン | *データのバイト数 |
| *エレミッド | キュー要素番号 |
出口コード
Flashから読み取られます。
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| arg | 説明 |
|---|---|
| 自己 | SFCBストレージ要素 |
| ADR | SPIフラッシュメモリアドレス |
| *データ | データを読むためのポインター |
| レン | *データのバイト数 |
出口コード
Service Circular Bufferレイヤー要求と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コンパイルされたフラッシュタイプの合計サイズを取得します。
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フラッシュアドレスで始まります。フラッシュアーキテクチャには、専用のデータクリア(いわゆるセクター消去が必要です。この制限を通じて、少なくとも2つのセクターが割り当てられる必要があります。それ以外の場合は、最初の書かれた要素の上書きにより、以前のエントリを保持せずに完全な円形バッファーキューが上書きされます。すべての新しいエントリには、32ビットIdnumとMagicNumが増加したものがマークされています。 MagicNumは、占有された円形バッファーキュー要素の検出を保証します。
240バイトのペイロードと32の要素(= 2つのセクター)の模範的なメモリ組織は、以下の図を示しています。