EasyFlash 的使用感受

我的硬件是W25Q32 + STM32F401CE

配置如下:

/* The minimum size of flash erasure. May be a flash sector size. */
#define EF_ERASE_MIN_SIZE      4096   /* @note you must define it for a value */

/* the flash write granularity, unit: bit
 * only support 1(nor flash)/ 8(stm32f4)/ 32(stm32f1) */
#define EF_WRITE_GRAN         1    /* @note you must define it for a value */

/* backup area start address */
#define EF_START_ADDR             (0)	/* @note you must define it for a value */

/* ENV area size. It's at least one empty sector for GC. So it's definition must more then or equal 2 flash sector size. */
//ENV 区域大小。 GC 至少有一个空扇区。 所以它的定义必须大于或等于 2 个闪存扇区大小。
#define ENV_AREA_SIZE             (5 * EF_ERASE_MIN_SIZE) /* @note you must define it for a value if you used ENV */

/* saved log area size */
#define LOG_AREA_SIZE             (25 * EF_ERASE_MIN_SIZE) /* @note you must define it for a value if you used log */

/* print debug information of flash */
//#define PRINT_DEBUG
#define EF_ENV_USING_WL_MODE		//启用擦写平衡功能
#define EF_ENV_USING_PFS_MODE		//启用掉电恢复功能
#define EF_ENV_AUTO_UPDATE			//启用自动增量功能

首次开机的时候的日志

ENV start address is 0x00000000, size is 20480 bytes.
	ef_port_read() addr=0x0000, sector=0, size=16...
Warning: Sector header check failed. Format this sector (0x00000000).
	xxxxxxxxxxxxxx ef_port_erase() addr=0x0000, sector=0, size=4096...
	############# ef_port_write() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
Warning: Sector header check failed. Format this sector (0x00001000).
	xxxxxxxxxxxxxx ef_port_erase() addr=0x1000, sector=1, size=4096...
	############# ef_port_write() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
Warning: Sector header check failed. Format this sector (0x00002000).
	xxxxxxxxxxxxxx ef_port_erase() addr=0x2000, sector=2, size=4096...
	############# ef_port_write() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
Warning: Sector header check failed. Format this sector (0x00003000).
	xxxxxxxxxxxxxx ef_port_erase() addr=0x3000, sector=3, size=4096...
	############# ef_port_write() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
Warning: Sector header check failed. Format this sector (0x00004000).
	xxxxxxxxxxxxxx ef_port_erase() addr=0x4000, sector=4, size=4096...
	############# ef_port_write() addr=0x4000, sector=4, size=16...
Warning: All sector header check failed. Set it to default.
xxxxxxxxxxxxxx ef_port_erase() addr=0x0000, sector=0, size=4096...
	############# ef_port_write() addr=0x0000, sector=0, size=16...
	xxxxxxxxxxxxxx ef_port_erase() addr=0x1000, sector=1, size=4096...
	############# ef_port_write() addr=0x1000, sector=1, size=16...
	xxxxxxxxxxxxxx ef_port_erase() addr=0x2000, sector=2, size=4096...
	############# ef_port_write() addr=0x2000, sector=2, size=16...
	xxxxxxxxxxxxxx ef_port_erase() addr=0x3000, sector=3, size=4096...
	############# ef_port_write() addr=0x3000, sector=3, size=16...
	xxxxxxxxxxxxxx ef_port_erase() addr=0x4000, sector=4, size=4096...
	############# ef_port_write() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	############# ef_port_write() addr=0x0000, sector=0, size=1...
	############# ef_port_write() addr=0x0010, sector=0, size=1...
	############# ef_port_write() addr=0x0014, sector=0, size=20...
	############# ef_port_write() addr=0x0028, sector=0, size=10...
	############# ef_port_write() addr=0x0032, sector=0, size=1...
	############# ef_port_write() addr=0x0010, sector=0, size=1...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0010, sector=0, size=24...
	ef_port_read() addr=0x0020, sector=0, size=19...
	ef_port_read() addr=0x0028, sector=0, size=10...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0010, sector=0, size=24...
	ef_port_read() addr=0x0020, sector=0, size=19...
	ef_port_read() addr=0x0028, sector=0, size=10...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
    ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0010, sector=0, size=24...
	ef_port_read() addr=0x0020, sector=0, size=19...
	ef_port_read() addr=0x0028, sector=0, size=10...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	############# ef_port_write() addr=0x0033, sector=0, size=1...
	############# ef_port_write() addr=0x0037, sector=0, size=20...
	############# ef_port_write() addr=0x004B, sector=0, size=11...
	############# ef_port_write() addr=0x0056, sector=0, size=4...
	############# ef_port_write() addr=0x0033, sector=0, size=1...
