关于变量的外部声明

  在比较大的项目中,若需要使用全局变量,可以分以下四个步骤进行:

  1. 在项目根目录/include/globalvar.h中进行所有变量的原型声明(如int a);
  2. 在项目根目录/include/externvar.h中进行所有变量的外部声明(如extern int a);
  3. 在main.cpp文件中包含glbvariable.h头文件;
  4. 若需要在其它源文件中使用全局变量,则应包含externvar.h头文件。

 

  需要注意的是,若globalvar.h中需要改动,则必须删除原目标文件main.o,使用make重新编译。原因如下:

  根据Makefile的机制,若目标文件main.o修改时间晚于依赖文件main.cpp的修改时间,则不进行重新编译。而依赖文件main.cpp所包含的globalvar.h存在变动,并不在main.cpp的修改时间上得以体现,即main.cpp是不变的。而在link阶段,根据extern的机制,在已加载到内存中的目标文件代码中寻找该变量,若main.o 不是最新的,globalvar.h的改动就无法生效,于是就会出现找不到该变量的错误(undefined reference to ‘XXX’. Collect2: ld returned 1 exit status.).

转载于:https://www.cnblogs.com/YoungHit/archive/2012/06/22/2558748.html

<think>我们正在讨论在TI(Texas Instruments)的嵌入式开发环境中如何声明外部变量。根据引用[1]和引用[4],TI的开发环境通常使用C/C++语言,并且涉及到链接器命令文件(.cmd文件)来管理内存分配。 在C语言中,声明外部变量(即在其他文件中定义的变量)使用`extern`关键字。这样,在当前文件中就可以使用该变量,而链接器会在链接阶段解析该变量的实际地址。 步骤: 1. 在一个源文件(.c文件)中定义变量(分配存储空间)。 2. 在需要使用该变量的其他源文件中,使用`extern`关键字声明变量(不分配存储空间,只是告诉编译器该变量在其他地方定义)。 示例: 假设我们在`file1.c`中定义了一个全局变量: ```c // file1.c int my_external_variable = 0; ``` 在`file2.c`中,如果我们想使用`my_external_variable`,我们需要这样声明: ```c // file2.c extern int my_external_variable; void foo() { my_external_variable = 10; } ``` 这样,链接器会将两个文件中的`my_external_variable`关联到同一个存储位置。 另外,根据引用[4],TI的链接器命令文件(.cmd)用于指定内存布局,包括代码和数据(包括全局变量)的存放位置。例如,我们可以在.cmd文件中定义一个内存区域(如RAM),并将一个特定的段(如`.bss`段,用于存放未初始化的全局变量)分配到该区域。但是,变量声明和定义是在C代码中完成的,.cmd文件只是控制它们被放置的物理地址。 注意:在嵌入式系统中,有时需要将变量放置在特定的内存区域(如外部RAM),这时可能需要使用特定的编译器指令(如`#pragma`)或者链接器指令(在.cmd文件中指定段的位置)。例如,在TI的CCS(Code Composer Studio)中,可以使用以下方式将变量分配到特定的段: ```c #pragma DATA_SECTION(variable_name, "section_name"); int variable_name; ``` 然后在.cmd文件中,将`section_name`分配到特定的内存区域。 总结: 1. 使用`extern`关键字声明在其他文件中定义的变量。 2. 在一个文件中定义变量(不使用`extern`,这样会分配存储空间)。 3. (可选)如果需要特定的内存位置,使用`#pragma`指令将变量分配到自定义段,并在链接器命令文件中配置该段的内存位置。 相关问题: 1. 在TI的嵌入式系统中,如何将变量放置在外部RAM? 2. 链接器命令文件(.cmd)在变量分配中起什么作用? 3. 在多个文件中使用同一个全局变量需要注意什么?</think>在TI(Texas Instruments)嵌入式开发环境中声明外部变量,需结合C语言规范与TI特定工具链(如CCS)的特性。以下是关键步骤和注意事项: ### 1. **基础声明规则** - **定义变量**:在**一个源文件**(如`.c`)中定义全局变量并分配存储空间: ```c // file1.c int globalVar; // 定义变量(分配内存) ``` - **外部声明**:在其他文件中使用`extern`关键字声明(不分配内存): ```c // file2.c extern int globalVar; // 声明外部变量 ``` ### 2. **TI特定配置** - **内存分配控制**: - 通过**链接器命令文件(`.cmd`)** 指定变量存储位置(如外部RAM): ```cmd MEMORY { EXTRAM : origin = 0x8000, length = 0x1000 } SECTIONS { .myVars > EXTRAM // 将自定义段分配到外部RAM } ``` - 在C代码中用`#pragma`关联变量与自定义段: ```c #pragma DATA_SECTION(globalVar, ".myVars"); int globalVar; // 变量分配到外部RAM ``` - **初始化外部RAM变量**: - 若需初始化,在`.c`文件中赋值: ```c int globalVar = 42; // 定义并初始化 ``` - 链接器自动生成初始化代码(需确保`.cmd`正确配置加载/运行地址)[^4]。 ### 3. **多文件引用示例** ```c // ----- file1.c ----- #pragma DATA_SECTION(sharedVar, ".extRamSection") int sharedVar = 0; // 定义在外部RAM // ----- file2.c ----- extern int sharedVar; // 外部声明 void updateVar() { sharedVar++; // 跨文件访问 } ``` ### 4. **注意事项** - **作用域**:避免同名冲突,使用`static`限制文件内作用域。 - **易失性**:硬件相关变量需加`volatile`(如`volatile extern int reg;`)。 - **P2口指定**:部分TI芯片通过P2口选择外部RAM页,需在`STARTUP.A51`中配置[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值