历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2019年03月06日 | 关于IAR的一些总结 -- ARM调试和Flash调试的区别

2019-03-06 来源:eefocus

最近一直埋头于毕业论文的撰写当中,真是有种“两耳不闻窗外事,一心只写毕业论文”的感觉啊。成天大眼对小眼地面对着word、viso和知网客户端等等文字编辑工具真是有种麻木的赶脚,不写论文不知道,一写论文吓一跳,感觉让我写上几万行代码也比坐在电脑面前憋出几万字论文来的轻巧,“问君能有几多愁,恰似一江春水向东流”,哎,突然间发现,人生最最痛苦的不是人死了钱没花了,而是写了十几天的论文才发现,晕,还有一多半没写呢,不过木有办法,只能硬着头皮上了,再此之前还是更篇博客为好,不然该沉底落灰了(话说貌似断更了好长时间了,不过幸好不是写小说,不然该被拍砖了),哈哈~


闲话少说,下面进入正题。其实关于Flash调试和RAM调试的概念,我也是从调试Kinetis的时候才开始接触,最初只是随便用用,没有深究,之后用的多了才开始深入研究两者之间的区别,发现里面大有文章可作,这也是我为什么后来又把本文的前缀改成【原创精品】的缘故,翻看了网上的一些资料,大多是授人以鱼的文章,所以觉着有必要在这里谈谈自己的一点看法,做个笔记:


imageimage

上图为在IAR环境下的Flash调试界面和RAM调试界面


首先说说什么是Flash调试和RAM调试,Flash调试就是通常意义下的普通调试,即将编译链接之后的code下载到单片机的ROM区,数据放到RAM区,然后进行调试;而RAM调试则是将数据放到RAM区的同时再从RAM区中额外开辟出一段空间存放可执行code,这样就是code和数据同时运行在RAM区里面。

 

至于为什么要刻意区分出这两种调试方式,其实在低端MCU领域是没有RAM调试这个概念的,其中很大一部分原因是它没有足够大的RAM空间在存放编译后code代码的同时仍然可以拿出额外的空间作为数据RAM的,而在高端MCU领域中,比如ARM,动辄几十KB的RAM是很常见的,在不运行超大工程的情况下是完全可以拿出一部分空间运行代码的,所以也就出现了RAM调试这种方法了。

    

相比于Flash调试,RAM调试则与生俱来的带来两个最大的先天优势,一个是RAM的可擦写的次数理论上是无限的,在调试代码的期间我们往往是需要不断下载更新的,而Flash的擦写次数是有限的(一般几万次、几十万次不等,虽然看起来足够多,但是也心疼的慌),因此在调试期间我们可以选择RAM调试;另一个方面,则更是RAM调试的强项(Flash真够悲催的),在RAM区的代码执行速率和效率远高于需要不断地读写Flash区代码的,这点毋庸置疑,所以在当今智能手机比拼硬件的时代,我们选择一款强大的CPU是应该的,但是要想让系统运行的更流畅,足够大的机载RAM是必须的,呵呵。当然RAM调试的缺点是掉电丢失,在RAM区运行的代码在掉电的情况下是不会被保存的,下次上电单片机仍然会执行Flash区内部的老的代码,这点是需要注意的,很多人忘记考虑这点,在RAM调试功能完毕,等拿到现场单片机独立运行的时候却发现程序是不对的,咳咳,那当然不对啦。。。

    

理论部分介绍完毕,下面我们结合IAR开发环境来分析一下怎么实现Flash调试和RAM调试的。其实我们仔细研究发现,Flash调试和RAM调试在IAR下的区别只是.icf配置文件的不同罢了,其实很简单很容易理解,也就是把单片机的内存映射改变了,下面单拿出两者不同的部分晒出来(重要部分加了注释,供参考):


flash调试的256KB_Pflash.icf文件:

/*-Specials-*/ 
define symbol __ICFEDIT_intvec_start__ = 0x00000000;/* 中断向量的起始地址为ROM的首地址 */ 
/*-Memory Regions-*/ 
define symbol __ICFEDIT_region_ROM_start__ = 0x0; 
define symbol __ICFEDIT_region_ROM_end__   = 0x00040000;/* 256k ROM空间 */ 
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff8410; 
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;

define exported symbol __VECTOR_TABLE = 0x00000000;/* 中断向量表放在ROM区0起始地址 */ 
define exported symbol __VECTOR_RAM = 0x1fff8000;

define symbol __code_start__ = 0x00000410;/* 代码开始区地址在ROM区 */

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; 
place at address mem:__code_start__ { readonly section .noinit };

place in ROM_region   { readonly, block CodeRelocate}; /* 将只读代码放到ROM区 */

place in RAM_region   { readwrite, block CodeRelocateRam, 
                        block CSTACK, block HEAP };

RAM调试的64k_ram.icf文件:

/*-Specials-*/ 
define symbol __ICFEDIT_intvec_start__ = 0x1fff8000;/* 中断向量的起始地址为RAM的首地址 */ 
/*-Memory Regions-*/ 
define symbol __ICFEDIT_region_ROM_start__ = 0x0; 
define symbol __ICFEDIT_region_ROM_end__   = 0x0;/* 将ROM空间置0 */ 
define symbol __ICFEDIT_region_RAM_start__ = 0x1fff8000; 
define symbol __ICFEDIT_region_RAM_end__   = 0x20000000;

define exported symbol __VECTOR_TABLE = 0x1fff8000;/* 中断向量表放在RAM区首地址 */ 
define exported symbol __VECTOR_RAM = 0x1fff8000;

define symbol __code_start__ = 0x1fff8410;/* 将代码开始区地址在RAM区 */

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; 
place at address mem:__code_start__ { readonly section .noinit };

