ฐานข้อมูลแฟลชเล็ก ๆ สำหรับ MCU
ในการพัฒนาไมโครคอนโทรลเลอร์ประจำวันจำเป็นต้องมีข้อมูลบางอย่างอยู่เสมอ ในเวลานี้จำเป็นต้องมีการแก้ปัญหาสำหรับการจัดเก็บแฟลชไมโครคอนโทรลเลอร์ ปัจจุบันมีโซลูชันมากมายสำหรับการจัดเก็บไมโครคอนโทรลเลอร์เช่น: EasyFlash, FlashDB, OSAL_NV เป็นต้นโปรแกรมของพวกเขามีขนาดใหญ่มากและไม่คุ้มค่ากับการจัดเก็บตัวแปรไม่กี่ตัว และเป็นเรื่องยากที่จะพิจารณาข้อผิดพลาดในการเขียนแฟลช
ในผลิตภัณฑ์จริงการเขียนแฟลชของผลิตภัณฑ์ฝังตัวอาจได้รับผลกระทบจากปัจจัยต่าง ๆ (พลังงานแบตเตอรี่ไฟฟ้าดับที่ไม่คาดคิดอุณหภูมิ ฯลฯ ) และไม่เสถียรมาก เมื่อเกิดข้อผิดพลาดมันจะนำไปสู่ปัญหาของปัญหาผลิตภัณฑ์
ซึ่งแตกต่างจากฐานข้อมูล KV อื่น ๆ อีกมากมายตัวแปรแต่ละตัวที่ต้องเก็บไว้ใน TinyFlashDB จะได้รับการจัดสรรส่วนแฟลชไมโครคอนโทรลเลอร์แยกต่างหากและความยาวของตัวแปรไม่สามารถเปลี่ยนแปลงได้
ดังนั้น TinyFlashDB จึงเหมาะสำหรับการจัดเก็บตัวแปรสำคัญหลายตัว (เช่น: IAP JUMP FLAG, เวลาหยุดทำงานของระบบ ฯลฯ ) และไม่เหมาะสำหรับการจัดเก็บข้อมูลขนาดใหญ่ (การจัดเก็บข้อมูลขนาดใหญ่สามารถใช้ EasyFlash ฯลฯ )
TinyFlashDB ได้รับการออกแบบมาเพื่อพิจารณาผลกระทบของข้อผิดพลาดในการเขียนการรับประกันความปลอดภัยภายในความสามารถการประกอบอาชีพทรัพยากรให้มากที่สุด (น้อยกว่า 1KB รหัสครอบครอง) และความเป็นสากลที่สุดเท่าที่จะเป็นไปได้
const tfdb_index_t test_index = {
. end_byte = 0x00 ,
. flash_addr = 0x4000 ,
. flash_size = 256 ,
. value_length = 2 ,
}; /* c99写法,如果编译器不支持,可自行改为c89写法 */
tfdb_addr_t addr = 0 ; /*addr cache*/
uint8_t test_buf [ TFDB_ALIGNED_RW_BUFFER_SIZE ( 2 , 1 )]; /*aligned_value_size*/
uint16_t test_value ;
void main ()
{
TFDB_Err_Code result ;
result = tfdb_set ( & test_index , test_buf , & addr , & test_value );
if ( result == TFDB_NO_ERR )
{
printf ( "set ok, addr:%xn" , addr );
}
addr = 0 ; /* reset addr cache, to see tfdb_get. */
result = tfdb_get ( & test_index , test_buf , & addr , & test_value );
if ( result == TFDB_NO_ERR )
{
printf ( "get ok, addr:%x, value:%xn" , addr , test_value );
}
} typedef struct _tfdb_index_struct {
tfdb_addr_t flash_addr ; /* the start address of the flash block */
uint16_t flash_size ; /* the size of the flash block */
uint8_t value_length ; /* the length of value that saved in this flash block */
uint8_t end_byte ; /* must different to TFDB_VALUE_AFTER_ERASE */
/* 0x00 is recommended for end_byte, because almost all flash is 0xff after erase. */
} tfdb_index_t ;ฟังก์ชั่นโครงสร้าง: ใน TinyFlashDB การดำเนินการ API ต้องการดัชนีพารามิเตอร์ที่ระบุ โครงสร้างดัชนีนี้เก็บที่อยู่ของแฟลชขนาดของแฟลชความยาวของตัวแปรที่เก็บไว้และธงท้าย ข้อมูลนี้จะถูกตรวจสอบเมื่ออ่านภาคแฟลช
TFDB_Err_Code tfdb_get ( const tfdb_index_t * index , uint8_t * rw_buffer , tfdb_addr_t * addr_cache , void * value_to ); ฟังก์ชั่นฟังก์ชั่น: รับตัวแปรที่มีความยาวตัวแปรที่ระบุในดัชนีจากส่วนที่ชี้ไปที่ index ข้อผิดพลาดการตรวจสอบข้อมูลส่วนหัวของแฟลชจะไม่เกิดแฟลชอีกครั้ง
index พารามิเตอร์: ดัชนีตัวชี้สำหรับการทำงานของ TFDB
พารามิเตอร์ rw_buffer : เขียนและอ่านแคช การดำเนินการแฟลชทั้งหมดในที่สุดจะคัดลอกข้อมูลที่จัดเรียงลงในบัฟเฟอร์จากนั้นเรียกใช้ tfdb_port_write หรือ tfdb_port_read สำหรับการอ่านและการเขียน เมื่อชิปมีข้อกำหนดพิเศษสำหรับแคชพื้นที่ข้อมูลที่เป็นลายลักษณ์อักษร (เช่นการจัดตำแหน่ง 4 ไบต์, การจัดตำแหน่ง 256 ไบต์ ฯลฯ ) ตัวชี้ตัวแปรที่ตรงตามข้อกำหนดสามารถส่งผ่านไปยังฟังก์ชั่นสำหรับใช้ผ่านพารามิเตอร์นี้ ความยาวอย่างน้อย 4 ไบต์
พารามิเตอร์ addr_cache : สามารถเป็น NULL หรือตัวชี้ไปยังตัวแปรแคชที่อยู่ เมื่อ addr_cache ไม่ได้ NULL และไม่ใช่ 0, addr_cache ได้รับการพิจารณาว่าได้รับการเริ่มต้นสำเร็จไม่ได้ตรวจสอบส่วนหัวแฟลชอีกต่อไปและข้อมูลจะถูกอ่านโดยตรงจากที่อยู่ของ addr_cache
พารามิเตอร์ value_to : ที่อยู่เพื่อจัดเก็บเนื้อหาข้อมูล
ค่าส่งคืน: TFDB_NO_ERR ประสบความสำเร็จคนอื่น ๆ ล้มเหลว
TFDB_Err_Code tfdb_set ( const tfdb_index_t * index , uint8_t * rw_buffer , tfdb_addr_t * addr_cache , void * value_from ); ฟังก์ชั่นฟังก์ชั่น: เขียนตัวแปรที่มีความยาวตัวแปรที่ระบุในดัชนีลงในส่วนที่ชี้ไปที่ index และข้อผิดพลาดการตรวจสอบข้อมูลส่วนหัวของแฟลชจะผิดพลาดและแฟลชจะถูกนำมาใช้ใหม่
index พารามิเตอร์: ดัชนีตัวชี้สำหรับการทำงานของ TFDB
พารามิเตอร์ rw_buffer : เขียนและอ่านแคช การดำเนินการแฟลชทั้งหมดในที่สุดจะคัดลอกข้อมูลที่จัดเรียงลงในบัฟเฟอร์จากนั้นเรียกใช้ tfdb_port_write หรือ tfdb_port_read สำหรับการอ่านและการเขียน เมื่อชิปมีข้อกำหนดพิเศษสำหรับแคชพื้นที่ข้อมูลที่เป็นลายลักษณ์อักษร (เช่นการจัดตำแหน่ง 4 ไบต์, การจัดตำแหน่ง 256 ไบต์ ฯลฯ ) ตัวชี้ตัวแปรที่ตรงตามข้อกำหนดสามารถส่งผ่านไปยังฟังก์ชั่นสำหรับใช้ผ่านพารามิเตอร์นี้ ความยาวอย่างน้อย 4 ไบต์
พารามิเตอร์ addr_cache : สามารถเป็น NULL หรือตัวชี้ไปยังตัวแปรแคชที่อยู่ เมื่อ addr_cache ไม่ได้ NULL และไม่ใช่ 0, addr_cache ได้รับการพิจารณาว่าได้รับการเริ่มต้นสำเร็จไม่ได้ตรวจสอบส่วนหัวแฟลชอีกต่อไปและข้อมูลจะถูกอ่านโดยตรงจากที่อยู่ของ addr_cache
พารามิเตอร์ value_from : เนื้อหาข้อมูลที่จะเก็บไว้
ค่าส่งคืน: TFDB_NO_ERR ประสบความสำเร็จคนอื่น ๆ ล้มเหลว
TFDB Dual API ถูกห่อหุ้มตาม tfdb_set และ tfdb_get tfdb dual จะเรียก tfdb_set และ tfdb_get และเพิ่ม SEQ สองไบต์ไปที่ด้านหน้าของข้อมูลดังนั้นใน TFDB Dual ความยาวตัวแปรที่เก็บข้อมูลที่รองรับที่ยาวที่สุดคือ 253 ไบต์
ในเวลาเดียวกัน TFDB Dual API จำเป็นต้องให้บัฟเฟอร์สองตัวและจำเป็นต้องจัด aligned_value_size เพิ่มความยาวของตัวแปรสองไบต์แล้วคำนวณใหม่
typedef struct _my_test_params_struct
{
uint32_t aa [ 2 ];
uint8_t bb [ 16 ];
} my_test_params_t ;
my_test_params_t my_test_params = {
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18
};
tfdb_dual_index_t my_test_tfdb_dual = {
. indexes [ 0 ] = {
. end_byte = 0x00 ,
. flash_addr = 0x08077000 ,
. flash_size = 256 ,
. value_length = TFDB_DUAL_VALUE_LENGTH ( sizeof ( my_test_params_t )),
},
. indexes [ 1 ] = {
. end_byte = 0x00 ,
. flash_addr = 0x08077100 ,
. flash_size = 256 ,
. value_length = TFDB_DUAL_VALUE_LENGTH ( sizeof ( my_test_params_t )),
},
};
tfdb_dual_cache_t my_test_tfdb_dual_cache = { 0 };
void my_test_tfdb_dual_func ()
{
uint32_t rw_buffer [ TFDB_DUAL_ALIGNED_RW_BUFFER_SIZE ( TFDB_DUAL_VALUE_LENGTH ( sizeof ( my_test_params_t )), 4 )];
uint32_t rw_buffer_bak [ TFDB_DUAL_ALIGNED_RW_BUFFER_SIZE ( TFDB_DUAL_VALUE_LENGTH ( sizeof ( my_test_params_t )), 4 )];
TFDB_Err_Code err ;
for ( uint8_t i = 0 ; i < 36 ; i ++ )
{
err = tfdb_dual_get ( & my_test_tfdb_dual , ( uint8_t * ) rw_buffer , ( uint8_t * ) rw_buffer_bak , & my_test_tfdb_dual_cache , & my_test_params );
if ( err == TFDB_NO_ERR )
{
printf ( "read okncache seq1:0x%04x, seq2:0x%04xnaddr1:0x%08x, addr2:0x%08xn" , my_test_tfdb_dual_cache . seq [ 0 ], my_test_tfdb_dual_cache . seq [ 1 ], my_test_tfdb_dual_cache . addr_cache [ 0 ], my_test_tfdb_dual_cache . addr_cache [ 1 ]);
}
else
{
printf ( "read err:%dn" , err );
}
my_test_params . aa [ 0 ] ++ ;
my_test_params . aa [ 1 ] ++ ;
for ( uint8_t i = 0 ; i < 16 ; i ++ )
{
my_test_params . bb [ i ] ++ ;
}
memset ( & my_test_tfdb_dual_cache , 0 , sizeof ( my_test_tfdb_dual_cache )); /* 测试无地址缓存写入 */
err = tfdb_dual_set ( & my_test_tfdb_dual , ( uint8_t * ) rw_buffer , ( uint8_t * ) rw_buffer_bak , & my_test_tfdb_dual_cache , & my_test_params );
if ( err == TFDB_NO_ERR )
{
printf ( "write okncache seq1:0x%04x, seq2:0x%04xnaddr1:0x%08x, addr2:0x%08xn" , my_test_tfdb_dual_cache . seq [ 0 ], my_test_tfdb_dual_cache . seq [ 1 ], my_test_tfdb_dual_cache . addr_cache [ 0 ], my_test_tfdb_dual_cache . addr_cache [ 1 ]);
}
else
{
printf ( "write err:%dn" , err );
}
memset ( & my_test_tfdb_dual_cache , 0 , sizeof ( my_test_tfdb_dual_cache )); /* 测试无地址缓存读取 */
}
} typedef struct _tfdb_dual_index_struct
{
tfdb_index_t indexes [ 2 ];
} tfdb_dual_index_t ;
typedef struct _tfdb_dual_cache_struct
{
tfdb_addr_t addr_cache [ 2 ];
uint16_t seq [ 2 ];
} tfdb_dual_cache_t ; ฟังก์ชั่นโครงสร้าง: ใน DIGINEFLASHDB Dual การดำเนินการ API ต้องการ index พารามิเตอร์ที่ระบุ index เก็บสอง tfdb_index_t
TFDB_Err_Code tfdb_dual_get ( const tfdb_dual_index_t * index , uint8_t * rw_buffer , uint8_t * rw_buffer_bak , tfdb_dual_cache_t * cache , void * value_to );ฟังก์ชั่นฟังก์ชั่น: รับตัวแปรที่มีความยาวตัวแปรที่ระบุในดัชนีจากส่วนที่ชี้ไปที่ดัชนี ข้อผิดพลาดการตรวจสอบข้อมูลส่วนหัวของแฟลชจะไม่เกิดแฟลชอีกครั้ง
index พารามิเตอร์: ดัชนีตัวชี้สำหรับการทำงานของ TFDB
พารามิเตอร์ rw_buffer : เขียนและอ่านแคช การดำเนินการแฟลชทั้งหมดในที่สุดจะคัดลอกข้อมูลที่จัดเรียงลงในบัฟเฟอร์จากนั้นเรียกใช้ tfdb_port_write หรือ tfdb_port_read สำหรับการอ่านและการเขียน เมื่อชิปมีข้อกำหนดพิเศษสำหรับแคชพื้นที่ข้อมูลที่เป็นลายลักษณ์อักษร (เช่นการจัดตำแหน่ง 4 ไบต์, การจัดตำแหน่ง 256 ไบต์ ฯลฯ ) ตัวชี้ตัวแปรที่ตรงตามข้อกำหนดสามารถส่งผ่านไปยังฟังก์ชั่นสำหรับใช้ผ่านพารามิเตอร์นี้ ความยาวอย่างน้อย 4 ไบต์
พารามิเตอร์ rw_buffer_bak : เขียนและอ่านแคช การดำเนินการแฟลชทั้งหมดในที่สุดจะคัดลอกข้อมูลที่จัดเรียงลงในบัฟเฟอร์จากนั้นเรียกใช้ tfdb_port_write หรือ tfdb_port_read สำหรับการอ่านและการเขียน เมื่อชิปมีข้อกำหนดพิเศษสำหรับแคชพื้นที่ข้อมูลที่เป็นลายลักษณ์อักษร (เช่นการจัดตำแหน่ง 4 ไบต์, การจัดตำแหน่ง 256 ไบต์ ฯลฯ ) ตัวชี้ตัวแปรที่ตรงตามข้อกำหนดสามารถส่งผ่านไปยังฟังก์ชั่นสำหรับใช้ผ่านพารามิเตอร์นี้ ความยาวอย่างน้อย 4 ไบต์
cache พารามิเตอร์: ไม่สามารถเป็น NULL มันจะต้องเป็นตัวชี้แคชที่กำหนดโดย tfdb_dual_cache_t เมื่อข้อมูลใน cache ถูกกฎหมายก็จะพิจารณาว่า cache ได้รับการเริ่มต้นสำเร็จแล้วและข้อมูลจะถูกอ่านโดยตรงจากบล็อกแฟลชและที่อยู่ของ cache
พารามิเตอร์ value_to : ที่อยู่เพื่อจัดเก็บเนื้อหาข้อมูล
ค่าส่งคืน: TFDB_NO_ERR ประสบความสำเร็จคนอื่น ๆ ล้มเหลว
TFDB_Err_Code tfdb_dual_set ( const tfdb_dual_index_t * index , uint8_t * rw_buffer , uint8_t * rw_buffer_bak , tfdb_dual_cache_t * cache , void * value_from );ฟังก์ชั่นฟังก์ชั่น: เขียนตัวแปรที่มีความยาวตัวแปรที่ระบุในดัชนีลงในส่วนที่ชี้ไปที่ดัชนีและข้อผิดพลาดการตรวจสอบข้อมูลส่วนหัวของแฟลชจะผิดพลาดและแฟลชจะถูกนำมาใช้ใหม่
index พารามิเตอร์: ดัชนีตัวชี้สำหรับการทำงานของ TFDB
พารามิเตอร์ rw_buffer : เขียนและอ่านแคช การดำเนินการแฟลชทั้งหมดในที่สุดจะคัดลอกข้อมูลที่จัดเรียงลงในบัฟเฟอร์จากนั้นเรียกใช้ tfdb_port_write หรือ tfdb_port_read สำหรับการอ่านและการเขียน เมื่อชิปมีข้อกำหนดพิเศษสำหรับแคชพื้นที่ข้อมูลที่เป็นลายลักษณ์อักษร (เช่นการจัดตำแหน่ง 4 ไบต์, การจัดตำแหน่ง 256 ไบต์ ฯลฯ ) ตัวชี้ตัวแปรที่ตรงตามข้อกำหนดสามารถส่งผ่านไปยังฟังก์ชั่นสำหรับใช้ผ่านพารามิเตอร์นี้ ความยาวอย่างน้อย 4 ไบต์
พารามิเตอร์ rw_buffer_bak : เขียนและอ่านแคช การดำเนินการแฟลชทั้งหมดในที่สุดจะคัดลอกข้อมูลที่จัดเรียงลงในบัฟเฟอร์จากนั้นเรียกใช้ tfdb_port_write หรือ tfdb_port_read สำหรับการอ่านและการเขียน เมื่อชิปมีข้อกำหนดพิเศษสำหรับแคชพื้นที่ข้อมูลที่เป็นลายลักษณ์อักษร (เช่นการจัดตำแหน่ง 4 ไบต์, การจัดตำแหน่ง 256 ไบต์ ฯลฯ ) ตัวชี้ตัวแปรที่ตรงตามข้อกำหนดสามารถส่งผ่านไปยังฟังก์ชั่นสำหรับใช้ผ่านพารามิเตอร์นี้ ความยาวอย่างน้อย 4 ไบต์
cache พารามิเตอร์: ไม่สามารถเป็น NULL มันจะต้องเป็นตัวชี้แคชที่กำหนดโดย tfdb_dual_cache_t เมื่อข้อมูลใน cache ถูกกฎหมายก็จะพิจารณาว่า cache ได้รับการเริ่มต้นสำเร็จแล้วและข้อมูลจะถูกอ่านโดยตรงจากบล็อกแฟลชและที่อยู่ของ cache
พารามิเตอร์ value_from : เนื้อหาข้อมูลที่จะเก็บไว้
ค่าส่งคืน: TFDB_NO_ERR ประสบความสำเร็จคนอื่น ๆ ล้มเหลว
การสังเกตรหัสข้างต้นคุณจะพบว่าการดำเนินการ TinyFlashDB ต้องการพารามิเตอร์ index ที่กำหนดโดย tfdb_index_t
หลังจากแฟลชเริ่มต้นข้อมูลส่วนหัวคือ 4 ไบต์ดังนั้นจึงรองรับการดำเนินการ 1, 2, 4 และ 8 ไบต์เท่านั้น:
ส่วนหัวจะถูกอ่านเมื่อส่วนหัวเริ่มต้นดังนั้นข้อกำหนดแรกสำหรับข้อมูลที่ชี้ไปที่ rw_buffer ในฟังก์ชั่นอย่างน้อย 4 ไบต์ หากหน่วยเขียนขั้นต่ำคือ 8 ไบต์ข้อกำหนดแรกคืออย่างน้อย 8 ไบต์
| ไบต์แรก | ไบต์ที่สอง | ไบต์ 3 | ไบต์ที่สี่และไบต์อื่น ๆ |
|---|---|---|---|
| flash_size ไบต์ 8 บิตที่สูงขึ้น | flash_size ต่ำ 8 บิตไบต์ | value_length | end_byte |
เมื่อเก็บข้อมูลจะถูกจัดเรียงตามการดำเนินการของไบต์ที่สนับสนุนโดย FLASH ดังนั้นข้อมูลที่สองที่ชี้ไปที่ rw_buffer ในฟังก์ชั่นจำเป็นต้องมีอย่างน้อย aligned_value_size ไบต์ที่คำนวณในฟังก์ชั่นต่อไปนี้:
aligned_value_size = index -> value_length + 2 ; /* data + verify + end_byte */
#if ( TFDB_WRITE_UNIT_BYTES == 2 )
/* aligned with TFDB_WRITE_UNIT_BYTES */
aligned_value_size = (( aligned_value_size + 1 ) & 0xfe );
#elif ( TFDB_WRITE_UNIT_BYTES == 4 )
/* aligned with TFDB_WRITE_UNIT_BYTES */
aligned_value_size = (( aligned_value_size + 3 ) & 0xfc );
#elif ( TFDB_WRITE_UNIT_BYTES == 8 )
/* aligned with TFDB_WRITE_UNIT_BYTES */
aligned_value_size = (( aligned_value_size + 7 ) & 0xf8 );
#endif| bytes ค่าแรก value_length | value_length+1 ไบต์ | value_length+2 ไบต์ | ไบต์ที่สอดคล้องกันอื่น ๆ |
|---|---|---|---|
| Value_From เนื้อหาข้อมูล | ค่า _ จากการตรวจสอบผลรวม | end_byte | end_byte |
หลังจากการเขียนแต่ละครั้งจะมีการอ่านเพื่อตรวจสอบ หากการตรวจสอบล้มเหลวจะพยายามเขียนตามที่อยู่ถัดไป จนกว่าจะถึงจำนวนการเขียนสูงสุด (TFDB_WRITE_MAX_RETRY) หรือข้อผิดพลาดการตรวจสอบส่วนหัวนั้นไม่ถูกต้อง
เมื่ออ่านข้อมูลจะมีการคำนวณและตรวจสอบ หากไม่ผ่านมันจะอ่านต่อไปจนกว่าข้อมูลล่าสุดที่ผ่านการตรวจสอบจะถูกส่งคืนหรือการอ่านล้มเหลว
มีเพียง 3 ค่าทางกฎหมายสำหรับ SEQ สองไบต์ที่ด้านหน้าของข้อมูล, 0x00ff-> 0x0ff0-> 0xff00
รอบนี้ซ้ำตัวเองโดยการอ่าน SEQ ของตัวแปรล่าสุดในสองบล็อกเราสามารถกำหนดภาคแฟลชใดที่เป็นค่าล่าสุดที่เก็บไว้ในภาคแฟลช
เมื่อค่าล่าสุดถูกเก็บไว้ในภาคแรกการเขียนครั้งต่อไปจะถูกเขียนในภาคที่สองและในทางกลับกัน
TFDB_Err_Code tfdb_port_read ( tfdb_addr_t addr , uint8_t * buf , size_t size );
TFDB_Err_Code tfdb_port_erase ( tfdb_addr_t addr , size_t size );
TFDB_Err_Code tfdb_port_write ( tfdb_addr_t addr , const uint8_t * buf , size_t size ); /* use string.h or self functions */
#define TFDB_USE_STRING_H 1
#if TFDB_USE_STRING_H
#include "string.h"
#define tfdb_memcpy memcpy
#define tfdb_memcmp memcmp
#define TFDB_MEMCMP_SAME 0
#else
#define tfdb_memcpy
#define tfdb_memcmp
#define TFDB_MEMCMP_SAME
#endif
#define TFDB_DEBUG printf
/* The data value in flash after erased, most are 0xff, some flash maybe different.
* if it's over 1 byte, please be care of little endian or big endian. */
#define TFDB_VALUE_AFTER_ERASE 0xff
/* The size of TFDB_VALUE_AFTER_ERASE, only support 1 / 2 / 4.
* This value must not bigger than TFDB_WRITE_UNIT_BYTES. */
#define TFDB_VALUE_AFTER_ERASE_SIZE 1
/* the flash write granularity, unit: byte
* only support 1(stm32f4)/ 2(CH559)/ 4(stm32f1)/ 8(stm32L4) */
#define TFDB_WRITE_UNIT_BYTES 8 /* @note you must define it for a value */
/* @note the max retry times when flash is error ,set 0 will disable retry count */
#define TFDB_WRITE_MAX_RETRY 32
/* must not use pointer type. Please use uint32_t, uint16_t or uint8_t. */
typedef uint32_t tfdb_addr_t ;หลังจากลบข้อมูลการพิมพ์ดีบั๊กทรัพยากรจะใช้งานดังนี้:
ตัวเลือกการเพิ่มประสิทธิภาพการรวบรวม KEIL -O2
Code ( inc . data ) RO Data RW Data ZI Data Debug Object Name
154 0 0 0 0 2621 tfdb_port . o
682 0 0 0 0 4595 tinyflashdb . oตัวเลือกการเพิ่มประสิทธิภาพการรวบรวม GCC -OS
. text . tfdb_port_read
0x00000000000039b4 0x1a ./ Drivers / TFDB / tfdb_port . o
0x00000000000039b4 tfdb_port_read
. text . tfdb_port_erase
0x00000000000039ce 0x46 ./ Drivers / TFDB / tfdb_port . o
0x00000000000039ce tfdb_port_erase
. text . tfdb_port_write
0x0000000000003a14 0x5c ./ Drivers / TFDB / tfdb_port . o
0x0000000000003a14 tfdb_port_write
. text . tfdb_check
0x0000000000003a70 0x56 ./ Drivers / TFDB / tinyflashdb . o
0x0000000000003a70 tfdb_check
. text . tfdb_init
0x0000000000003ac6 0x56 ./ Drivers / TFDB / tinyflashdb . o
0x0000000000003ac6 tfdb_init
. text . tfdb_set
0x0000000000003b1c 0x186 ./ Drivers / TFDB / tinyflashdb . o
0x0000000000003b1c tfdb_set
. text . tfdb_get
0x0000000000003ca2 0x11c ./ Drivers / TFDB / tinyflashdb . o
0x0000000000003ca2 tfdb_get รูทีนการโยกย้ายโลหะเปลือย RT-thread สามารถใช้กับการอ้างอิง:
STM32F429IGT6
CH583
กลุ่มสื่อสาร QQ: 562090553