历史上的今天
返回首页

历史上的今天

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

正在发生

2020年03月09日 | MSP430在CCS开发环境下的内存分配

2020-03-09 来源:eefocus

用CCS开发环境以及有一年多了,之前写程序,仅仅是停留在写程序的阶段,从来没有想过内存是如何分配的。这次做这个,由于程序的代码量比较大,有40K+,所以在程序整合编译的过程中,遇到了一些之前没有遇到过的问题,在查阅了一些资料之后,解决了这些问题,在这里做一下总结。

 

首先,我们先抛出遇到的问题。在将程序整合之后,编译报错了,报的错误如下图所示。这个问题是说重定向时,重定向的地址为17位,太大了,超过了16位译码的范围。

这里这个问题我是这样理解的,是这些函数中需要调用一些字符串常量(根据错误定位得出的结论),这时候需要跳转到这个常量所在的地址,但是由于这个地址离当前函数所在的地址“太远了”,所以没有办法跳转到那里执行。


有了这样的分析,我们很自然地想到,如果这些字符串常量能够离程序所在的区域“近一些”,那么这个问题就能解决了。如何来控制字符串常量所在的存储区域呢?这里我们需要了解一下cmd文件。


以MSP430F6638的cmd文件为例,它主要包含了两个信息。


一个是关于MSP430F6638的内存映射信息,如下图所示。利用红色的区域中的信息,我们也可以计算出,6638的RAM是从0x2400开始,大小为16K,USBRAM是从0x1c00开始,大小为2k,FLASH分为两个区域总的大小为256K。



另一个是关于变量、代码等分配的存储位置。如下如所示。我们需要重点关注的是红色区域内的信息。观察一下。我们不难理解红色区域内代码的含义,是将.bss段、.data段、.sysmem段及.stack段的信息放在RAM区,而.test段等信息被存储在FLASH区。这些段各代表什么呢?这里我也做了一下总结,如下如所示。


从上图中,我们可以看到,字符串常量存储的位置上FLASH1区或者FLASH2区,可执行代码也是存储在FLASH1去或者FLASH2区。这里出现这个问题的原因可能是可执行代码存储在FLASH区,但是需要的字符串常量存在是FLASH2区,所以重定向时,由于存储的位置较远,导致无法定向到。


因此,我们考虑修改cmd文件,使得字符串常量全部存储在FLASH区。在经过了这样的修改之后,再编译时,不再报错,程序正常运行。


通过工程目录下的.map文件,我们也可以获取内存分配的信息,可以借此来验证我们修改的正确性。


注:这样做可能还存在一个问题,因为FLASH1区的大小非常小,只有31K,按照目前这种做法,中断函数代码、变量初始化的值以及字符串常量都被存储在FLASH1区,部分执行代码也存在这个区域。如果前面三者的大小超过了FLASH1区的大小,这种情况不知道编译器是否会有提示。如果没有提示,但是溢出的话,可能是会出问题的。但是从目前调试的情况来看,一切正常。如果后续出现奇怪的现象,需要考虑是否是这里的问题。

推荐阅读

史海拾趣

Cal Test Electronics公司的发展小趣事

Cal Test Electronics公司成立于1995年,当时正值电子配件和测试产品市场的快速发展期。创始人凭借对电子行业的深刻理解和敏锐的市场洞察力,决定专注于这一领域。初创时期,公司面临着资金短缺、市场竞争激烈等诸多挑战,但创始人带领团队通过技术创新和成本控制,逐步在市场上站稳脚跟。他们不断研发出符合市场需求的高品质产品,赢得了客户的信任和支持。

General Magnetics Inc公司的发展小趣事
用于电力传输和分配过程中的电压变换。
E-CMOS(飞虹高科)公司的发展小趣事

展望未来,飞虹高科公司将继续秉承“创新、质量、服务”的企业精神,致力于CMOS技术的研发和应用。公司将密切关注市场动态和技术发展趋势,不断调整和优化产品结构和市场布局。同时,公司还将加强与国际同行的合作与交流,共同推动电子行业的进步与发展。飞虹高科坚信,在全体员工的共同努力下,公司一定能够在电子行业中取得更加辉煌的成就。

First Switchtech公司的发展小趣事

在追求商业成功的同时,First Switchtech公司(或类似公司)也始终关注可持续发展和社会责任。公司致力于环保产品的研发和生产,推出了多款符合国际环保标准的电子开关产品。同时,公司还积极参与公益事业,通过捐赠资金、技术支持等方式帮助贫困地区改善教育条件、提升医疗水平等。这些举措不仅提升了公司的社会形象,也促进了公司与社会的和谐共生。

