ใช้ flash เพื่อจำลองประสบการณ์การใช้งานของ eeprom
void ee_flashInit() : Format Flash เฉพาะแฟลชที่จัดรูปแบบเท่านั้นสามารถใช้ฟังก์ชั่น API สองฟังก์ชั่นต่อไปนี้ee_uint8 ee_readDataFromFlash() : อ่านข้อมูลee_uint8 ee_writeDataToFlash(); : เขียนข้อมูลvariableLists ตารางตัวแปร enum เพื่ออ่านและเขียนข้อมูลในแฟลชผ่านตารางนี้ก่อนอื่นป้อนไฟล์ส่วนหัวและกรอก มาโครทั้งสี่ อย่างเต็มรูปแบบตามความคิดเห็น
SECTOR_SIZE : ขนาดความจุของภาค (หน่วยเก็บข้อมูลขั้นต่ำของแฟลช) ที่แฟลชปัจจุบันee_flashWrite : ชื่อฟังก์ชั่นไดรเวอร์การทำงานของแฟลชเขียนee_flashRead : Flash Read Read Operation Driver Function ชื่อee_flashEraseASector : แฟลชลบเซกเตอร์ (หน่วยหน่วยความจำขั้นต่ำของแฟลช) ชื่อฟังก์ชั่นไดรเวอร์แมโครที่เติมได้ (ไม่มีการเติมไม่ส่งผลกระทบต่อการทำงานของฟังก์ชั่น)
BLOCk_SECTOR_NUM : มีกี่ภาคส่วนในบล็อกของแฟลช?แมโครพิเศษสองตัว:
SECTORS(x) : ส่งคืนขนาดรวมของเซกเตอร์ xBLOCKS(x) : ส่งคืนขนาดรวมของบล็อก x ในการใช้มาโครนี้คุณต้องเติมแมโคร BLOCk_SECTOR_NUM ล่วงหน้า มาโครสองตัวข้างต้นส่วนใหญ่จะใช้เพื่อถ่ายโอนพารามิเตอร์ของฟังก์ชัน ee_flashInit() เพื่ออำนวยความสะดวกในการใช้ที่อยู่แฟลช
ตัวอย่าง:
// 首先在flash_MemMang.h枚举类型中添加数据名,用于管理数据
typedef enum
{
// 用户将变量名添加到下面
G_MYSENSORDATA ,
G_FLOAT ,
// DATA_NUM用于标识flash中一共存了多少个数据(不允许删改)
DATA_NUM ,
} variableLists ;
//------------------主函数-------------
/* 创建flash管理句柄 */
ee_flash_t g_fm ;
/* 想要存入flash中的变量 */
int g_mySensorData = 16 ;
float g_float = 3.14 ;
char g_txt [ 20 ] = "change data test" ;
int main ( void )
{
int dataTmp = 0 ;
float ftmp = 0 ;
char tt [ 20 ];
/* 格式化传入地址的格式 */
ee_flashInit ( & g_fm , /* 管理句柄 */
SECTORS ( 0 ), /* 索引区起始地址 */
SECTORS ( 2 ), /* 交换索引区起始地址 */
2 , /* 总索引区大小(单位:扇区) */
1 , /* 索引区大小(详见README图例,indexRegionSize) */
SECTORS ( 4 ), /* 数据区起始地址 */
SECTORS ( 5 ), /* 交换数据区起始地址 */
1 ); /* 数据区大小(单位:扇区) */
/* 数据写入顺序错误,写入失败 */
ee_writeDataToFlash ( & g_fm , & g_float , sizeof ( g_float ), G_FLOAT );
ee_writeDataToFlash ( & g_fm , & g_mySensorData , sizeof ( g_mySensorData ), G_MYSENSORDATA );
/* 正确将数据写入flash */
ee_writeDataToFlash ( & g_fm , & g_mySensorData , sizeof ( g_mySensorData ), G_MYSENSORDATA );
ee_writeDataToFlash ( & g_fm , & g_float , sizeof ( g_float ), G_FLOAT );
/* 将数据读出 */
ee_readDataFromFlash ( & g_fm , & dataTmp , G_MYSENSORDATA );
ee_readDataFromFlash ( & g_fm , & ftmp , G_FLOAT );
/* 将G_FLOAT管理的数据改成g_txt */
ee_writeDataToFlash ( & g_fm , g_txt , strlen ( g_txt ) + 1 , G_FLOAT );
/* 再读取一次数据 */
dataTmp = 0 ;
ee_readDataFromFlash ( & g_fm , & dataTmp , G_MYSENSORDATA );
ee_readDataFromFlash ( & g_fm , & tt , G_FLOAT );
}แฟลชสามารถเปลี่ยน 1 เป็น 0 และสามารถเปลี่ยน 0 เป็น 1 โดยการลบทั้งภาค (โครงสร้างการจัดเก็บขั้นต่ำของแฟลช) ดังนั้นหากมีการเขียนที่อยู่เป็นลายลักษณ์อักษรหากมีการเขียนอีกครั้งมันจะทำให้บิตที่กลายเป็น 0 ถึง 1 ส่งผลให้ข้อมูลไม่ถูกต้อง
แนวคิดของโปรแกรมนี้คือการเขียนข้อมูลที่คุณต้องการเขียนใหม่ไปยังพื้นที่ที่ไม่ได้เขียนในภายหลัง ข้อมูลที่เขียนก่อนจะถูกยกเลิกและข้อมูลที่เป็นลายลักษณ์อักษรล่าสุดจะถือว่าถูกต้อง รอจนกระทั่งพื้นที่ทั้งหมดเต็มถ่ายโอนข้อมูลที่ถูกต้องไปยังพื้นที่อื่นจากนั้นลบพื้นที่ปัจจุบันทั้งหมด
แผนภาพโครงสร้างภายในของแฟลชที่ใช้โดยโปรแกรม:

