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区域。