您的位置 首页 元件

MSP430FR5969内存分配的问题

cmd文件里的具体内容我就不贴了,大家自己可以看一下。cmd文件主要由两部分构成,一个是MEMORY{};另一个是SECTIONS{}其中MEMORY{}是

cmd文件里的详细内容我就不贴了,咱们自己能够看一下。cmd文件主要由两部分构成,一个是MEMORY{};另一个是SECTIONS{}

其间MEMORY{}是界说内部一切寄存器及存储器的地址,在这儿大部分内容都是厂家界说好的,一般不能修正。可是咱们今日要改的便是他,当然只能改其间答应该的当地,那便是FRAM的分配问题。依据数据手册里供给的内存分配状况(如下图)咱们能够得知,59×9的内存从0x0000开端,一直到0x13FFF。对应着这个图和Cmd文件,咱们能够了解内部的地址分配问题,假如做过总线扩展之类的同学必定对这个不会陌生了,假如没有见过就需求了解一下。其实也很简略,便是对应的地址要对应上就能够了。有一些是固定好的不能变,比方各个中止向量的地址,各个寄存器的地址等。一般能变的便是程序存储空间和数据空间了,对应到59×9里边便是cmd文件里的三个部分,即
RAM :origin = 0x1C00, length = 0x0800
FRAM : origin = 0x4400, length = 0xBB80
FRAM2 : origin = 0x10000,length = 0x4000
其间origin 表明开端地址,length 表明长度

这几个要害的开端地址和长度能够在上表以及msp430FR59xx69xx数据手册.pdf的21页22页找到,这两页是中止向量地址,也便是cmd文件下面的部分了。上面提到地址的和21页和22页上的地址是内部规定好的,用户不能自行改动。看到这儿,我想咱们应该理解了,其实这个芯片留给用户的地址有3部分。分别是0x1C00开端的2K空间,0x4400开端的46K空间以及0x100000开端的16K空间。那么这些空间都是放什么内容的呢?这就要提到CMD文件中的另一部分SECTIONS{}了。
望文生义,SECTIONS便是挑选的意思,当然便是挑选程序编译过程中的每一部分数据的方位了。这一部分每一行的详细含义我也说不太理解。仅仅略知一二,与此帖有关的的有这样几句

  1. .cinit : {}> FRAM /* INITIALIZATION TABLES */
  2. .pinit : {}> FRAM /* C++ CONSTRUCTOR TABLES */
  3. .init_array : {}> FRAM /* C++ CONSTRUCTOR TABLES */
  4. .mspabi.exidx : {}> FRAM /* C++ CONSTRUCTOR TABLES */
  5. .mspabi.extab : {}> FRAM /* C++ CONSTRUCTOR TABLES */
  6. .const : {} >> FRAM | FRAM2/* CONSTANT DATA */
  7. .text:_isr : {}> FRAM /* CODE ISRs */
  8. .text : {} >> FRAM2 | FRAM/* CODE

仿制代码

还有

  1. .bss : {} > RAM /* GLOBAL & STATIC VARS */
  2. .data : {} > RAM /* GLOBAL & STATIC VARS */
  3. .TI.noinit: {} > RAM /* For #pragma NOINIT */
  4. .stack : {} > RAM (HIGH) /* SOFTWARE SYSTEM STACK */

仿制代码

信任咱们现已看出来了,这一部分便是与咱们有用的代码和数据相关的部分。比方.text:_isr : {} > FRAM /* CODE ISRs */这一句是中止代码的方位,在FRAM区域,也便是0x4400开端的46K空间内,详细分配到什么方位就看编译器了,横竖不会出这个规模。.text : {} >> FRAM2 | FRAM /* CODE这一个是其他代码的方位,FRAM|FRAM2,即这两块FRAM区域均可。下面的.bbs、.stack、.data等均在RAM区,也便是0x1C00开端的2K空间内。 在实践的运用中,最常见的或许便是数据超出规模,一般都是界说的变量较多或许缓冲区较大,比方在串口通讯的使用中,2K不够用,那么咱们就能够把.data : {} > RAM修正为.data : {} > RAM|FRAM2,在曾经数据和程序分隔界说的芯片中,这个时分在上面.text和.const中就不能再呈现FRAM2了。至于这个片子应该是能够的,我还没有试,留个疑问吧。咱们能够自己试一下。

除了上面那样使用官方分好的区块从头界说之外,咱们还能够自己从头区分地址。比方把46K的区块区分红两个或许多个区块,当然一般为了有用便利区块仍是少一些比较好,把同一类型数据中的子类数据的地址分配权力给编译器会更简略一些,假如对数据的寄存比较关心,比方我想独自拿出一块放参数,那么咱们就能够独自界说一块地址作为参数,便利数据的办理。

从上图中,咱们能够看到,字符串常量存储的方位上FLASH1区或许FLASH2区,可履行代码也是存储在FLASH1去或许FLASH2区。这儿呈现这个问题的原因或许是可履行代码存储在FLASH区,可是需求的字符串常量存在是FLASH2区,所以重定向时,由于存储的方位较远,导致无法定向到。
因而,咱们考虑修正cmd文件,使得字符串常量悉数存储在FLASH区。在经过了这样的修正之后,再编译时,不再报错,程序正常运转。
经过工程目录下的.map文件,咱们也能够获取内存分配的信息,能够借此来验证咱们修正的正确性。
注:这样做或许还存在一个问题,由于FLASH1区的巨细十分小,只要31K,依照现在这种做法,中止函数代码、变量初始化的值以及字符串常量都被存储在FLASH1区,部分履行代码也存在这个区域。假如前面三者的巨细超过了FLASH1区的巨细,这种状况不知道编译器是否会有提示。假如没有提示,可是溢出的话,或许是会出问题的。可是从现在调试的状况来看,一切正常。假如后续呈现古怪的现象,需求考虑是否是这儿的问题。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/262773.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部