嵌入式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。