This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

#pragma DATA_SECTION的解释

ti的帮助文档里是这么讲的:
The DATA_SECTION pragma allocates space for the symbol in a section called section name.
The syntax for the pragma in C is:
#pragma DATA_SECTION (symbol, "sectionname");
The syntax for the pragma in C++ is:
#pragma DATA_SECTION ( "sectionname");
The DATA_SECTION pragma is useful if you have data objects that you want to link into an area separate from the .bss section.
This directive is illustrated in the following example.
Using the DATA_SECTION Pragma
a)  C source file
#pragma DATA_SECTION(bufferB,"my_sect")
char bufferA[512];
char bufferB[512]:

b) C++ source file
char bufferA[512];
#pragma DATA_SECTION("my_sect")
char bufferB[512];

c) Assembly source file
   .global _bufferA
         .bss    _bufferA,512,4
         .global _bufferB
_bufferB: .usect  "my_sect",512,4
我理解的意思是:
  定义一个数据段:  
         段名为:    "section name"
         段的内容在:  symbol  里
在CCS编程中,如果我们不指定变量的存放位置,编译器会自动的给变量分配一个位置,但是如果有的时候需要把变量放在一个特定的空间内,我们应该如何操作呢,CCS提供了如下的两个指令
#pragma CODE_SECTION
#pragma DATA_SECTION
其中data_section是针对数据空间的,code_section是针对程序空间的,具体的使用办法是
#pragma DATA_SECTION(bufferB, ”my_sect”)
char bufferB[512];
在.cmd文件中建立对应的section就可以使用了.

MEMORY
{
PAGE 1: spacename : origin = 0x...., length0x..
}
SECTIONS
{
   .my_sect  : {} >spacename PAGE1
}

  • 对于汇编器,它会自动创建.text, .bss和.data三个段。我们可以使用#pragma CODE_SECTION和#pragma DATA_SECTION来创建更多的段。  默认情况下,各个段所分配的存储空间配置如下(可根据需要进行更改):
      最后,以一个ADC寄存器对应的内存地址分配的例子,来看看完成的cmd文件是如何完成的(事实上所有寄存器的内存地址分配在TI的外设和头文件包中已经帮我们做好了,这里是个演示)。
      首先,在使用寄存器(或者自定义的变量)的头文件或者源程序里,为寄存器(或者自定义的变量)指定一个自定义的段:
      #ifdef __cplusplus
      #pragma DATA_SECTION("AdcRegsFile")
      #else
      #pragma DATA_SECTION(AdcRegs,"AdcRegsFile");
      #endif
      volatile struct ADC_REGS AdcRegs; //使得结构体被分配在指定的段中
      然后,在cmd文件中,在SECTIONS下把AdcRegsFile这个段分配到ADC这块内存区域中,并在MEMORY中定义ADC这块内存区域的起始位置和长度。
      MEMORY
      {
      PAGE 0: /* Program Memory */
      /* 省略不相关内容的显示 */
      PAGE 1: /* Data Memory */
      /* 省略不相关内容的显示 */
      ADC : origin = 0x007100, length = 0x000020 /* ADC registers */
      /* 省略不相关内容的显示 */
      }
      SECTIONS
      {
      /* 省略不相关内容的显示 */
      AdcRegsFile : > ADC, PAGE = 1
      /* 省略不相关内容的显示 */
      }
      以上是一个自定义段并制定内存区域的完整例子。如果不需要这样的自定义,则可以不去管它,使用现有的,比如某个例子中可以使用的cmd文件就可以了