.. _以指针方式直接访问系统 Flash 中的资源文件: 以指针方式直接访问系统 Flash 中的资源文件 ======================================================= 系统上电初始化后,CPU会通过内存控制器将系统Flash的映射到内存地址空间。这部分映射区域可以通过Cache进行加速访问。通过文件系统(VFS)获取到资源文件在系统Flash中的**物理起始簇号**后,结合已知的系统Flash映射基地址,即可计算出该文件内容在内存中的**直接访问地址**。 示例代码 ########################################################## 首先,需要通过虚拟文件系统(VFS)打开目标文件并获取其关键属性。 .. code-block:: c :linenos: :emphasize-lines: 6,7,8 void *pvfs = 0; // 文件系统句柄 void *pvfile = 0; // 文件句柄 // ... ... 此处为打开文件 (pvfs, pvfile) 的代码 ... struct vfs_attr attr; // 文件属性结构体 vfs_get_attrs(pvfile, &attr); // 获取文件属性 u8* pdata = (u8 *)(boot_info.sfc.app_addr + attr.sclust); u32 file_len = attr.fsize; 关键变量说明 ########################################################## * ``boot_info.sfc.app_addr``: 系统启动信息中记录的应用程序区Flash映射到内存的**基地址**。 * ``attr.sclust``: 通过 ``vfs_get_attrs`` 获取的文件**起始簇号**(Cluster Number)。 * ``attr.fsize``: 通过 ``vfs_get_attrs`` 获取的**文件实际大小**(字节)。 * ``pdata``: 计算得到的,指向文件内容首字节的**直接内存指针**。 重要注意事项 ########################################################## .. attention:: 1. **Cache管理范围限制** 使用此方式访问的数据受到CPU Cache管理范围的限制。不同芯片型号的可用地址空间大小不同: * **AD14N**:通常为 **32M字节** * 其他AD系列(如AD15N,AD17N等):通常为 **64M字节** * **具体限制请以项目链接脚本(.ld文件)中的定义为准**,超出范围的地址可能无法通过Cache正确访问。 .. attention:: 2. **地址的持久有效性** 一旦成功通过 ``pdata = (u8 *)(boot_info.sfc.app_addr + attr.sclust)`` 计算出地址,**该指针在文件关闭后依然有效并可以继续使用**。这意味着你可以安全地关闭文件句柄(``pvfile``)以释放系统资源,而不会影响通过 ``pdata`` 对文件数据的读取。 相关资源 ########################################################## * **演示视频**:`杰理AD 用指针方式直接访问系统flash中的资源文件 (https://www.bilibili.com/video/BV1grqnBiEZS/) `_