Skip to content

xip guide

wuzhuowen edited this page Feb 23, 2019 · 2 revisions

XIP(Execute-In-Place)


XIP 介绍

XR871的永久存储介质主要是使用spi norflash。在上电开机后BROM会先将norflash的内容搬运到ram中,然后跳转到RAM中开始执行。但是当遇到程序image比较大的时候会出现ram的大小不够用的情况,因此引入了XIP技术(Execute-In-Place),利用norflash的特性,把执行的代码段和只读数据段存放到flash中, 相当于CPU可以直接在norflash运行的效果。 xip_system.png

XIP 开启和配置

  • 工程配置文件 在工程gcc目录下localconfig.mk中,定义__PRJ_CONFIG_XIP为y,如__PRJ_CONFIG_XIP := y就可以开启XIP
  • 链接文件 若没有指定的链接文件时候,会默认使用appos_xip.ld,当需要指定链接文件的话,请务必需要保留xip段 ,如下: xip_ld.png
  • 区域1:就是声明了存在有FLASH这个存储单元,包括其其实地址和大小等属性
  • 区域2:就是xip的段名字
  • 区域3:就是xip段里面存储的内容
  • 区域4:就是指定xip段输出的存储单元

XIP 添加新模块

  • 按模块添加: 当添加了新的模块后,当运算性能和实时性要求不高的时候,可以考虑把新模块添加到XIP中,达到节省ram的效果。 在我们开启了XIP功能后,在链接脚本文件中的xip段加入模块的描述,例如我们新添加的模块为new_module,编译得到new_module.o,当然也可以打包成库为new_module.a,我们以.o为范例:

xip_new_module.png

  • 按函数添加: 当添加了一个新函数后,当运算性能和实时性要求不高的时候,同样可以把新函数单独加到XIP中而不是已模块的形式,就在函数描述中指定保存到xip段即可__attribute__((section (".xip_text"))),在SDK中已经定义了__xip_text使用,如下:

xip_new_func.png

  • 按函数删除: 当添加了一个新模块到xip后,当对运算性能和实时性要求的时候,需要指定某个函数不存放在xip中,就在函数描述中指定保存到nonxip段即可__attribute__((section (".nonxip_text"))),在SDK中同样已经定义了__nonxip_text使用,如下:

xip_new_nonxip_func.png

  • 按变量添加和删除: 声明变量的时候同意可以指定保存为xip和nonxip属性来确定保存的位置,在SDK中同样已经定义,分别是__xip_rodata__nonxip_rodata,使用的时候注意,只能是const类型才会定义到xip里面,使用如下:

xip_var.png

XIP 常见问题和调试

  • 开启xip确认是否保存到xip中: 当开启xip后添加了新函数,可以通过map文件或者objdump文件来确认是否达到预期效果

    • 1:查看map文件,在工程的gcc目录下会在编译的时候自动生成xxx.map文件,可以查看目标函数/变量保存的区域
    • 2:查看objdump文件,在工程的gcc目录下,使用make objdump产生xxx.dump文件,找到对应的函数/变量的地址,判断是否在指定的链接脚本的FLASH区域中。
  • 开启xip后开机失败: 当没有开启xip的时候可以正常启动,而开启xip后启动失败,参考解决步骤有以下:

    • 1:先确保开启xip后,在image.cfg里面有app_xip.bin的存在,如果没有请参考image_xip.cfg来设计image的配置文件,确保已经存放了xip段到flash中。
    • 2:确保新添加的函数/变量是否保存到xip中或者非xip中。
    • 3:新添加到xip的函数/变量必须在platform_xip_init()调用后使用。
  • 开启xip后出现卡顿: 当没有开启xip的时候可以正常使用,而开启xip后出现卡顿,应该是出现xip性能问题,参考解决步骤有以下:

    • 1:提高xip的线数,需要关闭SWD功能,修改对应工程下面的board_cfg.c文件中的g_flash_cfg.mode,一般为FLASH_READ_DUAL_O_MODE / FLASH_READ_QUAD_O_MODE。
    • 2:提高xip的操作速率,修改对应工程下面的board_cfg.c文件中的g_flash_cfg.clk,一般为24M/48M/64M/96M,需要注意的是当使用4线64M和4线96M的时候会出现flash异常,证明该flash型号不支持或者板子布线不对齐。
    • 3:当提高了xip的性能后都无法解决卡顿的问题,那么应该是新模块/函数有性能要求,尝试把新添加的模块/函数/变量指定为nonxip的看是否会有改善。
Clone this wiki locally