8. 以指针方式直接访问系统 Flash 中的资源文件

系统上电初始化后,CPU会通过内存控制器将系统Flash的映射到内存地址空间。这部分映射区域可以通过Cache进行加速访问。通过文件系统(VFS)获取到资源文件在系统Flash中的**物理起始簇号**后,结合已知的系统Flash映射基地址,即可计算出该文件内容在内存中的**直接访问地址**。

8.1. 示例代码

首先,需要通过虚拟文件系统(VFS)打开目标文件并获取其关键属性。

1void *pvfs = 0;    // 文件系统句柄
2void *pvfile = 0;  // 文件句柄
3// ... ... 此处为打开文件 (pvfs, pvfile) 的代码 ...
4
5struct vfs_attr attr;                 // 文件属性结构体
6vfs_get_attrs(pvfile, &attr);         // 获取文件属性
7u8* pdata = (u8 *)(boot_info.sfc.app_addr + attr.sclust);
8u32 file_len = attr.fsize;

8.2. 关键变量说明

  • boot_info.sfc.app_addr: 系统启动信息中记录的应用程序区Flash映射到内存的**基地址**。

  • attr.sclust: 通过 vfs_get_attrs 获取的文件**起始簇号**(Cluster Number)。

  • attr.fsize: 通过 vfs_get_attrs 获取的**文件实际大小**(字节)。

  • pdata: 计算得到的,指向文件内容首字节的**直接内存指针**。

8.3. 重要注意事项

注意

  1. Cache管理范围限制

    使用此方式访问的数据受到CPU Cache管理范围的限制。不同芯片型号的可用地址空间大小不同:

    • AD14N:通常为 32M字节

    • 其他AD系列(如AD15N,AD17N等):通常为 64M字节

    • 具体限制请以项目链接脚本(.ld文件)中的定义为准,超出范围的地址可能无法通过Cache正确访问。

注意

  1. 地址的持久有效性

    一旦成功通过 pdata = (u8 *)(boot_info.sfc.app_addr + attr.sclust) 计算出地址,该指针在文件关闭后依然有效并可以继续使用。这意味着你可以安全地关闭文件句柄(pvfile)以释放系统资源,而不会影响通过 pdata 对文件数据的读取。

8.4. 相关资源