在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

自動(dòng)初始化機(jī)制原理詳解

玩轉(zhuǎn)單片機(jī) ? 來源:玩轉(zhuǎn)單片機(jī) ? 2023-12-16 09:33 ? 次閱讀

自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過程中被執(zhí)行。這篇文章就來探索一下其中的奧秘, 簡單理解其原理!

|知識(shí)點(diǎn)補(bǔ)充

__attribute__((section(x)))是GNU C的一個(gè)特色之一,它可以用于將變量或函數(shù)放置在指定的段中。例如,你可以使用__attribute__((section(".my_section")))將變量或函數(shù)放置在名為my_section的段中。這對(duì)于嵌入式系統(tǒng)編程操作系統(tǒng)內(nèi)核編程非常有用。

__attribute__((used))是GCC編譯器提供的一個(gè)特性,用于告訴編譯器在目標(biāo)文件中保留一個(gè)靜態(tài)變量或函數(shù),即使它沒有被引用。這樣可以避免鏈接器刪除未使用的節(jié),或者確保某些特定的變量或函數(shù)被輸出。

__attribute__((unused))是GCC編譯器提供的一個(gè)特性,用于告訴編譯器某個(gè)變量或函數(shù)可能未被使用,從而避免編譯器產(chǎn)生未使用變量或函數(shù)的警告。在變量或函數(shù)前加上__attribute__((unused))即可使用該特性。

__attribute__((aligned(n)))是GCC編譯器提供的一個(gè)特性,用于設(shè)置變量、類型、函數(shù)的對(duì)齊方式。它的作用是告訴編譯器在分配內(nèi)存空間時(shí),要求以n個(gè)字節(jié)為邊界。

__attribute__((weak))是GCC編譯器提供的一個(gè)特性,用于聲明或定義一個(gè)弱符號(hào)(weak symbol)。弱符號(hào)是指在鏈接時(shí),如果存在同名的強(qiáng)符號(hào)(strong symbol),則會(huì)被強(qiáng)符號(hào)覆蓋。

a67dabf8-9ba6-11ee-8b88-92fbcf53809c.png

| 原理研究

深入研究了一下, 發(fā)現(xiàn)這樣使用宏真的很奇妙, 這里就簡單介紹一下原理:

export.h文件

#ifndef__EXPORT_H
#define__EXPORT_H

#defineEXPORT_USED__attribute__((used))
#defineEXPORT_SECTION(x)__attribute__((section(x)))

typedefint(*export_init_fn_t)(void);

#defineEXPORT_INIT_EXPORT(fn,level)
EXPORT_USEDconstexport_init_fn_t__export_call_##fnEXPORT_SECTION(".export_call."level)=fn

//板級(jí)初始化順序1
#defineEXPORT_BOARD_INIT(fn)EXPORT_INIT_EXPORT(fn,"1")

//設(shè)備初始化順序3
#defineEXPORT_DEVICE_INIT(fn)EXPORT_INIT_EXPORT(fn,"2")

//組件初始化順序4
#defineEXPORT_COMPONENT_INIT(fn)EXPORT_INIT_EXPORT(fn,"3")

//環(huán)境初始化順序5
#defineEXPORT_ENV_INIT(fn)EXPORT_INIT_EXPORT(fn,"4")

//APP初始化順序6
#defineEXPORT_APP_INIT(fn)EXPORT_INIT_EXPORT(fn,"5")

voidexport_components_init(void);

#endif

export.c文件

#include"export.h"
#include"stdio.h"

staticinttest_0_start(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_0_start,"0");

staticinttest_0_0(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_0_0,"0");

staticinttest_0_1(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_0_1,"0");

staticinttest_0_end(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_0_end,"0.end");

staticinttest_1_start(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_1_start,"1");

staticinttest_1_0(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_1_0,"1");

staticinttest_1_1(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_1_1,"1");

staticinttest_1_end(void)
{
return0;
}
EXPORT_INIT_EXPORT(test_1_end,"1.end");

