首页 理论教育 代码段与数据段的区别与联系

代码段与数据段的区别与联系

时间:2023-06-19 理论教育 版权反馈
【摘要】:段是指占用dsPIC器件存储器中连续地址的可定位代码或数据块。例如,一个文件中可能包含一个程序代码段、一个未初始化数据段及其他段。除非通过段属性指定,否则,MPLAB C30编译器将代码和数据存放在默认的段中。所有由编译器生成的可执行代码都被分配到扩展名为.text的段中,而数据则根据数据类型分配在不同的段中。MPLAB C30启动代码将通过从.dinit段中复制数据来初始化这种段。段.pbss分配到near数据存储区中,不会被libpic30.a中的默认启动模块修改。

代码段与数据段的区别与联系

段是指占用dsPIC器件存储器中连续地址的可定位代码或数据块。在任何给定的目标文件中,通常都有几个段。例如,一个文件中可能包含一个程序代码段、一个未初始化数据段及其他段。除非通过段属性指定,否则,MPLAB C30编译器将代码和数据存放在默认的段中。所有由编译器生成的可执行代码都被分配到扩展名为.text的段中,而数据则根据数据类型分配在不同的段中(见表2-2)。

表2-2 编译器生成的数据段

978-7-111-36505-1-Chapter02-46.jpg

下面列出了每个默认的段,并描述了存储到段中的信息的类型。

●text:可执行代码,分配到.text段中。

●data:具有far属性的已初始化变量,分配到.data段中。当选择大数据存储模型时(即使用-mlarge-data命令行选项时),这是已初始化变量的默认位置。

●ndata:具有near属性的已初始化变量,分配到.ndata段中。当选择小数据存储模型时(即使用默认的-msmall-data命令行选项时),这是已初始化变量的默认段。

●const:常量值,如字符串常量和const限定的变量,当使用默认的-mconst-in-code命令行选项时,分配到.const段中。这种段位于程序存储器中并通过PSV窗口访问。还可以通过段属性,即不需要在命令行中使用-mconst-in-code选项,将变量存放到.const段中,例如:

978-7-111-36505-1-Chapter02-47.jpg(www.xing528.com)

●dconst:当使用-mlarge-data命令行选项时,不需使用-mconst-in-code选项,即可将常量值,如字符串常量和const限定的变量分配到.dconst段中。MPLAB C30启动代码将通过从.dinit段复制数据来初始化这种段,除非指定了链接器选项--no-data-init。.dinit段由链接器生成,分配到程序存储器中。

●ndconst:当使用默认的-msmall-data命令行选项时,不需使用-mconst-in-code命令行选项,即可将常量值,如字符串常量和const限定的变量分配到.ndconst段中。MPLAB C30启动代码将通过从.dinit段中复制数据来初始化这种段。.dinit段由链接器生成,位于程序存储器中。

●bss:具有far属性的未初始化变量,分配到.bss段中。当选择了大数据存储模型时(即当使用-mlarge-data命令行选项时),这是未初始化变量的默认位置。

●nbss:具有near属性的未初始化变量,分配到.nbss段中。当选择小数据存储模型时(即使用默认的-msmall-data命令行选项时),这是未初始化变量的默认位置。

●pbss:持久数据。如果应用需要将数据存储在RAM中而不受器件复位的影响,可以使用该段。段.pbss分配到near数据存储区中,不会被libpic30.a中的默认启动模块修改。可使用段属性将未初始化变量存放在.pbss段中,例如

978-7-111-36505-1-Chapter02-48.jpg

为了利用持久数据存储,main()函数的开头要检测所发生复位的类型。在RCON复位控制寄存器中的各位可用于检测复位。详细信息请参阅《dsPIC30F系列参考手册》。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