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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

自動初始化機制原理詳解

玩轉單片機 ? 來源:玩轉單片機 ? 2023-12-16 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

自動初始化機制是指初始化函數不需要被顯式調用,只需要在函數定義處通過宏定義的方式進行申明,就會在系統啟動過程中被執行。這篇文章就來探索一下其中的奧秘, 簡單理解其原理!

|知識點補充

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

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

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

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

__attribute__((weak))是GCC編譯器提供的一個特性,用于聲明或定義一個弱符號(weak symbol)。弱符號是指在鏈接時,如果存在同名的強符號(strong symbol),則會被強符號覆蓋。

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

| 原理研究

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

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

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

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

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

//環境初始化順序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");

//自動初始化(在main函數調用)
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

結果輸出:

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

過程分析:

這個測試代碼片段主要定義和使用了兩個段,每個段定義了開始和結束,并且在開始和結束間插入了若干個函數,通過觀察地址的變化會發現, 它們是按規律遞增的,就可以使用遍歷來調用指針指向的函數, 從而實現自動初始化外設的目的.

細節分析:

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

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

//假設調用
EXPORT_INIT_EXPORT(test_1_0,"1");

//一頓操作后,內存就存在了一個export_init_fn_t__export_call_test_1_0存放在".export_call."的輸入段中,并指定其屬于第一級初始化段
//就可以通過指針調用指針指向的函數來調用指定的函數,實現自動化初始化

|EventOS的EXPORT

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

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

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • GCC
    GCC
    +關注

    關注

    0

    文章

    110

    瀏覽量

    25317
  • 開源
    +關注

    關注

    3

    文章

    3645

    瀏覽量

    43666
  • 函數
    +關注

    關注

    3

    文章

    4377

    瀏覽量

    64546
  • 編譯器
    +關注

    關注

    1

    文章

    1659

    瀏覽量

    50053
  • 宏定義
    +關注

    關注

    0

    文章

    51

    瀏覽量

    9206

原文標題:開源探索|EventOS之自動初始化

文章出處:【微信號:玩轉單片機,微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    RT-Thread自動初始化詳解

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

    求藍牙協議棧初始化和調度機制資料?

    青云NRF51822/NRF52832藍牙4.x詳解第二講:藍牙協議棧初始化和調度機制對應藍牙協議棧的初始化一直是大家關注的問題,Nordic的協議棧如何運行,如何處理成為關鍵。本文并
    發表于 06-19 09:00

    STM32CubeMX雙緩沖機制初始化怎么實現?

    STM32CubeMX雙緩沖機制初始化怎么實現?
    發表于 12-08 06:30

    USART初始化結構體詳解

    USART 初始化結構體詳解標準庫函數對每個外設都建立了一個初始化結構體,比如USART_InitTypeDef,結構體成員用于設置外設工作參數,并由外設初始化配置函數,比如USART
    發表于 02-22 06:08

    RT-Thread自動初始化機制簡介

    RT-Thread 的時鐘管理以時鐘節拍為基礎,時鐘節拍是 RT-Thread 操作系統中最小的RT-Thread 自動初始化機制時鐘單位。RT-Thread 的定時器提供兩類定時器機制
    發表于 04-06 18:08

    RT-Thread系統自動初始化機制簡介

    RT-Thread 自動初始化機制1、自動初始化機制簡介在系統啟動流程圖中,有兩個函數:rt_c
    發表于 04-12 17:43

    EasyFlash+ulog自動初始化的問題與解決辦法介紹

    INIT_APP_EXPORT這個自動初始化機制,會發現有兩個相關的函數會自動初始化,請看下圖ulog_ef_backend_init函數會
    發表于 05-31 15:23

    手機模塊初始化向導

    手機模塊初始化向導:為了剛好的對手機模塊進行初始化,所以把最基本的向導寫下來.本向導適用于本公司的西門子TC35I和華為GT9000模塊。一、在初始化手機模塊前,請先確定DT
    發表于 09-18 09:41 ?17次下載

    RDA1846S初始化設置

    RDA1846S初始化設置RDA1846S初始化設置RDA1846S初始化設置
    發表于 01-15 17:08 ?0次下載

    UCOS_III_配置與初始化

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

    ds1302時鐘芯片初始化自動決定DS1302是否需要初始化程序

    ds1302芯片時鐘芯片大家都在問到底需要不需要初始化?這篇文章將會給大家一個程序,可以自動決定DS1302是否需要初始化
    發表于 10-19 19:19 ?8948次閱讀

    一文詳解RT-Thread自動初始化

    在學RT-Thread時,經常能聽到這個詞:自動初始化。用起來也非常容易,一個宏就解決了,但是原理是什么呢?
    的頭像 發表于 07-21 10:17 ?8083次閱讀
    一文<b class='flag-5'>詳解</b>RT-Thread<b class='flag-5'>自動</b><b class='flag-5'>初始化</b>

    RT-Thread自動初始化機制

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

    初始化的if和switch語句詳解

    在上面的代碼中,初始化語句是int s = check()。s的生命周期是整個if語句,這里也包含else語句。
    的頭像 發表于 10-14 10:50 ?1618次閱讀

    IM 系列設備過載保護機制下界面初始化中斷的底層邏輯與解決方案

    一、過載保護機制與界面初始化的關聯基礎 IM 系列設備的過載保護機制是保障設備安全運行的核心功能,其通過傳感器實時采集設備運行參數,如電流、電壓、溫度、系統資源占用率等。一旦這些參數超出預設閾值
    的頭像 發表于 06-27 09:58 ?32次閱讀
    主站蜘蛛池模板: 国产成人精品日本亚洲直接 | 欧美一区亚洲二区 | 新版bt天堂资源在线 | 黄网站色视频 | 狠狠狠色丁香婷婷综合久久五月 | 伊人精品成人久久综合欧美 | 国产白白白在线永久播放 | 一区二区中文字幕在线观看 | 国产日本久久久久久久久婷婷 | 精品视频网站 | 91啪在线视频 | 免费国内精品久久久久影院 | 成在线人视频免费视频 | 特黄特色三级在线播放 | 韩国三级理论在线看中文字幕 | 毛茸茸成熟妇女亚洲人 | 欧美18xxoovideos| 欧美四虎| 久久草精品 | 久久九色 | 天天操人人 | 日本视频一区二区三区 | 黄色在线观看视频网站 | 五月婷婷综合色 | 又粗又长又大真舒服好爽漫画 | 999久久久免费精品国产牛牛 | 99热官网| 磁力bt种子搜索在线 | aaaaa国产毛片| 都市激情综合网 | 精品伊人久久香线蕉 | 天天操天天干天天爽 | 永久毛片 | 玖玖国产在线观看 | 人人爱人人射 | 视频免费观看视频 | 一级黄色录像毛片 | 狠狠88综合久久久久综合网 | 四虎精品免费永久在线 | 日本中文字幕在线播放 | 美日韩一级 |