หลังจากทำการจัดรูปแบบ void ee_flashInit() แฟลชการจัดรูปแบบเค้าโครงแฟลชที่จัดรูปแบบจะแสดงในรูปด้านบน
พื้นที่ดัชนีทั้งหมด: มีสองพื้นที่ พื้นที่ดัชนีและพื้นที่เขียนใหม่
พื้นที่ดัชนี : โครงสร้างดัชนีที่ใช้ในการจัดเก็บข้อมูลแต่ละรายการ ตำแหน่งที่อยู่ของแต่ละโครงสร้างดัชนีได้รับการแก้ไข ตัวอย่างเช่นที่อยู่ของข้อมูลหมายเลข 1 คือ 0x00 จากนั้นที่อยู่ของข้อมูลหมายเลข 2 คือ 0x08 ผู้ใช้สามารถระบุขนาดของพื้นที่ดัชนี สำหรับข้อกำหนดขนาดโปรดดูสูตรต่อไปนี้: จำนวนข้อมูลที่สามารถเก็บไว้ในพื้นที่ดัชนี = จำนวนทั้งหมดของไบต์ในพื้นที่ดัชนี/8
/* 数据索引结构 */
typedef struct
{
/* 当前数据状态 */
ee_uint16 dataStatus ;
/* 当前数据大小 */
ee_uint16 dataSize ;
/* 当前数据在数据区的地址(相对于dataStartAddr的偏移地址) */
ee_uint16 dataAddr ;
/* 当前数据被重写的地址(相对于overwriteAddr的偏移地址),默认为0xFFFF */
ee_uint16 dataOverwriteAddr ;
} ee_dataIndex ;พื้นที่เขียนใหม่ : เมื่อข้อมูลในพื้นที่ดัชนีข้อมูลถูกเขียนใหม่โครงสร้างดัชนีการเขียนใหม่จะถูกบันทึกไว้ในพื้นที่ปัจจุบัน
พื้นที่การนับซ้ำ : จัดสรรโดยอัตโนมัติโดยโปรแกรมและผู้ใช้ไม่จำเป็นต้องดูแล พื้นที่นี้บันทึกจำนวนครั้งที่มีการเขียนพื้นที่ใหม่ในปัจจุบันและใช้เพื่อค้นหาตำแหน่งฟรีของพื้นที่เขียนใหม่
พื้นที่ข้อมูล: บันทึกค่าจริงที่เราเก็บไว้ในแฟลช ขนาดและการอ่านและเขียนที่อยู่ออฟเซ็ต ของแต่ละค่าได้รับการจัดการโดยโครงสร้างดัชนีของพื้นที่ดัชนี
พื้นที่แลกเปลี่ยน : เมื่อพื้นที่กิจกรรมเต็มดัชนีข้อมูลที่ถูกต้องทั้งหมดของพื้นที่กิจกรรมจะถูกถ่ายโอนไปยังพื้นที่นี้เป็นพื้นที่กิจกรรมและในเวลาเดียวกันล้างพื้นที่กิจกรรมก่อนหน้าและใช้เป็นพื้นที่กิจกรรมถัดไป
การจัดการสถานะ :
การจัดการของรัฐใช้เพื่อจัดการกับปรากฏการณ์ที่ผิดปกติต่าง ๆ ของไมโครคอนโทรลเลอร์เช่นการหยุดทำงานของไมโครคอนโทรลเลอร์เมื่อใช้งานแฟลช