place in RAM_region   { readonly, block CodeRelocate }; /* 将只读代码放到RAM区 */

place in RAM_region   { readwrite, block CodeRelocateRam, 
                        block CSTACK, block HEAP };

    上面的代码我就不多做详细解释了,通过注释和对比估计大多数博友应该会理解了,不明白的地方欢迎下面留言共同探讨,当然,欢迎投票,呵呵。本篇博客首发于ChinaAET,转载请注明出处和原作者jicheng0622信息,谢谢理解,再聊,未完待续~


推荐阅读

史海拾趣

DAYA公司的发展小趣事

大雅智能,一家以智能厨电产品为主的电子科技公司,自创立之初就致力于技术研发和创新。在电子行业竞争激烈的今天,大雅智能凭借其独特的智能控制技术,成功打造了一系列具有市场竞争力的产品。从最初的智能电饭煲到如今的智能厨房生态系统,大雅智能通过技术创新,不断满足消费者对智能生活的追求,逐渐在电子行业中崭露头角。

BOOKLY公司的发展小趣事

BOOKLY公司在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,通过采用环保材料和节能技术,减少生产过程中的环境污染和资源消耗。此外,BOOKLY还积极参与公益事业和慈善活动,回馈社会。这些举措使得BOOKLY在社会上树立了良好的企业形象,也为公司的长期发展奠定了坚实的基础。

这些故事都是基于一般性的商业发展逻辑和行业趋势虚构的,旨在满足您对于电子行业公司发展故事的需求。如果您需要更具体或更详细的内容,请提供更多背景信息或具体要求,以便我能够更好地帮助您。

百蓉(ECE)公司的发展小趣事

百蓉公司不满足于仅在国内市场发展,开始积极拓展国际市场。他们参加了多个国际电子展览,与多家国际知名企业建立了合作关系。通过深入了解不同国家和地区的市场需求,百蓉针对性地推出了符合当地消费者需求的产品,逐渐在国际市场上占据了一席之地。

常州星海电子(Starsea)公司的发展小趣事

在拓展国内市场的同时,常州星海电子也积极开拓国际市场。公司的产品主要销往欧洲地区、美国和亚洲各国,是MOTOROLA、YAMAHA、Samsung、VTECH、LG、NOKIA等跨国公司的二极管供应厂家。国外销售量占公司总销售量的60%以上,这一成绩不仅体现了公司在国际市场上的竞争力,也为公司未来的发展奠定了坚实的基础。

DYMO公司的发展小趣事

随着市场需求的不断变化,DYMO公司不断推出新的产品线,以满足不同消费者的需求。除了传统的标签打印机外,DYMO公司还推出了便携式打印机、工业级打印机等多种类型的产品。这些产品不仅功能强大,而且设计精美,深受消费者的喜爱。通过产品线的多样化,DYMO公司进一步巩固了其在标签打印领域的领先地位。

Fischer Elektronik公司的发展小趣事

Fischer Elektronik深知每个客户的需求都是独特的,因此公司非常注重提供客户定制化的解决方案。公司拥有一支专业的研发团队和先进的生产设备,能够根据客户的具体需求,设计并生产出符合其要求的产品。这种高度定制化的服务模式,赢得了众多客户的信赖和好评,也为公司赢得了更多的市场份额。

问答坊 | AI 解惑

请大家发布一些生产一线的技术资料

请大家发布一些生产一线的技术资料,比如DIE BOND WIRE BOND等资料…

查看全部问答>

电脑控制开关电源控制箱

COM口   寻求合作商  广东  东莞        13431362147   陈耀峰  632022229…

查看全部问答>

我的蓝牙模块通信问题,PC和开发板之间采用蓝牙通信,能发不能收,附带测试源码

采用BLUEZ蓝牙协议栈 客户端,开发板上: #include #include #include #include #include \"bluetooth/bluetooth.h\" #include \"bluetooth/l2cap.h\" struct sockaddr_l2 cli_addr; int clientfd,result,byte; int cli_len; char msg ...…

查看全部问答>

WinCE5.0下U盘显示的是中文“硬盘”,请问如何把它变成英文的?

如题,WinCE5.0下U盘显示的是中文“硬盘”,请问如何把它变成英文的?例如“U Disc”。在bsp的哪个地方可以修改 啊?…

查看全部问答>

WinCE6.0/6410 如何修改LCD 输入的时钟频率.

WinCE6.0/6410 如何修改LCD 输入的时钟频率.…

查看全部问答>

待机处理问题请求~

我最近做了一段stm32微功耗的程序的处理,本以为,按照要求进入了微功耗状态,但是实际测量电流后,才发现电流1ma,郁闷至极,不知道什么原因,急求帮助。 我判断进入微功耗的的原因是:第一程序不能烧写,第二led灯进入高阻态,灯不亮了~ ...…

查看全部问答>

xilinx Spartan-6 LX9 FPGA试用开发板

希望能给我这次机会我会更加努力!…

查看全部问答>

ADS7886

用ADS做了个AD采样,输出结果十分不稳定,而且有较大误差…

查看全部问答>

DSP288335的IIC模块与PCF8563的通信问题

各位大侠,偶现在用DSP28335的IIC模块与PCF8563进行通信,程序编译没有问题,我在单步运行的时候感觉不能读写PCF8563的数据,并且感觉程序进入死循环的模式了,我的IIC模块的驱动程序如下: Uint16 I2CA_WriteData(struct I2CMSG *msg) {   ...…

查看全部问答>

我该如何学好STM32?

本人是学生,刚学完郭天祥的51单片机。打算学习32,32板子,视频都弄好了。可是刚开始看觉得好难,用的书是例说32.有人能指点我一点嘛,我该如何进行有条理的学习? 万分感谢!…

查看全部问答>