请选择 进入手机版 | 继续访问电脑版
查看: 3187|回复: 2

[原创] 【经验分享】RT1064 flexRAM ITCM为0 IAR debug问题解决

[复制链接]

该用户从未签到

648

主题

6301

帖子

0

超级版主

Rank: 8Rank: 8

积分
19546
最后登录
2024-3-28
发表于 2020-7-8 17:02:20 | 显示全部楼层 |阅读模式

【经验分享】RT1064 flexRAM ITCM为0 IAR debug问题解决
一, 问题描述

从官方应用笔记Using the i.MX RT FlexRAM:


可以看到,对于RT106X的flexRAM有16种分配情况:

1.jpg

不过,有些网友想使用最大化的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中的相关代码如下:

  1. __iomux_gpr14_adr EQU 0x400AC038
  2. __iomux_gpr16_adr EQU 0x400AC040
  3. __iomux_gpr17_adr EQU 0x400AC044
  4. __flexram_bank_cfg EQU 0xAAAAAAAA
  5. __flexram_itcm_size EQU 0x00000000
  6. __flexram_dtcm_size EQU 0x0000000A

  7.     LDR R0,=__iomux_gpr17_adr ;load IOMUXC_GPR17 register address to R0
  8.     MOV32 R1,__flexram_bank_cfg ;move FlexRAM configuration value to R1
  9.     STR R1,[R0]
  10.    
  11.     LDR R0,=__iomux_gpr16_adr ;load IOMUXC_GPR16 register address to R0
  12.     LDR R1,[R0] ;load IOMUXC_GPR16 register value to R1
  13.     ORR R1,R1,#4 ;set corresponding FLEXRAM_BANK_CFG_SEL bit
  14.     STR R1,[R0] ;store the value to IOMUXC_GPR16 (user defined FlexRAM cfg enabled)

  15.     LDR R0,=__iomux_gpr16_adr
  16.     LDR R1,[R0]
  17.     AND R1,R1,#0xFFFFFFFE
  18.     STR R1,[R0]
  19.         
  20.     LDR R0,=__iomux_gpr14_adr ;load IOMUXC_GPR14 register address to R0
  21.     LDR R1,[R0] ;load IOMUXC_GPR14 register value to R1
  22.     MOVT R1,#0X0000 ;clear upper halfword of IOMUXC_GPR14 register
  23.     MOV R2,#__flexram_itcm_size
  24.     MOV R3,#__flexram_dtcm_size
  25.     LSL R2,R2,#16
  26.     LSL R3,R3,#20
  27.     ORR R1,R2,R3
  28.     STR R1,[R0] ;store the vale to IOMUXC_GPR14(disable DTCM)
复制代码


Icf文件修改DTCM为512KBc长度:

definesymbol m_data_end               =0x2007FFFF;

经过修改之后,可以发现测试的时候,从0X00000000开始,确实不再可以访问ITCM:

2.jpg

Debug代码功能也能正确运行,退出debug,reset,重新上电,都可以运行app。

但是,当再次进入debug的时候,就会出现这个问题:

3.jpg

而且出现这个问题之后,只能通过进入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打开该工程,可惜,又遇到编译的问题:

4.jpg

开始怀疑,是否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文件:

5.jpg

ITCM使用数不胜数。到这里已经很确定,就是因为flashloader使用了ITCM,但是之前的代码已经把ITCM关闭掉,导致不能再下载代码了。
三, 问题解决

对于问题的解决,第一想法就是把flashloader用到的ITCM都改为DTCM地址。所以,这里也是暴力操作,直接把ITCM的定义区域,转移到DTCM 0X20000000开始,

6.jpg

再次查看生成好的.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问题!


【经验分享】RT1064 flexRAM ITCM为0 IAR debug问题解决.pdf (562.22 KB, 下载次数: 21)
回复

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
15
最后登录
2021-12-9
发表于 2021-12-9 11:08:27 | 显示全部楼层
__flexram_bank_cfg EQU 0xAAAAAAAA
请问这个值是怎么来的呢?table3那个图里好像并没有这个值
回复 支持 反对

使用道具 举报

该用户从未签到

648

主题

6301

帖子

0

超级版主

Rank: 8Rank: 8

积分
19546
最后登录
2024-3-28
 楼主| 发表于 2021-12-15 14:36:39 | 显示全部楼层
乌拉乌拉_6416eb 发表于 2021-12-9 11:08
__flexram_bank_cfg EQU 0xAAAAAAAA
请问这个值是怎么来的呢?table3那个图里好像并没有这个值 ...

表格中并没有罗列全,你需要去看RT1064RM GPR17寄存器,你会发现:
FlexRAM bank config value
GPR_FLEXRAM_BANK_CFG[2n+1 : 2n], where n = 0, 1, ..., 15
• 00: RAM bank n is not used
• 01: RAM bank n is OCRAM
• 10: RAM bank n is DTCM
• 11: RAM bank n is ITCM
而客户需要:ITCM=0, DTCM=512KB, OCRAM=0。
所以需要吧RAM bank都配置为DTCM, 也就是10, 这样就都是A了。

友情告知:
各位恩智浦老铁,
小恩GG和小智MM感谢您长期以来对恩智浦产品的支持和厚爱。由于工作内容变动,我们将暂停技术支持服务。
我们将会推出更多基于NXP MCU/MPU产品的技术文章,敬请大家关注。
如果您有技术支持需求,请移步恩智浦官方论坛https://community.nxp.com/(支持中文)。
感谢您的理解和支持!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-3-29 08:44 , Processed in 0.128285 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表