2.22. FLASH不完全指定物理空间用户区域使用
Overview
FLASH不完全指定物理空间用户区域是指: 用户需要预留出 flash的最后部分空间 为用户自己使用空间, 该空间与系统、工具毫无相关,分配给系统的flash大小不是flash的实际物理空间大小。
Note
使用情况: 当用户需要一块和系统、工具等毫无相关的flash区域时,可以开启FLASH不完全指定物理空间用户区域使用方法。
2.22.1. 示例
示例工程:示例工程实现需在 demo_DevKitBoard/include/demo_config.h
中开启宏 USE_FLASH_TEST_DEMO
。
2.22.2. 使用说明
Note
注意事项: 本次示例的不完全指定物理空间用户区域使用方法 和 FLASH用户区域的(对应cpu的tools目录下)isd_config_rule文件中EXIF_ADR项有本质区别。
FLASH用户区域方法的EXIF_ADR是工具会根据当前代码资源等情况在FLASH靠后分配一块可用大小的空间,系统运行后会分配用户区域给用户使用。
FLASH不完全指定物理空用户区域使用方法是和工具和系统毫无关联,系统运行后不会操作该空间,同时当在isd_config_rule(对应CPU路径)文件中EXIF_ADR配置使用,则用户同时可以使用EXIF_ADR区域。
比如:flash大小为16M,用户需要flash的最后4M地址不受系统相关限制且随意由用户自己掌控,则配置如下:
(1) 指定系统使用相关的物理空间,预留部分空间给用户,则在对应的CPU目录下的 isd_config_rule.c文件改”FLASH_SIZE=12M;”,即系统使用12M,剩下4M给用户使用
(2) flash使用API接口。
(具体说明,请参考 FLASH应用层API )
(3) main.c测试14M起始地址程序代码如下。
#include "app_config.h"
#include "system/includes.h"
#include "fs/fs.h"
#include "asm/sfc_norflash_api.h"
static void user_flash_test(void)
{
void flash_test(void);
void flash_read_write_init(void);
int flash_write_buff(u8 *buff, u32 addr, u32 len);
int flash_read_buff(u8 *buff, u32 addr, u32 len);
#if 0
flash_test();//flash测试,flash_test函数可以测试起始地址到结束地址
#else
//1.初始化flash硬件,并读取ID、容量等
flash_read_write_init();//初始化flash硬件,并读取ID、容量等
unsigned char *buff = malloc(4096);
if(buff){//4096字节读写测试
for (int i = 0; i < 4096; i++) {
buff[i] = (unsigned char)i;
}
//2.写数据
flash_write_buff(buff, 14*1024*1024, 4096);//14M地址起始测试,写
memset(buff, 0, 4096);
//3.读数据
flash_read_buff(buff, 14*1024*1024, 4096);//14M地址起始测试,读
for (int i = 0; i < 4096; i++) {
if (buff[i] != (unsigned char)i) {//校验
printf("user_flash_test test err buff[%d] = %d \n",i,buff[i]);
break;
}
}
free(buff);
}
printf("---> user_flash_test over \n");
#endif
while (1) {
os_time_dly(10);
}
}
static int c_main(void)
{
os_task_create(user_flash_test, NULL, 12, 1000, 0, "user_flash_test");
return 0;
}
late_initcall(c_main);
Note
注意: FLASH不完全指定物理空间用户区域 禁止使用 norflash_read 读函数。只能使用:norflash_origin_read。
2.22.3. 常见问题
(1) FLASH不完全指定物理空间用户区域使用方法和FLASH用户区域的isd_config_rule(对应CPU路径)文件中EXIF_ADR项有什么区别?
FLASH用户区域方法readme.md的EXIF_ADR是工具会根据当前代码资源等情况在FLASH靠后分配一块可用大小的空间,系统运行后会分配用户区域给用户使用。
FLASH不完全指定物理空间用户区域使用方法是和工具和系统毫无关联,系统运行后不会操作改空间,同时当在isd_config_rule(对应CPU路径)文件中EXIF_ADR配置使用,则用户同时可以使用EXIF_ADR区域。