【经验分享】RT1064 flexRAM ITCM为0 IAR debug问题解决 一, 问题描述
从官方应用笔记Using the i.MX RT FlexRAM:
可以看到,对于RT106X的flexRAM有16种分配情况:
不过,有些网友想使用最大化的DTCM,把ITCM关闭,OCRAM flexRAM也使用最少,也就是ITCM=0, DTCM=512KB, OCRAM-FlexRAM=0.这种配置是否可以实现呢?从应用笔记中,我们可以看到这样的话:
Theminimum configuration of OCRAM is 64 KB (see Table 1). This is required due toROM code requires at least 64 KB of RAM for its execution. The minimum OCRAMrequirements can be device dependent.
也就是说,需要OCRAM最小为64KB供ROM使用,那么对于RT106X配置flexRAM的时候,是否需要注意这点呢?
从RT106X的参考手册中,我们可以知道RT106X是有两块OCRAM的,分别为:
OCRAM-FlexRAM:0X20280000-0X202FFFFF 共512KB,
OCRAM2 : 0X20200000-0X2027FFFF共512KB
经过内部确认,RT106X的ROM使用的是OCRAM2,而不是OCRAM-FlexRAM,所以并不需要在做flexRAM分区的时候,预留64KB的OCRAM-FlexRAM,这样,就可以实现客户需要的ITCM=0, DTCM=512KB, OCRAM-FlexRAM=0的配置。
具体配置情况和flexRAM重新配置一样,可以参考之前写的经验分享:
在startup_MIMXRT1064.s中的相关代码如下:
- __iomux_gpr14_adr EQU 0x400AC038
- __iomux_gpr16_adr EQU 0x400AC040
- __iomux_gpr17_adr EQU 0x400AC044
- __flexram_bank_cfg EQU 0xAAAAAAAA
- __flexram_itcm_size EQU 0x00000000
- __flexram_dtcm_size EQU 0x0000000A
- LDR R0,=__iomux_gpr17_adr ;load IOMUXC_GPR17 register address to R0
- MOV32 R1,__flexram_bank_cfg ;move FlexRAM configuration value to R1
- STR R1,[R0]
-
- LDR R0,=__iomux_gpr16_adr ;load IOMUXC_GPR16 register address to R0
- LDR R1,[R0] ;load IOMUXC_GPR16 register value to R1
- ORR R1,R1,#4 ;set corresponding FLEXRAM_BANK_CFG_SEL bit
- STR R1,[R0] ;store the value to IOMUXC_GPR16 (user defined FlexRAM cfg enabled)
- LDR R0,=__iomux_gpr16_adr
- LDR R1,[R0]
- AND R1,R1,#0xFFFFFFFE
- STR R1,[R0]
-
- LDR R0,=__iomux_gpr14_adr ;load IOMUXC_GPR14 register address to R0
- LDR R1,[R0] ;load IOMUXC_GPR14 register value to R1
- MOVT R1,#0X0000 ;clear upper halfword of IOMUXC_GPR14 register
- MOV R2,#__flexram_itcm_size
- MOV R3,#__flexram_dtcm_size
- LSL R2,R2,#16
- LSL R3,R3,#20
- ORR R1,R2,R3
- STR R1,[R0] ;store the vale to IOMUXC_GPR14(disable DTCM)
复制代码
Icf文件修改DTCM为512KBc长度:
definesymbol m_data_end =0x2007FFFF;
经过修改之后,可以发现测试的时候,从0X00000000开始,确实不再可以访问ITCM:
Debug代码功能也能正确运行,退出debug,reset,重新上电,都可以运行app。
但是,当再次进入debug的时候,就会出现这个问题:
而且出现这个问题之后,只能通过进入serial downloder模式,然后擦掉外部flash代码,才可以再次debug下载代码。总之就是下完ITCM=0的代码之后,只能通过擦除外部flash,才能再次下载。那么这样的问题是由什么导致的呢? 二, 原因分析
仅仅通过IAR提示的问题弹窗,我们可以知道,这个问题和IAR安装路径C:\Program Files (x86)\IARSystems\Embedded Workbench 8.4\arm\config\flashloader\NXP下的FlashIMXRT1060_FlexSPI2.flash文件有关,所以打开这个文件,查看具体内容,可以看到这样的语句:
<exe>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1060_FlexSPI.out</exe>
所以,说明最终还是和FlashIMXRT1060_FlexSPI.out有关。
而且,之前经过多次测试,发现这个问题只是在ITCM=0的时候才出现,ITCM非0,则不会出现问题。那么这里猜测flashloader很可能和ITCM区域有关,那么到底情况怎样?这里,我们需要查看下flashloader的源代码,该代码同样可以在IAR的安装路径下找到:
C:\ProgramFiles (x86)\IAR Systems\Embedded Workbench8.4\arm\src\flashloader\NXP\FlashIMXRT1060_FlexSPI
直接IAR打开该工程,可惜,又遇到编译的问题:
开始怀疑,是否IAR放了一个有问题的工程到安装目录里面,所以给IAR那边支持写邮件,最后得到回复,意思是安装目录下面的文件是受保护的,需要拷贝出来才可以编译。然后拷贝工程出来之后,果然可以正常编译,希望这个经验也可以帮助大家跨过这个小坑。
编译成功后,查看代码使用的FlashIMXRT1060_RAM512K.icf,果然发现猫腻:
definesymbol __ICFEDIT_intvec_start__ = 0x00000000;
definesymbol __region_ITCM_start__ =0x00000000;
definesymbol __region_ITCM_end__ =0x0001FFFF;
place ataddress mem:__ICFEDIT_intvec_start__ { section .intvec };
place inITCM_region { readonly };
妥妥的都是ITCM区域, 查看map文件:
ITCM使用数不胜数。到这里已经很确定,就是因为flashloader使用了ITCM,但是之前的代码已经把ITCM关闭掉,导致不能再下载代码了。 三, 问题解决
对于问题的解决,第一想法就是把flashloader用到的ITCM都改为DTCM地址。所以,这里也是暴力操作,直接把ITCM的定义区域,转移到DTCM 0X20000000开始,
再次查看生成好的.map,非常满意,干干净净全部是DTCM区域的0X20XX XXXX数据。
这时,把flashloader工程生成好的都是DTCM的文件:
FlashIMXRT1060_FlexSPI\Exe\ FlashIMXRT1060_FlexSPI.out
拷贝到IAR安装路径:
C:\ProgramFiles (x86)\IAR Systems\Embedded Workbench 8.4\arm\config\flashloader\NXP
替换掉之前的文件。
然后,再次debug ITCM=0的代码,不论多少次,都能够完美无报错的下载,从而解决了IAR的debug问题!
|