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. 重要注意事项
注意
Cache管理范围限制
使用此方式访问的数据受到CPU Cache管理范围的限制。不同芯片型号的可用地址空间大小不同:
AD14N:通常为 32M字节
其他AD系列(如AD15N,AD17N等):通常为 64M字节
具体限制请以项目链接脚本(.ld文件)中的定义为准,超出范围的地址可能无法通过Cache正确访问。
注意
地址的持久有效性
一旦成功通过
pdata = (u8 *)(boot_info.sfc.app_addr + attr.sclust)计算出地址,该指针在文件关闭后依然有效并可以继续使用。这意味着你可以安全地关闭文件句柄(pvfile)以释放系统资源,而不会影响通过pdata对文件数据的读取。