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

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

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

3天內不再提示

STM32 模擬Linux kernel自動初始化流程

科技綠洲 ? 來源:嵌入式Linux ? 作者:嵌入式Linux ? 2023-06-22 10:03 ? 次閱讀

Linux中有很多編程思想可以學習,很多大佬把這些思想、機制運用到單片機的編程上。

比如:嵌入式大雜燴周記 | 第 4 期中介紹的cola_os、大家熟知的RT-Thread

還有屋脊雀的代碼:

圖片

圖片

本次給大家轉來一篇:STM32 模擬Linux kernel自動初始化流程,這個機制嵌入式大雜燴周記 | 第 4 期中也有用到。文末閱讀原文可直達原文入口。下轉原文:


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

圖片

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

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

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

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

1,程序代碼的組織

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

3,函數指針的應用。

圖片

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

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

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

圖片

先加段代碼:

圖片

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

圖片

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

如圖片:

圖片

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

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

圖片

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

圖片

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

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

圖片

圖片

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

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

這個也一樣。

圖片

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

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的順序執行了。

最后在來看一下initcall 段:

圖片

圖片

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

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

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

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

    關注

    87

    文章

    11479

    瀏覽量

    213053
  • STM32
    +關注

    關注

    2291

    文章

    11019

    瀏覽量

    363014
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70366
  • 初始化
    +關注

    關注

    0

    文章

    50

    瀏覽量

    12074
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    RT-Thread自動初始化詳解

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

    自動初始化機制原理詳解

    自動初始化機制是指初始化函數不需要被顯式調用,只需要在函數定義處通過宏定義的方式進行申明,就會在系統啟動過程中被執行。這篇文章就來探索一下其中的奧秘, 簡單理解其原理!
    的頭像 發表于 12-16 09:33 ?1353次閱讀
    <b class='flag-5'>自動</b><b class='flag-5'>初始化</b>機制原理詳解

    STM32芯片的USART軟件初始化流程包括哪些

    STM32芯片的USART支持使用DMA嗎?STM32芯片的USART軟件初始化流程包括哪些?
    發表于 12-08 07:56

    一文解析Linux系統保留內存的初始化流程

    1、Linux系統保留內存的初始化流程在啟動過程中會打印出如下信息,這些信息為linux呈現出系統下的保留內存空間。本文只介紹基本的保留內存,不涉及 CMA 部分內容保留內存的
    發表于 06-30 16:27

    基于PMON的龍芯BIOS初始化及VGA BIOS模擬

    闡述基于PMON擴展后的龍芯基本輸入輸出系統(BIOS)的初始化流程以及ATI顯卡BIOS的模擬器原理,針對自檢過程中PCI設備的初始化、視頻圖形陣列(VGA) BIOS
    發表于 04-03 08:42 ?42次下載

    LINUX系統引導和初始化-LINUX內核解讀

    Linux 的系統引導和初始化 ----------Linux2.4.22內核解讀之一 一、 系統引導和初始化概述 相關代碼(引導扇區的程序及其輔助程序,以 x86體系為例): \
    發表于 11-03 22:31 ?53次下載

    Linux內存初始化

    之前有幾篇博客詳細介紹了Xen的內存初始化,確實感覺這部分內容蠻復雜的。這兩天在看Linux內核啟動中內存的初始化,也是看的云里霧里的,想嘗試下邊看邊寫,在寫博客的過程中慢慢思考,最后也能把自己
    發表于 10-12 11:16 ?0次下載

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

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

    stm32初始化流程圖解析

    STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應用專門設計的ARM Cortex-M3內核。本文主要以stm32初始化流程而展開的討論。
    發表于 11-16 11:39 ?2w次閱讀
    <b class='flag-5'>stm32</b><b class='flag-5'>初始化</b><b class='flag-5'>流程</b>圖解析

    uboot中進行LCD初始化流程免費下載

    本文檔的主要內容詳細介紹的是uboot中進行LCD初始化流程免費下載。
    發表于 08-12 08:00 ?11次下載
    uboot中進行LCD<b class='flag-5'>初始化</b>的<b class='flag-5'>流程</b>免費下載

    eMMC初始化命令發送流程

    eMMC初始化命令發送流程通過stm32單片機驅動eMMC芯片,在完成項目的過程中,命令發送和響應很令人頭疼,所以整理出一篇文檔供各位開發者參考。初始化命令發送
    發表于 12-05 19:21 ?18次下載
    eMMC<b class='flag-5'>初始化</b>命令發送<b class='flag-5'>流程</b>

    RT-Thread全球技術大會:如何使用組件以及自動初始化流程

    RT-Thread全球技術大會:如何使用組件和自動初始化流程 ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 15:16 ?1191次閱讀
    RT-Thread全球技術大會:如何使用組件以及<b class='flag-5'>自動</b><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 ?3176次閱讀
    RT-Thread<b class='flag-5'>自動</b><b class='flag-5'>初始化</b>機制

    使用STM32CubeMX生成初始化代碼

    我使用STM32CubeMX生成初始化代碼,使用LL庫,這里只介紹跟i2c相關的部分,其他必要的初始化需要自己完成。芯片使用stm32f042。本文的代碼不能到手即用,只提供思路。
    的頭像 發表于 03-22 15:26 ?3742次閱讀

    Linux內存方面的初始化和常見的內存分配方式

    在 start_kernel 內核初始化函數中,一共調用 86 個函數去初始化,其中有一個 mm_init 函數,用以初始化內存。 start_ke
    的頭像 發表于 09-28 16:13 ?1075次閱讀
    <b class='flag-5'>Linux</b>內存方面的<b class='flag-5'>初始化</b>和常見的內存分配方式
    主站蜘蛛池模板: 中国一级毛片aaa片 中国一级特黄aa毛片大片 | 午夜看片网| 亚洲1区2区3区4区 | 一级视频在线 | 亚洲午夜日韩高清一区 | 一级片免费看 | 夜夜偷影视| 欧美不卡在线视频 | 人人艹在线观看 | 午夜影院h | 免费又黄又爽的禁片视频 | 欧美爽爽| 天天干天天上 | 午夜视频在线观看国产 | 色域综合 | 美女黄色一级片 | 成人夜色香网站在线观看 | 手机看片福利日韩 | 亚洲综合色婷婷在线观看 | 欧美性久久久久 | 日本一卡精品视频免费 | 亚洲第八页| 正在播放国产女免费 | 午夜免费福利视频 | 激情五月婷婷网 | 九九re热 | 欧美行爱| 手机看片1024手机在线观看 | 很黄很黄叫声床戏免费视频 | 天天综合天天做天天综合 | a级黑粗大硬长爽猛视频毛片 | 伊人久久大线蕉香港三级 | 色五阁| 手机看片久久青草福利盒子 | 黄色网址视频在线播放 | 欧美精品成人久久网站 | 婷婷综合久久中文字幕蜜桃三 | 一本大道香蕉大vr在线吗视频 | 亚洲精品美女久久久久网站 | 香蕉黄色网| 广东毛片 |