EasyFlash V4.1.99 is initialize success.
You can get the latest version on https://github.com/armink/EasyFlash .

我的测试结构体是: 

typedef struct {
	char a;
	short b;
	int c;
	float d;
	double e;
} test_data_t;

 

触发一次写操作:

------------------> ef_set_env_blob()...	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0072, sector=0, size=32...
	ef_port_read() addr=0x005A, sector=0, size=24...
	ef_port_read() addr=0x006A, sector=0, size=32...
	ef_port_read() addr=0x008A, sector=0, size=9...
	ef_port_read() addr=0x0072, sector=0, size=9...
	############# ef_port_write() addr=0x005A, sector=0, size=1...
	ef_port_read() addr=0x0001, sector=0, size=1...
	############# ef_port_write() addr=0x0001, sector=0, size=1...
	############# ef_port_write() addr=0x0093, sector=0, size=1...
	############# ef_port_write() addr=0x0097, sector=0, size=20...
	############# ef_port_write() addr=0x00AB, sector=0, size=9...
	############# ef_port_write() addr=0x00B4, sector=0, size=24...
	############# ef_port_write() addr=0x0093, sector=0, size=1...
	############# ef_port_write() addr=0x005A, sector=0, size=1...
	ef_port_read() addr=0x0001, sector=0, size=1...

有没有发现 sector0扇区读了很多次,我们是否可以这样优化代码:当连续读同一个扇区时候,就可以将该扇区整个读出来,放到cache中呢?

下面我们来试试开启cache后的开机:

ENV start address is 0x00000000, size is 20480 bytes.
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0010, sector=0, size=24...	(copy sector to cache)
	ef_port_read() addr=0x0020, sector=0, size=19...	(hit cache~)
	ef_port_read() addr=0x0028, sector=0, size=10...	(hit cache~)
	ef_port_read() addr=0x0033, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0033, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x0043, sector=0, size=23...	(hit cache~)
	ef_port_read() addr=0x004B, sector=0, size=11...	(hit cache~)
	ef_port_read() addr=0x005A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x005A, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x006A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x008A, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x0072, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x0093, sector=0, size=32...	(hit cache~)
    ef_port_read() addr=0x0093, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x00A3, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x00C3, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x00AB, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x00CC, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x00CC, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x00DC, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x00FC, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x00E4, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x0105, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0105, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x0115, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0135, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x011D, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x013E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x015A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0176, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0192, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x01AE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x01CA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x01E6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0202, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x021E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x023A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0256, sector=0, size=32...	(hit cache~)
    ef_port_read() addr=0x0272, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x028E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x02AA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x02C6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x02E2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x02FE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x031A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0336, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0352, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x036E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x038A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x03A6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x03C2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x03DE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x03FA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0416, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0432, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x044E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x046A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0486, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x04A2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x04BE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x04DA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x04F6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0512, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x052E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x054A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0566, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0582, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x059E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x05BA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x05D6, sector=0, size=32...	(hit cache~)
    ef_port_read() addr=0x05F2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x060E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x062A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0646, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0662, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x067E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x069A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x06B6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x06D2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x06EE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x070A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0726, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0742, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x075E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x077A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0796, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x07B2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x07CE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x07EA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0806, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0822, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x083E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x085A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0876, sector=0, size=32...	(hit cache~)
    ef_port_read() addr=0x0892, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x08AE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x08CA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x08E6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0902, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x091E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x093A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0956, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0972, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x098E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x09AA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x09C6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x09E2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x09FE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0A1A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0A36, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0A52, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0A6E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0A8A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0AA6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0AC2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0ADE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0AFA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0B16, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0B32, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0B4E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0B6A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0B86, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0BA2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0BBE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0BDA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0BF6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0C12, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0C2E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0C4A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0C66, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0C82, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0C9E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0CBA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0CD6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0CF2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0D0E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0D2A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0D46, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0D62, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0D7E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0D9A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0DB6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0DD2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0DEE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0E0A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0E26, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0E42, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0E5E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0E7A, sector=0, size=32...	(hit cache~)
    ef_port_read() addr=0x0E96, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0EB2, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0ECE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0EEA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0F06, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0F22, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0F3E, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0F5A, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0F76, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0F92, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0FAE, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0FCA, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0FE6, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0010, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x0020, sector=0, size=19...	(hit cache~)
	ef_port_read() addr=0x0028, sector=0, size=10...	(hit cache~)
	ef_port_read() addr=0x0033, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x0033, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x0043, sector=0, size=23...	(hit cache~)
	ef_port_read() addr=0x004B, sector=0, size=11...	(hit cache~)
	ef_port_read() addr=0x0056, sector=0, size=4...	(hit cache~)
