C ห้องสมุดเพื่อแปลงแฟลช SPI ทางกายภาพเป็นจำนวนบัฟเฟอร์แบบวงกลมเชิงตรรกะโดยพลการ อินเทอร์เฟซระหว่าง SFCB และ SPI Core นั้นรับรู้ว่าเป็นหน่วยความจำที่ใช้ร่วมกัน
-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 );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| CB | หน่วยความจำคิวบัฟเฟอร์แบบวงกลม |
| cblen | สูงสุด จำนวนคิว CB |
| SPI | SFCB / SPI Core Exchange Buffer |
| ผอมแห้ง | ขนาดบัฟเฟอร์ SPI ในไบต์ |
ออกรหัส
สร้างคิวบัฟเฟอร์แบบวงกลมอิสระตรรกะใหม่ในแฟลช SPI
int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| เวทมนตร์ | หมายเลขวิเศษจำเป็นต้องไม่ซ้ำกันสำหรับทุกคิวบนแฟลช SPI เดียวกัน |
| elemsizebyte | ขนาดน้ำหนักบรรทุกเป็นไบต์ส่วนหัว/ส่วนท้ายสาเหตุ |
| ตัวเลข | จำนวนองค์ประกอบที่ต้องการน้อยที่สุดในคิวปัดขึ้นไปยัง ภาค เต็มถัดไป |
| CBID | ID ที่กำหนดไว้ในคิวนี้จำเป็นสำหรับคำขอเพิ่มเติมทั้งหมด |
ออกรหัส
ตรวจสอบว่า SFCB กำลังประมวลผลคำขออื่นหรือไม่
int sfcb_busy ( t_sfcb * self );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
ออกรหัส
ในคำขอสุดท้ายสิ้นสุดลงด้วยข้อผิดพลาด
int sfcb_isero ( t_sfcb * self );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
ออกรหัส
ได้รับข้อมูลคิวทั้งหมดจาก SPI Flash จำเป็นหลังจากโทรหา SFCB_ADD เพื่ออัปเดตข้อมูลการจัดการทั้งหมด
int sfcb_mkcb ( t_sfcb * self );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
ออกรหัส
ผนวกไบต์เข้ากับองค์ประกอบคิวบัฟเฟอร์วงกลมที่เลือกในปัจจุบัน
int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| CBID | คิวบัฟเฟอร์แบบวงกลมเพื่อโต้ตอบ |
| *ข้อมูล | ตัวชี้เพื่อเขียนข้อมูล |
| เลิร์น | จำนวนไบต์ใน ข้อมูล * |
ออกรหัส
บังคับให้เขียน ส่วนท้าย หากไม่มีไบต์ทั้งหมดที่มีอยู่ในองค์ประกอบคิวบัฟเฟอร์แบบวงกลมจะถูกครอบครองโดยการเพิ่ม ส่วนท้าย จะใช้ในการตรวจจับการเขียนองค์ประกอบที่สมบูรณ์ คำแนะนำทั่วไปคือการโทรหา sfcb_add_done ทุกครั้งที่คุณเขียนองค์ประกอบคิวเสร็จแล้ว
int sfcb_add_done ( t_sfcb * self , uint8_t cbID );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| CBID | คิวบัฟเฟอร์แบบวงกลมเพื่อโต้ตอบ |
ออกรหัส
รับจำนวนไบต์ที่เขียนเป็นองค์ประกอบเป็นคิว เปิดใช้งานการเขียนวัตถุข้อมูลหลายขั้นตอนไปยังองค์ประกอบบัฟเฟอร์แบบวงกลม
uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| CBID | คิวบัฟเฟอร์แบบวงกลมเพื่อโต้ตอบ |
เขียนจำนวนองค์ประกอบของคิว
อ่านองค์ประกอบคิวล่าสุดที่เขียนกลับมา
int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| CBID | คิวบัฟเฟอร์แบบวงกลมเพื่อโต้ตอบ |
| *ข้อมูล | ตัวชี้เพื่ออ่านข้อมูล |
| เลิร์น | จำนวนไบต์ใน ข้อมูล * |
| *Elemid | หมายเลของค์ประกอบคิว |
ออกรหัส
ข้อมูลดิบอ่านจาก Flash
int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
| ADR | ที่อยู่หน่วยความจำ SPI Flash |
| *ข้อมูล | ตัวชี้เพื่ออ่านข้อมูล |
| เลิร์น | จำนวนไบต์ใน ข้อมูล * |
ออกรหัส
บริการการร้องขอเลเยอร์บัฟเฟอร์แบบวงกลมรวมถึงการประมวลผลแพ็คเก็ต SPI ฟังก์ชั่นนี้ควรเรียกในเรื่องตามเวลา การถ่ายโอนแพ็คเก็ตข้อมูล SPI ควรใช้ DataFlow ที่ใช้ ISR
void sfcb_worker ( t_sfcb * self );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
ไม่มี.
โดย SFCB_Worker สร้างขนาดแพ็คเก็ต SPI ในไบต์
uint16_t sfcb_spi_len ( t_sfcb * self );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ SFCB |
BYTE COUNT ของ SPI Packet
รับ SFCB ที่รวบรวมขนาดแฟลชขนาดรวม
uint32_t sfcb_flash_size ( void );ขนาดเป็นไบต์
รับจำนวนองค์ประกอบสูงสุดของคิวบัฟเฟอร์วงกลม CBID
uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );| อาร์ก | คำอธิบาย |
|---|---|
| ตัวเอง | องค์ประกอบการจัดเก็บ 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 ฟรีต่ำสุด สถาปัตยกรรมแฟลชต้องการข้อมูลเฉพาะที่ชัดเจน - เรียกว่า การลบภาค ผ่านข้อ จำกัด นี้จะต้องจัดสรรอย่างน้อยสองภาคส่วน มิฉะนั้นการเขียนทับขององค์ประกอบที่เขียนครั้งแรกจะส่งผลให้คิวบัฟเฟอร์แบบวงกลมสมบูรณ์เขียนทับโดยไม่ต้องเก็บรายการก่อนหน้านี้ ทุกรายการใหม่จะถูกทำเครื่องหมายด้วยการเพิ่มขึ้น 32 บิต และ MagicNum Magicnum ช่วยให้มั่นใจได้ว่าการตรวจจับองค์ประกอบคิวบัฟเฟอร์แบบวงกลมที่ถูกยึดครอง
องค์กรหน่วยความจำที่เป็นแบบอย่างสำหรับ 240 ไบต์น้ำหนักบรรทุกและองค์ประกอบ 32 (= สองภาค) แสดงรูปด้านล่าง: