IAR下直接下载调试报错怎么解决

分散链接与加载一直是嵌入式领域比较劝退新手的难题,在恩智浦i.mx rt系列为代表的多存储器架构的mcu上,分散链接问题体现得尤为明显,毕竟你在链接应用程序各种段(section)时可能会面对包括内部itcm/dtcm/ocram和外部 flash/sdram/psram/hyperram等多种存储器空间选择。
虽然存储器空间选择很多,但是一个最终可离线启动的i.mx rt程序(即能被下载进外部非易失存储器,且能被bootrom加载启动)其readonly段应该是一段连续的数据(srec/hex格式镜像文件里仅能包含一段空间地址),即要链接在一个主存储器空间里,这也意味着其它链接在非主存储器空间的 .text 段应该使用重定向方法来实现,不可直接原地链接,参考文章 《iar下将源文件代码重定向到任意ram中的方法》。最近有一个i.mx rt1060客户,他们就遇到了分散链接工程调试问题,工程readonly段被直接分散链接到了两个不同的外部存储器空间,没有用重定向方法,这虽然不符合离线启动要求,但是在iar下直接下载调试也会报错,这是怎么回事?  1. 客户的问题 我们再进一步描述客户工程分散链接问题,下图包含了i.mx rt架构下程序段的全部链接选择,根据这些选择组合,我们能产生多种不同的工程链接文件。
先来看不涉及分散链接的简单情况,即readonly段全在flash里,readwrite段在一个或多个ram空间里,这种情况下iar下载调试没有什么特殊注意事项,flashloader会负责外部flash初始化,并将readonly段数据下载进flash,然后宏文件负责外部ram初始化,在线调试一切正常。
case1:app readonly text/data1 + app readwrite data2/3/4
再来看第二种情况,这里开始涉及分散链接,readonly段分散在多个ram空间,readwrite段在一个或多个ram空间里。这种情况下因为没有链接在flash空间,因此无需flashloader,完全由宏文件将相关外部ram初始化好,多个readonly段都能正常下载,在线调试一切正常。
case2:app readonly text/data2/3/4 + app readonly text/data2/3/4 + app readwritedata2/3/4
第三种情况再复杂一点,readonly段除了在flash空间外,还有一部分放在了内部ram里,然后readwrite段依然在一个或多个ram空间里。这种情况下iar下载调试感觉上应该没问题,因为内部ram无需初始化可直接访问,两个不连续readonly段原则上可以下载,但是很遗憾,iar会报错,其flashloader无法处理放在内部ram的readonly段,调试无法进行。
case3:app readonly text/data1 + app readonly text/data2 + app readwrite data2/3/4
最后一种分散链接的情况最复杂,也是客户的问题所在,readonly段除了在flash空间外,还有一部分放在了外部ram,然后readwrite段在一个或多个ram空间里。这种情况下iar下载调试一定会出问题,默认flashloader只做了flash初始化,并不负责初始化外部ram,因此部分readonly段往外部ram下载时会报错,工程宏文件虽然负责初始化外部ram,但其执行阶段在flashloader作用之后,鞭长莫及。
case4:app readonly text/data1 + app readonly text/data3/4 + app readwrite data2/3/4
2. 复现客户问题 我们在恩智浦官方mimxrt1060-evk板上复现一下客户问题,使用sdk_2.11.0_evk-mimxrt1060oardsevkmimxrt1060demo_appshello_worldiar工程,原工程有很多build,我们就选用flexspi_nor_sdram build,它用到了两块外部存储器,符合客户场景。
在这个build里readonly段都链在外部flash里,readwrite段都链接在外部sdram里,显然这个情况属于第一节介绍的case1:
flash初始化工作:iarsystemsembedded workbench9.10.2armconfigflashloadernxpflashimxrt1060_flexspi.out
sdram初始化工作:sdk_2.11.0_evk-mimxrt1060oardsevkmimxrt1060demo_appshello_worldiarevkmimxrt1060_sdram_init.mac
我们现在要将工程稍微改动一下,在工程源文件里定义一个sw_delay()函数(记得要在main函数里调用一下),并且将其指定在自定义.sdramcodesection段里:
#pragma default_function_attributes = @ .sdramcodesectionvoid sw_delay(void){ __nop();}#pragma default_function_attributes = 然后在工程链接文件里将这个自定义.sdramcodesection段放到sdram空间里,这样我们在外部flash和sdram空间里就都有readonly段了,跟客户情况一致了。
place in data3_region { section .sdramcodesection }; 板卡上电,直接用板载dap-link调试器在线下载工程(为了减少对板子设置的依赖,我们将调试器复位类型改为core),下载过程中iar果然一直在报错,如果你忽略错误继续调试,虽然断点会停在main函数,但是只要单步进放到sdram空间的函数里时,程序就会跑飞进hardfault,因为sdram中根本就没有正确的.sdramcodesection段数据。
3. 仅借助宏文件(.mac)解决问题 分析到这里,其实你应该知道问题出在哪里了,工程配套宏文件evkmimxrt1060_sdram_init.mac本应负责sdram初始化,但是其执行顺序在 flashimxrt1060_flexspi.out作用之后,所以没有产生其该有的效果,这个具体可见旧文 《iar内部c-spy调试组件配套宏文件(.mac)用法介绍》 3.1 小节,有非常详细的解释。
现在的解决思路就是,如何让evkmimxrt1060_sdram_init.mac里的sdram初始化语句在flashloader作用之前生效,所以我们很自然地想在flashloader配套的宏文件flashimxrt1060_flexspi.mac里的execuserflashinit()接口里将sdram初始化语句都加上,但是很遗憾,这招不奏效,其实在第一节介绍的case3里就应该认清现实了,内部ram无需初始化iar也无法正常下载。
4. 借助双flashloader解决问题 其实iar软件设计里,对于两个readonly段,只要其中有一个段被放入了flash里(即需要flashloader),那么另外一个段不管是不是放在flash里也需要有相应flashloader,这里痞子衡要吐槽下iar的设计,有点呆板了。
所以本文案例里解决问题的关键就是为sdram也设计一个flashloader,具体制作方法可以参考旧文《串行nor flash下载算法(iar ewarm篇)》。因为sdram擦写其实也不需要什么特殊命令时序,就是单纯ahb方式地写就行了,所以这个sdram版本的flashloader就是个傀儡flashloader而已。
为了让这个傀儡flashloader更通用一些,是按如下方式实现三个主要flashloaderapi的,其中flashinit()函数里故意没有加semc模块初始化代码,就是为了让这个flashloader适用所有类型的ram(itcm/dtcm/ocram/sdram/psram/hyperram),外设初始化工作放在傀儡 flashloader配套宏文件里去完成。
flashinit()   - 什么都不做,直接返回
flashwrite()  - 用memcpy 函数实现
flasherase()  - 用memset 函数实现
最终ram型通用flashloader源码工程地址如下:
https://github.com/jayheng/imxrt-tool-flash-algo/tree/master/boards/nxp_evkmimxrt1060_rev.a1/ram_algo/iar
我们把新生成的sdram flashloader相关的所有文件(.out/.flash/.mac)放到对应iar系统目录下,并且修改原来的flashimxrt1060_evk_flexspi.board 文件,加入sdram 相关的部分:
flashimxrt1060_semc.mac文件基本沿用evkmimxrt1060_sdram_init.mac文件,只是setup宏函数从execuserpreload换到execuserflashinit
flashimxrt1060_semc.flash文件内容按flashimxrt1060_flexspi1.flash写即可,注意文件后缀一定要是 .flash,iar只认这个后缀。
现在再去下载调试,就一切正常了,说明双flashloader解决方案生效了。
本例是以iar flashloader为例的,如果用j-link flashloader也是可以的,一样的原理制作两个flashloader即可。
原文标题:iar环境下无法直接下载调试i.mx rt分散链接工程的解决方案
文章出处:【微信公众号:恩智浦mcu加油站】欢迎添加关注!文章转载请注明出处。