需要注意的是,以上故事是基于电子行业普遍趋势和可能发展路径的构想,并非直接针对First Switchtech公司的具体事实。如需了解该公司的真实发展情况,建议直接访问其官方网站或查阅相关新闻报道。

杰力(EMC)公司的发展小趣事

杰力(EMC)公司成立于XXXX年,由一群具有丰富电子行业经验的专业人士创立。公司初期专注于功率组件和集成电路(IC)的设计与开发,以满足不断增长的电子市场需求。通过引进先进的生产设备和工艺,杰力迅速建立起一条高效的生产线,并开始为一些小型电子厂商提供定制化的产品。随着产品质量的不断提升和客户口碑的积累,杰力逐渐在市场中树立了良好的品牌形象。

HellermannTyton公司的发展小趣事

随着全球对环境保护意识的增强,Heimann Optoelectronics Gmbh积极响应,将绿色环保理念融入产品设计和生产中。公司投入大量资源研发出低功耗、长寿命的光电传感器,这些产品在使用过程中能够显著减少能源消耗和废弃物产生。此外,公司还采用环保材料进行包装,确保从生产到废弃的整个生命周期都符合环保标准。这一举措不仅赢得了市场的广泛赞誉,还为公司树立了良好的企业形象。

问答坊 | AI 解惑

全球通用测试测量市场趋势分析

根据测试测量世界tmworld与Frost & Sullivan的联合调查,全球通用仪器市场的大部分份额仍然由示波器、频谱分析仪、信号发生器、万用表四种仪器把持。如图(1)所示四种仪器所占份额依次为33.7%,17.3%,16.3%,13.1%。个人认为,频谱分析仪之所以会占 ...…

查看全部问答>

wince嵌入式开发外包公司

大家好!最近有项目需要外包,有知道的厂家吗推荐下多谢了!!…

查看全部问答>

如何在c51中定义一个全局变量

如何在c51中定义一个全局变量…

查看全部问答>

DM365DVR上TD模块(LC6311)的网速测试的疑问

我的开发平台是DM365DVR,通过USB方式将TD模块(LC6311)连接到DM365DVR上,正确配置后,能够成功拨号,也能够通过TD网络传输视频,但是传输效果极差。CIF(352*288)格式的视频每秒只能传输一到两帧,而且画面质量也不好。更可气的是传不几秒就断 ...…

查看全部问答>

系统 电池电量低挂起。

要做这个功能,希望大家说说。你们系统是在哪个位置做的这个功能,我好去看看我的代码,谢谢大家。…

查看全部问答>

新手紧急求助:232编程问题

具体事情如下: 传感器测一个力,送到“TR700数字式重量变送器”上显示。现在从“TR700数字式重量变送器”上接出的一个RS232接到电脑上,需要做的是在电脑上采集传感器测得的数据并存储下来。 从来没做过这方面的工作,在网上查了一下还是毫无头 ...…

查看全部问答>

驱动中触摸屏坐标和LCD坐标转换问题!!

#define TOUCH_MAX_X 1000 // 950 #define TOUCH_MIN_X 30 // 90 #define TOUCH_MAX_Y 980 // 960 // 910 #define TOUCH_MIN_Y 30 // 70 //50 #define TOUCH_X 800 #define TOUCH_Y 480 VOID Touch_CoordinateConversion(INT *px, INT ...…

查看全部问答>

GPRS和PC通讯的问题(80求助)

GPRS模块做数据传输时用SIM公司的那个SERVER.EXE软件来和GPRS交互数据。主机是ADSL拨号上网,用ipconfig查了一下有两个地址,一个是宽带地址一个是本地地址。把SERVER软件打开发现它上面的IP地址是本地地址,端口是2020这该怎么办啊 我怎么样才能 ...…

查看全部问答>

bsp中romStart的解压缩过不去~

开发的硬件是mips架构的CPU~ 郁闷了~在dos下编bootrom.bin,烧进flash后通过点灯观察运行状况 在romStart函数中复制rom代码到ram已经没问题,之后可以成功调用rom中的点灯程序或者已经复制到ram中的点灯程序拷贝。 但是解压缩就是过不去~ 想问 ...…

查看全部问答>

初学者

向各位高手请教一下,我是刚学51单片机的,8位CPU和片外32口线,16地址线是什么意思?尽量讲的通俗易懂些,谢谢!…

查看全部问答>