電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 14|回復(fù): 0
收起左側(cè)

鮮為人知的__attribute__((__section__(section_name))),你知道怎么用嗎?

[復(fù)制鏈接]

171

主題

171

帖子

1312

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1312
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2023-4-15 17:01:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
簡(jiǎn)介_(kāi)_attribute__ 是gcc編譯器支持的一個(gè)編譯特性(arm編譯器也支持此特性,比如我們常用的keil就是用的ARMGCC編譯器),也就是通過(guò)給函數(shù)或者變量聲明屬性值,以便讓編譯器能夠?qū)σ幾g的程序進(jìn)行優(yōu)化處理。
更多詳細(xì)內(nèi)容,請(qǐng)看這篇官網(wǎng)文檔:《Unixwiz.net - Software Consulting Central -- Using GNU C __attribute__》:http://www.unixwiz.net/techtips/gnu-c-attributes.html而對(duì)于 section 這個(gè)關(guān)鍵字,我們可以通過(guò)它將指定的變量定義到指定的輸入段中。keil中對(duì)于此用法的描述是:ARM Compiler v5.06 for uVision armcc User Guide
section 屬性指定變量必須放置在特定數(shù)據(jù)部分中,通常,ARM 編譯器將其生成的對(duì)象放在 .data 和 .bss 等部分中。但是,您可能需要其他數(shù)據(jù)部分,或者您可能希望變量出現(xiàn)在特殊部分中,例如,映射到特殊硬件。
如果使用 section 屬性,則只讀變量將放置在 RO 數(shù)據(jù)部分中,讀寫(xiě)變量將放置在 RW 數(shù)據(jù)部分中,除非您使用 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));
用法詳解先來(lái)看一段代碼(摘自CSDN,如有侵權(quán),聯(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);
}
// 編譯器會(huì)自動(dòng)提供__start_ss,__stop_ss標(biāo)志段ss的起止地址
extern size_t __start_ss;
extern size_t __stop_ss;
typedef struct
{
    void (*p)(int, int);
} node_t;
// 結(jié)構(gòu)體變量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結(jié)構(gòu)中的p指向的函數(shù)
    for (p = (node_t *)&__start_ss; p p(a, b);
        a += 1;
        b += 2;
    }
}
來(lái)看一下運(yùn)行的結(jié)果:

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表