以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 将变量放在特定的存储区位置。