久综合色-久综合网-玖草影视-玖草资源在线-亚洲黄色片子-亚洲黄色片在线观看

Hello! 歡迎來到小浪云!


單片機模擬Linux自動初始化流程!


avatar
小浪云 2025-01-04 142

通常我們寫程序都是按照這個套路,一個函數一個函數按照順序邏輯一個一個的執行下去。

單片機模擬Linux自動初始化流程!

如果邏輯非常復雜,涉及的模塊比較多,那么這種順序執行的代碼就會比較臃腫,各模塊耦合非常緊密。Linux kernel 中,有各種外設驅動,想按照一個順序邏輯執行下去,幾乎是不可能的。

而kenrel 代碼能有這么大的代碼量,大而不亂,把各層次,各模塊有效的分離,而大量的代碼又有邏輯的組織在一起,和這個initcall 有至關重要的作用。

通過模仿這種方式,最后把圖片中main函數代碼清空,分離這種邏輯,又實現同樣的功能。

如何能實現這樣的功能了,需要一些背景知識:

1,程序代碼的組織

2,鏈接腳本相關的知識。

3,函數指針的應用。

單片機模擬Linux自動初始化流程!

1,代碼的組織,如圖片需要知道變量a,b及函數指針 f,f2是存放在程序的哪些段中,可以去看一下這篇stm32 啟動代碼 實現|c語言,上述的a,f都是存放在bss 段中,b,f2是存放在data段中,因為已經給定了初始值,而實現這個intcall會把需要自動初始化的數據放到一個自定義的段中去,如.initcall。

如何放到特定的段中了,就需要用到了attribute((section)) 關鍵字來改變的數據存放段了。

目前的程序編譯出來用到了這些個段,除了.isr_vector也是添加的,其他都是編譯器默認的。

單片機模擬Linux自動初始化流程!

先加段代碼:

單片機模擬Linux自動初始化流程!

當然這還不夠,還需要告訴連接器(LD) 要把 .initcall 段也鏈接到程序中,所以也需要這段修改。

單片機模擬Linux自動初始化流程!

這段按8字節對齊,定義兩個全局變量,及按0-5順序的鏈接這些數據,這樣的兩處修改,再來看一下程序各段的情況。

如圖片:

單片機模擬Linux自動初始化流程!

已經多出紅色框框為.initcalls段,這段總共是8個字節,從0x80005a8除開始。

在來看一下具體的這一段的情況,用readelf 工具。

單片機模擬Linux自動初始化流程!

和上面的size工具是匹配的,而綠色框框的地址就是SystemInit(0x08000231,小端模式。)

單片機模擬Linux自動初始化流程!

所以通過Attribute及修改鏈接腳本,就把函數指針變量放到了.initcall 段中。

那么如何來調用這個函數了,和之前的初始化data段數據類似,遍歷這個段,然后取出這個函數地址,然后強制把段中的地址,轉成函數指針,再直接調用即可。

單片機模擬Linux自動初始化流程!單片機模擬Linux自動初始化流程!

實現的這張圖片,就是從.initcall段中取出函數地址,然后直接調用,非常容易把函數的地址及這個函數指針變量的地址搞混。

代碼這么修改,需要自動初始化函數的確是可以調到了,但是每次都寫這么長長的一段Static initcall_t __ attribute__(( __ used__,__ section__(“.initcall.0.init”))),就是不舒服. linux kernel中通過宏來修改。

這個也一樣。

單片機模擬Linux自動初始化流程!

添加 按照程序邏輯順序執行的一些宏

0,low_level_init 比如放始化系統基本時鐘

1,arch_init 比如放CPU架構d如初始化NVIC的一些初始化。

2,dev_init 外設模塊初始化,比 i2c, flash, spi等。

3,board_init 做具體硬件板及的一些設置。

4,os_init 操作系統的一些設置如,文件系統,網絡協議等。

5,app_init 最后跑用戶程序。

把自己的程序也做一下修改,用宏代替。這樣子掉調用do_initcalls 就會按照0,1-到5的順序執行了。

單片機模擬Linux自動初始化流程!單片機模擬Linux自動初始化流程!

最后在來看一下initcall 段:

單片機模擬Linux自動初始化流程!單片機模擬Linux自動初始化流程!單片機模擬Linux自動初始化流程!單片機模擬Linux自動初始化流程!

這樣只要在需要自動初始化函數加上類似于dev_init(),app_init() 就可以了,就會自動調用到,而不需要main 函數中一個一個的順序執行。

比如i2c控制的初始化放到dev_init 中,下面掛了很多i2c的從設備,只要分別給個從設備用app_init 初始化就行,即使來了一個新的,也用這app_init初始化就行,也不需要更改原來的,高度的分離模塊間的耦合度。

這樣模擬Linux kenerl 初始化驗證成功,最后上庫。

相關閱讀

主站蜘蛛池模板: 看黄免费网站 | 在线日本看片免费人成视久网 | 国产成人免费高清在线观看 | 成 人 a v黄 色 | 男女视频在线免费观看 | 综合久久一区二区三区 | 欧美成人影院在线观看三级 | 免费国产一区二区三区 | 午夜丝袜美腿福利视频在线看 | 免费一级在线 | 日韩精品免费看 | 九九精品久久久久久噜噜 | 国产成人香蕉在线视频网站 | 影院成人区精品一区二区婷婷丽春院影视 | 日韩18在线观看地址 | 国产高清在线看 | 国产一区二区三区精品视频 | 国产一区二区在线视频播放 | 手机看片国产日韩 | 亚洲性影院 | 久久久久久一级毛片免费无遮挡 | 亚洲情a成黄在线观看动 | 成人全黄三级视频在线观看 | 欧美一级高清在线观看 | 粉嫩jk制服美女啪啪 | 日本一级毛片中文字幕 | 精品欧美一区二区三区在线 | 青青热久久国产久精品秒播 | 国产手机免费视频 | 国产乱理片在线观看夜 | 亚洲精品一区二区三区五区 | 国产成人十八黄网片 | 真实偷清晰对白在线视频 | 亚洲国产影院 | 亚洲伦 | 免费的特黄特色大片在线观看 | 美女黄色在线 | 国产成人精品三级在线 | 久久久9999久久精品小说 | 中文字幕天堂最新版在线网 | 精品久久久久久久 |