首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MSP430在CCS开发环境下的内存分配

MSP430在CCS开发环境下的内存分配

用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文件,我们也可以获取内存分配的信息,可以借此来验证我们修改的正确性。
继承事业,薪火相传
返回列表