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便是挑选的意思,当然便是挑选程序编译过程中的每一部分数据的方位了。这一部分每一行的详细含义我也说不太理解。仅仅略知一二,与此帖有关的的有这样几句
- .cinit : {}> FRAM /* INITIALIZATION TABLES */
- .pinit : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .init_array : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .mspabi.exidx : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .mspabi.extab : {}> FRAM /* C++ CONSTRUCTOR TABLES */
- .const : {} >> FRAM | FRAM2/* CONSTANT DATA */
- .text:_isr : {}> FRAM /* CODE ISRs */
- .text : {} >> FRAM2 | FRAM/* CODE
仿制代码
还有
仿制代码
信任咱们现已看出来了,这一部分便是与咱们有用的代码和数据相关的部分。比方.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的区块区分红两个或许多个区块,当然一般为了有用便利区块仍是少一些比较好,把同一类型数据中的子类数据的地址分配权力给编译器会更简略一些,假如对数据的寄存比较关心,比方我想独自拿出一块放参数,那么咱们就能够独自界说一块地址作为参数,便利数据的办理。