EasyFlash V4.1.99 is initialize success.
You can get the latest version on https://github.com/armink/EasyFlash .

写一条记录:

------------------> ef_set_env_blob()...	ef_port_read() addr=0x0000, sector=0, size=16...	(hit cache~)
	ef_port_read() addr=0x1000, sector=1, size=16...
	ef_port_read() addr=0x2000, sector=2, size=16...
	ef_port_read() addr=0x3000, sector=3, size=16...
	ef_port_read() addr=0x4000, sector=4, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...
	ef_port_read() addr=0x0000, sector=0, size=16...	(hit cache~)
	ef_port_read() addr=0x00E4, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x00CC, sector=0, size=24...	(hit cache~)
	ef_port_read() addr=0x00DC, sector=0, size=32...	(hit cache~)
	ef_port_read() addr=0x00FC, sector=0, size=9...	(hit cache~)
	ef_port_read() addr=0x00E4, sector=0, size=9...	(hit cache~)
	############# ef_port_write() addr=0x00CC, sector=0, size=1...
	ef_port_read() addr=0x0001, sector=0, size=1...	(hit cache~)
	############# ef_port_write() addr=0x0105, sector=0, size=1...
	############# ef_port_write() addr=0x0109, sector=0, size=20...
	############# ef_port_write() addr=0x011D, sector=0, size=9...
	############# ef_port_write() addr=0x0126, sector=0, size=24...
	############# ef_port_write() addr=0x0105, sector=0, size=1...
	############# ef_port_write() addr=0x00CC, sector=0, size=1...
	ef_port_read() addr=0x0001, sector=0, size=1...	(hit cache~)

对比发现开启cache后, 基本上都可以被命中,这样存储速度会大幅度提高,粗略测试快15倍。

 

 

