用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区的大小,这种情况不知道编译器是否会有提示。如果没有提示,但是溢出的话,可能是会出问题的。但是从目前调试的情况来看,一切正常。如果后续出现奇怪的现象,需要考虑是否是这里的问题。
上一篇:msp430g2553单片机学习心得
下一篇:MSP430的低功耗探讨
推荐阅读最新更新时间:2024-11-16 23:21
设计资源 培训 开发板 精华推荐
- LTC2637-LZ12 四通道、12 位数模转换器的典型应用
- SP6641A、3.3V 带 SuperCap 开关、DC/DC 升压稳压器的典型应用
- AH1308 应用提示 - Mantis TJA1057 5V 高速 CAN 收发器
- 使用 Microchip Technology 的 TCL1587 的参考设计
- 带有高速CAN收发器的MC33907电源系统基础芯片的典型应用
- NCP1351PRINTGEVB,40W 打印机评估板
- ADA4062-2BRZ-R7运算放大器用作陷波滤波器电路的典型应用电路
- DT-USB5734,使用USB5734 4端口USB-C/USB-3集线器的开发板,带电池充电和串口
- 使用 LTC3639EMSE 12V/100mA 汽车电源的典型应用
- LT8582 的典型应用 - 双路 3A 升压/反相/SEPIC DC/DC 转换器,具有故障保护功能
- “慧眼”识PCIe——阅读《PCIe要了解的十件事》和泰克OPEN-DAY的培训资料 抽奖、分享赢好礼!
- 已结束【Microchip 安全解决方案系列在线研讨会】
- 万人学习51单片机
- 免费申请英飞凌FMCW雷达解决方案Position2Go,角度,距离,速度,运动方向检测一板搞定!
- TI有奖创意征集,CC3200开发套件等100份礼品等你来
- 任性DIY,在这等你来!
- 免费测评|涂鸦三明治Wi-Fi&BLE 开发板
- 闯关集卡|轻型电动车与电动工具正当时,英飞凌邀你上道!
- ADI & WT ·世健 MCU 痛点问题探索季 ——第二站:直播 | MCU应用难题全力击破!
- 追赶 WiFi 浪潮,看泰克技术讲座,答题好赢礼!