|
簡介__attribute__ 是gcc編譯器支持的一個編譯特性(arm編譯器也支持此特性,比如我們常用的keil就是用的ARMGCC編譯器),也就是通過給函數或者變量聲明屬性值,以便讓編譯器能夠對要編譯的程序進行優(yōu)化處理。
更多詳細內容,請看這篇官網文檔:《Unixwiz.net - Software Consulting Central -- Using GNU C __attribute__》:http://www.unixwiz.net/techtips/gnu-c-attributes.html而對于 section 這個關鍵字,我們可以通過它將指定的變量定義到指定的輸入段中。keil中對于此用法的描述是:ARM Compiler v5.06 for uVision armcc User Guide
section 屬性指定變量必須放置在特定數據部分中,通常,ARM 編譯器將其生成的對象放在 .data 和 .bss 等部分中。但是,您可能需要其他數據部分,或者您可能希望變量出現(xiàn)在特殊部分中,例如,映射到特殊硬件。
如果使用 section 屬性,則只讀變量將放置在 RO 數據部分中,讀寫變量將放置在 RW 數據部分中,除非您使用 zero_init 屬性。在這種情況下,變量放置在 ZI 部分中。
/* in RO section */
const int descriptor[3] __attribute__((section ("descr"))) = { 1,2,3 };
/* in RW section */
long long rw_initialized[10] __attribute__((section ("INITIALIZED_RW"))) = {5};
/* in RW section */
long long rw[10] __attribute__((section ("RW")));
/* in ZI section */
long long altstack[10] __attribute__((section ("STACK"), zero_init));
用法詳解先來看一段代碼(摘自CSDN,如有侵權,聯(lián)系刪除):
#include
#define SEC __attribute__((__section__("ss"), aligned(sizeof(void *))))
void func_1(int a, int b)
{
printf("%s %d %d
", __func__, __LINE__, a + b);
}
void func_2(int a, int b)
{
printf("%s %d %d
", __func__, __LINE__, a * b);
}
// 編譯器會自動提供__start_ss,__stop_ss標志段ss的起止地址
extern size_t __start_ss;
extern size_t __stop_ss;
typedef struct
{
void (*p)(int, int);
} node_t;
// 結構體變量a位于自定義段ss
SEC node_t a = {
.p = func_1,
};
SEC node_t b = {
.p = func_2,
};
int main(int argc, char **argv)
{
int a = 3, b = 4;
node_t *p;
// 遍歷段ss,執(zhí)行node_t結構中的p指向的函數
for (p = (node_t *)&__start_ss; p p(a, b);
a += 1;
b += 2;
}
}
來看一下運行的結果: |
|