嵌入式C语言–Pragma Section与Map文件
嵌入式C语言--Pragma Section与Map文件
- 嵌入式C语言--Pragma Section与Map文件
- 一. Pragma修饰符
- 二. Map文件
- 1)什么是map文件
- 2)map文件的构成
- 3)常用的段映射地址
- 4)map文件生成
- 三. Section修饰符
- 1)定义
- 2)作用
一. Pragma修饰符
#pragma命令的作用: 是设定编译器的状态或者是指示编译器完成一些特定的动作
它是一个预编译指令,它的格式: #pragma 参数
#pragma once保证头文件被编译一次,
#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译
#pragma resource “.dfm“ 表示把.dfm文件中的资源加入工程.
#pragma warning(disable:4507) 不显示4507警告信息.
#pragma warning(once:4385) : 4385号警告信息仅报告一次;
#pragma warning(error:164) : 把164号警告信息作为一个错误
#pragma pack(n) 从这开始对后面的结构成员进行对齐,既如果结构成员1的大小<n则将成员1扩大到n个大小;
如果成员1的大小>n则使用成员1的大小.
#pragma comment(lib, “aaa.lib”)添加链接库
#pragma warning( push ) : 保存所有警告信息的现有的警告状态
二. Map文件
1)什么是map文件
map文件是软件编译后产生的有关所有程序、数据及IO空间的一种映射文件。
通过map文件可以知道函数大小,入口地址等一些重要信息。
Map文件可以理解成为它就是程序的地图。
2)map文件的构成
map文件大概分为文件头、内存配置、段映射、全局符号四部分。
段映射部分与cmd文件中的SECTION指令关联,在该部分程序中所有的段实际映射的起始地址与实际长度均有详细说明。可以具体到程序中PROGMA指定的段和各个单独文件产生的obj文件。
3)常用的段映射地址
Section | 放置位置 | 说明 |
---|---|---|
RO-data | 位于FLASH中 | 指除了内联数据(inline data)之外的常量数据 |
RW-data | 位于RAM中 | 指可读写(RW)、已初始化的变量数据 |
Rozdata | 位于RAM中 | 指未初始化(ZI)的变量数据 |
4)map文件生成
编译后产生,在编译完生成mot文件的同时,生成一个同名的map文件。
三. Section修饰符
1)定义
使用section关键字可以将我们指定的结构体或变量放入到我们自定义的输入段中
同时函数也可以放到我们自定义的输入段当中。
2)作用
对代码的安全校验、扩展移植都会有很好的效果。
小型项目、独立开发看不出效果,但对复杂的多人合作的项目,合适的关键字对代码的稳定性和架构是锦上添花的。
将函数放入到my_fun这个段当中。
将变量aaa放入到my_val这个段当中。
int __attribute__((section("my_val"))) aaa;
int __attribute__((section("my_fun"))) test1(int a,int b)
{
return (a+b);
}
不同编译器对section属性的定义略有差异,但效果相同、在这里可以了解一下。
#if defined(__CC_ARM) || defined(__CLANG_ARM) /* ARM Compiler */
#define SECTION(x) __attribute__((section(x)))
#elif defined (__IAR_SYSTEMS_ICC__) /* for IAR Compiler */
#define SECTION(x) @ x
#elif defined (__GNUC__) /* GNU GCC Compiler */
#define SECTION(x) __attribute__((section(x)))
・・・
在map当中的Section。