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.

在MSP430编程中将变量放在特定的存储区地址单元

Other Parts Discussed in Thread: MSP430F5438A

以IAR IDE为例

  • 使用 location pragma:
代码生成的TI_TXT文件
#include <msp430.h>
 
#pragma location=0x1800
const unsigned char port_bit = BIT0;
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;  // 关闭看门狗 
  P1DIR = port_bit;          // 设置P1.x 为输出
 
  while(1)
  {
    P1OUT ^= port_bit;        
	  __delay_cycles(100000);
  }
}
@1800
01 
@5C00
31 40 00 5C B0 13 0C 5C B0 13 48 5C B2 40 80 5A
5C 01 D2 42 00 18 04 02 D2 E2 00 18 02 02 00 3C
3F 40 33 82 3F 53 FE 2F F7 3F 03 43 0A 12 21 83
0A 4C 81 4A 00 00 0D 41 0D 53 5C 43 B0 13 4C 5C
F8 3F 03 43 80 00 2C 5C 80 00 44 5C 10 01 
@FFFE
00 5C 
q

  • 使用 (@):
代码生成的TI_TXT文件
#include <msp430.h>
 
const unsigned char port_bit @ 0x1800 = BIT0;
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;  // 关闭看门狗 
  P1DIR = port_bit;          // 设置 P1.x 为输出 
 
  while(1)
  {
    P1OUT ^= port_bit;          
	  __delay_cycles(100000);
  }
}
@1800
01 
@5C00
31 40 00 5C B0 13 0C 5C B0 13 48 5C B2 40 80 5A
5C 01 D2 42 00 18 04 02 D2 E2 00 18 02 02 00 3C
3F 40 33 82 3F 53 FE 2F F7 3F 03 43 0A 12 21 83
0A 4C 81 4A 00 00 0D 41 0D 53 5C 43 B0 13 4C 5C
F8 3F 03 43 80 00 2C 5C 80 00 44 5C 10 01 
@FFFE
00 5C 
q

也可以使用linker配置文件的段名,使用 constseg PRAGMA,上述例子F5438A默认的Linker配置文件是lnk430F5438A.xcl, 它包含了 INFOD 段:

// -----------------------------------------------
// 只读存储区
//

// -------------------------------------
// 信息区
//

-Z(CONST)INFO=1800-19FF
-Z(CONST)INFOA=1980-19FF
-Z(CONST)INFOB=1900-197F
-Z(CONST)INFOC=1880-18FF
-Z(CONST)INFOD=1800-187F

可以使用 constseg pragma:

代码生成TI_TXT文件
#include <msp430.h>
 
#pragma constseg=INFOD
const unsigned char port_bit = BIT0;
#pragma constseg=default
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;  // disable watchdog
  P1DIR = port_bit;          // set P1.x as output
 
  while(1)
  {
    P1OUT ^= port_bit;         // toggle P1.0
	  __delay_cycles(100000);
  }
}
@1800
01 
@5C00
31 40 00 5C B0 13 0C 5C B0 13 48 5C B2 40 80 5A
5C 01 D2 42 00 18 04 02 D2 E2 00 18 02 02 00 3C
3F 40 33 82 3F 53 FE 2F F7 3F 03 43 0A 12 21 83
0A 4C 81 4A 00 00 0D 41 0D 53 5C 43 B0 13 4C 5C
F8 3F 03 43 80 00 2C 5C 80 00 44 5C 10 01 
@FFFE
00 5C 
q

以CCS IDE为例

使用 location PRAGMA

#pragma LOCATION( x , address );
int x;
#pragma location=address
int x;

在linker cmd 文件中使用DATA_SECTION PRAGMA 

老版本的 CCS v4.x 使用CGT 版本v3.x 不支持location pragma, 而使用DATA_SECTION pragma. 老版本的CGT v3.x使用 DATA_SECTION pragma其功能等同于 IAR IDE 中使用  constseg pragma。默认的lnk_msp430f5438a.cmd 包含INFOD 区。

MEMORY
{
    ........

    INFOA                   : origin = 0x1980, length = 0x0080
    INFOB                   : origin = 0x1900, length = 0x0080
    INFOC                   : origin = 0x1880, length = 0x0080
    INFOD                   : origin = 0x1800, length = 0x0080

    ........
}

SECTIONS
{
    ........

    .infoA     : {} > INFOA              /* MSP430 INFO区 */
    .infoB     : {} > INFOB
    .infoC     : {} > INFOC
    .infoD     : {} > INFOD

    ........
}

使用DATA_SECTION

代码生成的TI_TXT文件
#include <msp430.h>
 
#pragma DATA_SECTION(port_bit, ".infoD")
const unsigned char port_bit = BIT0;
 
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;  // 关闭看门狗
  P1DIR = port_bit;          // 设置 P1.x 为输出
 
  while(1)
  {
    P1OUT ^= port_bit;         
	  __delay_cycles(100000);
  }
}
@1800
01 
@5c00
31 40 00 5C B0 13 AA 5C 0C 93 02 24 B0 13 1A 5C 
0C 43 B0 13 88 5C B0 13 AE 5C 1A 14 3F 40 00 00 
3F 90 01 00 22 28 3F 40 00 00 3F 90 01 00 1D 28 
3A 40 00 00 3A 80 00 00 3A 50 07 00 5A 09 39 40 
00 00 3C 49 3D 49 CF 0D 0F 18 4F 5F 00 18 4F DC 
6F 4F 4F 4F 5F 06 00 18 5B 4F 00 00 1C 53 0D 63 
3E 49 3F 49 4B 13 1A 83 EC 23 3F 40 00 00 3F 90 
00 00 08 24 3A 40 00 00 02 3C 6A 13 2A 52 3A 90 
00 00 FB 23 19 16 10 01 B2 40 80 5A 5C 01 D2 42 
00 18 04 02 D2 E2 00 18 02 02 0D 14 3D 40 32 82 
1D 83 FE 23 0D 16 F6 3F 03 43 1C 43 10 01 03 43 
FF 3F 
@fffe
00 5C 
q

修改Linker 配置文件

如上所述,因此可以通过修改linker配置文件和cmd文件来定义新的存储区段,将特殊的变量放在指定的存储区中。IAR linker配置文件和CCS linker cmd文件可以分别使用 constseg pragma和DATA_SECTION pragma 将变量放在特定的存储区位置。