苹果或在下一代iPhone中增加室内定位服务
你能分的清电子测量仪器的通讯接口吗?猜你肯定分不清哪些是哪些
防震密封胶,解决电子元器件松动问题
荣耀携手奥迪RS系列推出荣耀10GT奥迪运动限量款手机
电力系统高次谐波分析
IAR下直接下载调试报错怎么解决
2020年“创客中国”智能传感器中小企业创新创业大赛在河南成功举办
esp32和stm32哪个好_ESP32对比ESP8266
明明跑安卓,华为你说EMUI5.0 18个月不卡就不卡?
LM3424 具有温度管理控制功能的全新高亮度LED驱动器
工业视觉相机防水透气膜,内外气压平衡 密封防水设计!
如何为牲畜监控、车队管理和工业 4.0 物流设计多连接跟踪系统
窑尾风机轴磨损原因及修复方法
TIS导热绝缘片在新能源充电桩模块散热中的应用
变压器及光伏发电企业保变电气发布2022第一季度报告
美国德州仪器公司发布2017第四季度及2017年财务业绩与股东回报
诺基亚8什么时候上市?诺基亚8最新消息:诺基亚8来了:4100W卡尔蔡司镜头+骁龙835!售价3188
Insight 1600产品是业界第一款结合了高分辨率和速度检测功能的激光雷达
中国MEMS技术产业的重大机遇
三星S8对比苹果7Plus续航测试出现两种结果,谁在做假?