历史上的今天
今天是: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区的大小,这种情况不知道编译器是否会有提示。如果没有提示,但是溢出的话,可能是会出问题的。但是从目前调试的情况来看,一切正常。如果后续出现奇怪的现象,需要考虑是否是这里的问题。
下一篇:MSP430的低功耗探讨
史海拾趣
|
根据测试测量世界tmworld与Frost & Sullivan的联合调查,全球通用仪器市场的大部分份额仍然由示波器、频谱分析仪、信号发生器、万用表四种仪器把持。如图(1)所示四种仪器所占份额依次为33.7%,17.3%,16.3%,13.1%。个人认为,频谱分析仪之所以会占 ...… 查看全部问答> |
|
我的开发平台是DM365DVR,通过USB方式将TD模块(LC6311)连接到DM365DVR上,正确配置后,能够成功拨号,也能够通过TD网络传输视频,但是传输效果极差。CIF(352*288)格式的视频每秒只能传输一到两帧,而且画面质量也不好。更可气的是传不几秒就断 ...… 查看全部问答> |
|
具体事情如下: 传感器测一个力,送到“TR700数字式重量变送器”上显示。现在从“TR700数字式重量变送器”上接出的一个RS232接到电脑上,需要做的是在电脑上采集传感器测得的数据并存储下来。 从来没做过这方面的工作,在网上查了一下还是毫无头 ...… 查看全部问答> |
|
#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模块做数据传输时用SIM公司的那个SERVER.EXE软件来和GPRS交互数据。主机是ADSL拨号上网,用ipconfig查了一下有两个地址,一个是宽带地址一个是本地地址。把SERVER软件打开发现它上面的IP地址是本地地址,端口是2020这该怎么办啊 我怎么样才能 ...… 查看全部问答> |
|
开发的硬件是mips架构的CPU~ 郁闷了~在dos下编bootrom.bin,烧进flash后通过点灯观察运行状况 在romStart函数中复制rom代码到ram已经没问题,之后可以成功调用rom中的点灯程序或者已经复制到ram中的点灯程序拷贝。 但是解压缩就是过不去~ 想问 ...… 查看全部问答> |