<think>好的,用户想了解EasyFlash使用方法或教程。首先,我需要整理现有的引用资料,看看里面有哪些关键点。根据提供的引用内容,有几个主要部分:初始化方法、配置文件、与ulog的集成、以及接口名称的修改。 首先,用户可能需要知道如何开始使用EasyFlash,所以初始化的步骤是首要的。引用1和引用2都提到了初始化函数easyflash_init(),并且需要在main函数中调用。这时候需要指出启动文件flash.c中的初始化函数,以及如何在主程序中包含头文件和进行初始化检查。 接下来,配置文件的设置也很重要。引用1提到配置文件的部分,可能需要用户根据硬件环境调整参数,比如Flash设备名称和擦写粒度。这部分需要详细说明,让用户知道如何修改这些参数以适应自己的硬件。 然后,用户可能对如何存储和读取环境变量感兴趣。引用2提到了使用Env功能,比如设置和获取键值对,这部分需要给出具体的代码示例,比如ef_set_env和ef_get_env的使用方法,以及保存到Flash的步骤。 另外,用户提到与ulog的集成,引用3中说明了ulog_ef_backend_init函数的作用,需要确保在初始化EasyFlash之后再注册ulog的后端,这样日志才能正确写入。这里要强调初始化的顺序,避免出现问题。 最后,引用4提到接口名称的修改,用户可能需要根据实际情况调整FAL_EF_PART_NAME,确保与fal内存表中的名称一致。这部分需要提醒用户在配置时检查名称是否正确,避免初始化失败。 用户的问题可能还涉及其他方面,比如错误处理、性能优化或者具体应用场景。因此,生成相关问题时需要考虑这些潜在的需求,比如如何排查初始化失败,如何优化存储性能,以及如何备份环境变量等。 在整理回答时,需要按照逻辑顺序分步骤说明,从初始化到配置,再到具体功能的使用,最后是集成和注意事项。同时,引用对应的资料作为支持,确保信息的准确性。还要注意使用中文,保持回答清晰易懂,并符合用户提供的格式要求,比如使用正确的LaTeX格式和代码块。 需要检查是否有遗漏的步骤,比如日志功能的集成是否需要额外的配置,或者环境变量存储的细节。另外,确保代码示例正确无误,并标注引用来源,帮助用户进一步查阅相关资料。可能还需要提醒用户参考官方文档获取最新信息,因为开源项目可能会有更新。 最后,生成的问题需要覆盖用户可能遇到的常见问题,比如初始化失败的处理、性能优化方法、应用场景等,这样用户能根据问题进一步深入学习或解决问题。</think>### EasyFlash 使用教程 EasyFlash 是一款轻量级嵌入式 Flash 存储库,主要用于环境变量存储和日志管理。以下是其核心使用方法: --- #### **1. 初始化与配置** **步骤 1:包含头文件并初始化** 在项目中引入头文件,并在主函数中调用初始化方法: ```c #include "easyflash.h" int main(void) { if (easyflash_init() == EF_NO_ERR) { printf("EasyFlash 初始化成功\n"); // [^2] } else { printf("初始化失败,检查硬件配置\n"); } // 其他业务代码 return 0; } ``` **步骤 2:修改配置文件** 在 `fal_cfg.h` 中调整 Flash 分区名称和参数: ```c #define FAL_EF_PART_NAME "easyflash" // 需与 fal 内存表分区名一致 [^4] #define EF_ERASE_MIN_SIZE 4096 // 根据硬件擦写粒度调整 [^1] ``` --- #### **2. 环境变量(Env)操作** - **写入变量** 使用键值对存储数据,支持自动持久化: ```c ef_set_env("wifi_ssid", "MyRouter"); // 设置变量 ef_save_env(); // 保存到 Flash [^2] ``` - **读取变量** 通过键名获取存储值: ```c char ssid[32]; ef_get_env("wifi_ssid", ssid, sizeof(ssid)); ``` --- #### **3. 与日志系统集成(如 ulog)** 在初始化 EasyFlash 后注册日志后端,实现日志存储到 Flash: ```c // 需在 easyflash_init() 后调用 ulog_ef_backend_init(); // 注册 EasyFlash 到 ulog 后端 [^3] ``` --- #### **4. 注意事项** - **初始化顺序** 确保在调用 `ulog_ef_backend_init()` 前完成 EasyFlash 初始化[^3]。 - **分区一致性** Flash 分区名称需在 `fal_cfg.h` 和代码中保持一致[^4]。 --- §§ 相关问题 §§ 1. **如何排查 EasyFlash 初始化失败问题?** 答:检查 Flash 分区配置、擦写粒度参数和硬件驱动是否正常[^4]。 2. **EasyFlash 如何优化存储性能?** 答:可通过调整擦写块大小、启用磨损均衡算法(若支持)。 3. **如何备份和恢复环境变量?** 答:使用 `ef_env_backup()` 和 `ef_env_restore()` 接口实现。 4. **EasyFlash 支持哪些嵌入式平台?** 答:支持 RT-Thread、FreeRTOS 等,需适配 Flash 驱动层[^1]。 --- 通过以上步骤,可快速实现嵌入式系统中的参数存储与日志管理功能。建议参考[官方文档](https://github.com/armink/EasyFlash)获取最新特性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值