//自動(dòng)初始化(在main函數(shù)調(diào)用)
voidexport_components_init(void)
{
printf("pfn1:%p
",&__export_call_test_0_start);
printf("pfn2:%p
",&__export_call_test_0_0);
printf("pfn3:%p
",&__export_call_test_0_1);
printf("pfn4:%p
",&__export_call_test_0_end);

printf("pfn5:%p
",&__export_call_test_1_start);
printf("pfn6:%p
",&__export_call_test_1_0);
printf("pfn7:%p
",&__export_call_test_1_1);
printf("pfn8:%p
",&__export_call_test_1_end);

volatileconstexport_init_fn_t*pfn;
for(pfn=&__export_call_test_0_start;pfn

結(jié)果輸出:

pfn1:08000c50
pfn2:08000c54
pfn3:08000c58
pfn4:08000c5c
pfn5:08000c60
pfn6:08000c64
pfn7:08000c68
pfn8:08000c6c
08000c50
08000c54
08000c58
08000c5c
08000c60
08000c64
08000c68

過程分析:

這個(gè)測(cè)試代碼片段主要定義和使用了兩個(gè)段,每個(gè)段定義了開始和結(jié)束,并且在開始和結(jié)束間插入了若干個(gè)函數(shù),通過觀察地址的變化會(huì)發(fā)現(xiàn), 它們是按規(guī)律遞增的,就可以使用遍歷來調(diào)用指針指向的函數(shù), 從而實(shí)現(xiàn)自動(dòng)初始化外設(shè)的目的.

細(xì)節(jié)分析:

//定義一個(gè)函數(shù)指針
typedefint(*export_init_fn_t)(void);

//宏定義
#defineEXPORT_INIT_EXPORT(fn,level)
EXPORT_USEDconstexport_init_fn_t__export_call_##fnEXPORT_SECTION(".export_call."level)=fn

//假設(shè)調(diào)用
EXPORT_INIT_EXPORT(test_1_0,"1");

//一頓操作后,內(nèi)存就存在了一個(gè)export_init_fn_t__export_call_test_1_0存放在".export_call."的輸入段中,并指定其屬于第一級(jí)初始化段
//就可以通過指針調(diào)用指針指向的函數(shù)來調(diào)用指定的函數(shù),實(shí)現(xiàn)自動(dòng)化初始化

|EventOS的EXPORT

這個(gè)先待定, 后續(xù)有時(shí)間再移植,export需要參考elab,涉及到assertcommonexportlog,感興趣的讀者可以參考:

a68b86ec-9ba6-11ee-8b88-92fbcf53809c.png

鏈接//gitee.com/event-os/eventos/tree/dev_df/examples/stm32g070

使用了export機(jī)制可以讓代碼變得更加簡潔,感興趣的讀者可以在理解原理后進(jìn)行完善和優(yōu)化.

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • GCC
    GCC
    +關(guān)注

    關(guān)注

    0

    文章

    109

    瀏覽量

    25142
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3523

    瀏覽量

    43233
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4363

    瀏覽量

    63715
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1651

    瀏覽量

    49693
  • 宏定義
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    9142

原文標(biāo)題:開源探索|EventOS之自動(dòng)初始化

文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī),微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RT-Thread自動(dòng)初始化詳解

    我們知道,在寫裸機(jī)程序時(shí),當(dāng)我們完成硬件初始化后,就需要在主函數(shù)中進(jìn)行調(diào)用。當(dāng)我們使用RT-Thread后,完全不需要這樣做了,我們可以將硬件等自動(dòng)初始化。 RT-Thread?自動(dòng)
    的頭像 發(fā)表于 06-25 21:38 ?1.1w次閱讀
    RT-Thread<b class='flag-5'>自動(dòng)</b><b class='flag-5'>初始化</b><b class='flag-5'>詳解</b>

    求藍(lán)牙協(xié)議棧初始化和調(diào)度機(jī)制資料?

    青云NRF51822/NRF52832藍(lán)牙4.x詳解第二講:藍(lán)牙協(xié)議棧初始化和調(diào)度機(jī)制對(duì)應(yīng)藍(lán)牙協(xié)議棧的初始化一直是大家關(guān)注的問題,Nordic的協(xié)議棧如何運(yùn)行,如何處理成為關(guān)鍵。本文并
    發(fā)表于 06-19 09:00

    STM32CubeMX雙緩沖機(jī)制初始化怎么實(shí)現(xiàn)?

    STM32CubeMX雙緩沖機(jī)制初始化怎么實(shí)現(xiàn)?
    發(fā)表于 12-08 06:30

    USART初始化結(jié)構(gòu)體詳解

    USART 初始化結(jié)構(gòu)體詳解標(biāo)準(zhǔn)庫函數(shù)對(duì)每個(gè)外設(shè)都建立了一個(gè)初始化結(jié)構(gòu)體,比如USART_InitTypeDef,結(jié)構(gòu)體成員用于設(shè)置外設(shè)工作參數(shù),并由外設(shè)初始化配置函數(shù),比如USART
    發(fā)表于 02-22 06:08

    RT-Thread自動(dòng)初始化機(jī)制簡介

    RT-Thread 的時(shí)鐘管理以時(shí)鐘節(jié)拍為基礎(chǔ),時(shí)鐘節(jié)拍是 RT-Thread 操作系統(tǒng)中最小的RT-Thread 自動(dòng)初始化機(jī)制時(shí)鐘單位。RT-Thread 的定時(shí)器提供兩類定時(shí)器機(jī)制
    發(fā)表于 04-06 18:08

    RT-Thread系統(tǒng)自動(dòng)初始化機(jī)制簡介

    RT-Thread 自動(dòng)初始化機(jī)制1、自動(dòng)初始化機(jī)制簡介在系統(tǒng)啟動(dòng)流程圖中,有兩個(gè)函數(shù):rt_c
    發(fā)表于 04-12 17:43

    EasyFlash+ulog自動(dòng)初始化的問題與解決辦法介紹

    INIT_APP_EXPORT這個(gè)自動(dòng)初始化機(jī)制,會(huì)發(fā)現(xiàn)有兩個(gè)相關(guān)的函數(shù)會(huì)自動(dòng)初始化,請(qǐng)看下圖ulog_ef_backend_init函數(shù)會(huì)
    發(fā)表于 05-31 15:23

    手機(jī)模塊初始化向?qū)?/a>

    手機(jī)模塊初始化向?qū)?為了剛好的對(duì)手機(jī)模塊進(jìn)行初始化,所以把最基本的向?qū)懴聛?本向?qū)нm用于本公司的西門子TC35I和華為GT9000模塊。一、在初始化手機(jī)模塊前,請(qǐng)先確定DT
    發(fā)表于 09-18 09:41 ?17次下載

    RDA1846S初始化設(shè)置

    RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置RDA1846S初始化設(shè)置
    發(fā)表于 01-15 17:08 ?0次下載

    UCOS_III_配置與初始化

    UCOS_III_配置與初始化
    發(fā)表于 12-20 22:53 ?5次下載

    ds1302時(shí)鐘芯片初始化自動(dòng)決定DS1302是否需要初始化程序

    ds1302芯片時(shí)鐘芯片大家都在問到底需要不需要初始化?這篇文章將會(huì)給大家一個(gè)程序,可以自動(dòng)決定DS1302是否需要初始化
    發(fā)表于 10-19 19:19 ?8799次閱讀

    在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無法初始化的問題如何解決

    本文檔的主要內(nèi)容詳細(xì)介紹的是在51平臺(tái)下初始化文件的引入導(dǎo)致全局變量無法初始化的問題如何解決。
    發(fā)表于 08-20 17:31 ?0次下載
    在51平臺(tái)下<b class='flag-5'>初始化</b>文件的引入導(dǎo)致全局變量無法<b class='flag-5'>初始化</b>的問題如何解決

    一文詳解RT-Thread自動(dòng)初始化

    在學(xué)RT-Thread時(shí),經(jīng)常能聽到這個(gè)詞:自動(dòng)初始化。用起來也非常容易,一個(gè)宏就解決了,但是原理是什么呢?
    的頭像 發(fā)表于 07-21 10:17 ?7865次閱讀
    一文<b class='flag-5'>詳解</b>RT-Thread<b class='flag-5'>自動(dòng)</b><b class='flag-5'>初始化</b>

    RT-Thread自動(dòng)初始化機(jī)制

    ??在分析之前首先查閱 RT-Thread 的官方文檔 [RT-Thread 自動(dòng)初始化機(jī)制](https://www.rt-thread.org/document/site
    的頭像 發(fā)表于 06-17 08:52 ?3005次閱讀
    RT-Thread<b class='flag-5'>自動(dòng)</b><b class='flag-5'>初始化</b><b class='flag-5'>機(jī)制</b>

    初始化的if和switch語句詳解

    在上面的代碼中,初始化語句是int s = check()。s的生命周期是整個(gè)if語句,這里也包含else語句。
    的頭像 發(fā)表于 10-14 10:50 ?1549次閱讀
    主站蜘蛛池模板: 欧美奇米 | 操美女免费视频 | 国产热| 久久婷婷是五月综合色狠狠 | 天堂在线视频 | 久久99精品一级毛片 | 狠狠干2019| 天堂影院jav成人天堂免费观看 | 男人cao女人视频在线观看 | 国内一国产农村妇女一级毛片 | 亚州 色 图 综合 | 欧美猛交xxxx乱大交 | 欧美亚洲h在线一区二区 | 久久伊人男人的天堂网站 | 免费黄色网址网站 | 国产肥女bbwbbw | 性网站免费| 欧美二级黄色片 | 加勒比一到三区 | 亚洲欧美婷婷 | 日本三级三级三级免费看 | 亚洲最新网站 | 天天干天天谢 | 国产又色 | 国产成年美女毛片80s | 曰曰摸天天摸人人看久久久 | 狼干综合 | 五月婷六月丁香 | 69色视频 | 夜夜爽天天干 | 六月婷婷综合 | 久久精品免费观看 | 色多多网 | 亚洲狠狠操 | 日本不卡视频一区二区三区 | 201天天爱天天做 | 亚洲va久久久噜噜噜久久男同 | 久久伊人成人网 | 亚洲第一综合 | 福利视频午夜 | 一级特黄女人生活片 |