色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

在STM32上實現驅動注冊initcall機制

STM32嵌入式開發 ? 來源:STM32嵌入式開發 ? 2023-07-02 10:26 ? 次閱讀

一、前言

每個硬件如LED控制,GPIO口需要初始化,初始化函數bsp_led_init();這個函數需要在主函數中調用初始化,類似這樣:

void bsp_init(void)
{
    bsp_rcc_init();
    bsp_tick_init();
    bsp_led_init();
    bsp_usart_init();
}

這樣存在的問題是:

當有很對驅動,加入100個硬件驅動,我們只用到了了50個,剩下的源文件不參與編譯,此時如果忘記將主函數中的相應初始化刪除,就會報錯。這樣操作很麻煩,不能很好的實現單個驅動文件的隔離。 那么現在就提供解決此問題的方式。這個方式源自于Linux內核--initcall機制。具體講解網絡上很多,在此不在詳細說明。 可閱讀:

二、代碼

頭文件:

#ifndef _COLA_INIT_H_
#define _COLA_INIT_H_
 
 
#define  __used  __attribute__((__used__))
 
typedef void (*initcall_t)(void);
 
#define __define_initcall(fn, id) 
    static const initcall_t __initcall_##fn##id __used 
    __attribute__((__section__("initcall" #id "init"))) = fn; 
 
#define pure_initcall(fn)       __define_initcall(fn, 0) //可用作系統時鐘初始化  
#define fs_initcall(fn)         __define_initcall(fn, 1) //tick和調試接口初始化
#define device_initcall(fn)     __define_initcall(fn, 2) //驅動初始化
#define late_initcall(fn)       __define_initcall(fn, 3) //其他初始化
    
 
void do_init_call(void);
    
#endif 

源文件:

#include "cola_init.h"
 
 
 
void do_init_call(void)
{
    extern initcall_t initcall0init$$Base[];
    extern initcall_t initcall0init$$Limit[];
    extern initcall_t initcall1init$$Base[];
    extern initcall_t initcall1init$$Limit[];
    extern initcall_t initcall2init$$Base[];
    extern initcall_t initcall2init$$Limit[];
    extern initcall_t initcall3init$$Base[];
    extern initcall_t initcall3init$$Limit[];
    
    initcall_t *fn;
    
    for (fn = initcall0init$$Base;
            fn < initcall0init$$Limit;
            fn++)
    {
        if(fn)
            (*fn)();
    }
    
    for (fn = initcall1init$$Base;
            fn < initcall1init$$Limit;
            fn++)
    {
        if(fn)
            (*fn)();
    }
    
    for (fn = initcall2init$$Base;
            fn < initcall2init$$Limit;
            fn++)
    {
        if(fn)
            (*fn)();
    }
    
    for (fn = initcall3init$$Base;
            fn < initcall3init$$Limit;
            fn++)
    {
        if(fn)
            (*fn)();
    }
       
}

在主進程中調用void do_init_call(void)進行驅動初始化,驅動注冊初始化時調用:

 pure_initcall(fn)        //可用作系統時鐘初始化  
 fs_initcall(fn)          //tick和調試接口初始化
 device_initcall(fn)      //驅動初始化
 late_initcall(fn)

舉個例子:

static void led_register(void)
{
    led_gpio_init();
    led_dev.dops = &ops;
    led_dev.name = "led";
    cola_device_register(&led_dev);
}
 
device_initcall(led_register);

這樣頭文件中就沒有有對外的接口函數了。

三、代碼

gitee:

https://gitee.com/schuck/cola_os

girhub:

https://github.com/sckuck-bit/cola_os

審核編輯:湯梓紅

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

    關注

    242

    文章

    23311

    瀏覽量

    661633
  • STM32
    +關注

    關注

    2270

    文章

    10910

    瀏覽量

    356602
  • 函數
    +關注

    關注

    3

    文章

    4338

    瀏覽量

    62751
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68750
  • GPIO
    +關注

    關注

    16

    文章

    1212

    瀏覽量

    52182

原文標題:在STM32上實現驅動注冊initcall機制

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式linux 串口console注冊

    是__con_initcall_start,該段中的所有函數driver\tty\tty_io.c\console_init函數中調用,console_initstart_kernel函數中被調用. console的
    發表于 03-05 13:53

    Linux的platform機制開發驅動流程是怎么樣的?

    從Linux 2.6起引入了一套新的驅動管理和注冊機制:platform_device和platform_driver。Linux中大部分的設備驅動,都可以使用這套機制,設備用plat
    發表于 09-23 07:31

    Delphi教程之軟件注冊機制的建立

    Delphi教程之軟件注冊機制的建立,很好的Delphi資料,快來下載吧。
    發表于 04-11 16:09 ?5次下載

    C#教程之注冊注冊機制

    C#教程之注冊注冊機制,很好的C#資料,快來學習吧。
    發表于 04-21 09:52 ?17次下載

    基于STM32單片機低功耗模式機制詳細解析

    本文主要解讀STM32低功耗模式的機制,并不側重STM32低功耗的程序實現,而且借助STM32固件庫實現
    發表于 10-24 16:16 ?1.9w次閱讀
    基于<b class='flag-5'>STM32</b>單片機低功耗模式<b class='flag-5'>機制</b>詳細解析

    Linux內核驅動的platform機制是怎樣的

    從Linux 2.6起引入了一套新的驅動管理和注冊機制:platform_device和platform_driver。
    發表于 11-06 14:12 ?1641次閱讀
    Linux內核<b class='flag-5'>驅動</b>的platform<b class='flag-5'>機制</b>是怎樣的

    STM32H743芯片實現CAN通信的步驟

    本篇筆記主要介紹,STM32H743芯片實現CAN通信,封裝為BSP驅動,為之后實現CAN的
    的頭像 發表于 09-14 14:33 ?1.6w次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>STM32</b>H743芯片<b class='flag-5'>上</b><b class='flag-5'>實現</b>CAN通信的步驟

    基于 RT-Thread STM32 實現 USB 虛擬串口

    之前由于工作需要,基于 RT-Thread STM32 實現了 USB 虛擬串口。為了方便大家,我在這里把正點原子 F429 阿波羅
    發表于 02-10 10:01 ?4次下載
    基于 RT-Thread <b class='flag-5'>在</b> <b class='flag-5'>STM32</b> <b class='flag-5'>上</b><b class='flag-5'>實現</b> USB 虛擬串口

    stm32_FSMC機制

    stm32_FSMC機制,介紹FSMC機制入門
    發表于 02-21 15:16 ?18次下載

    AN4099_STM32F0和STM32F3系列MCU實現紅外遙控收發控制協議

    AN4099_STM32F0和STM32F3系列MCU實現紅外遙控收發控制協議
    發表于 11-21 17:06 ?0次下載
    AN4099_<b class='flag-5'>在</b><b class='flag-5'>STM32</b>F0和<b class='flag-5'>STM32</b>F3系列MCU<b class='flag-5'>上</b><b class='flag-5'>實現</b>紅外遙控收發控制協議

    嵌入式函數回調注冊機制實現

    嵌入式函數回調注冊機制是一種常用的解耦技術,它通過應用程序中注冊回調函數的方式來實現模塊之間的通信,從而使系統更加靈活、可擴展和易于維護。函數回調
    的頭像 發表于 04-13 15:52 ?1421次閱讀

    什么是函數回調注冊機制實現的大致步驟介紹

    嵌入式函數回調注冊機制是一種常用的解耦技術,它通過應用程序中注冊回調函數的方式來實現模塊之間的通信
    的頭像 發表于 05-20 16:43 ?4429次閱讀

    initcall實現原理和調試方法介紹

    linux kernel啟動過程中,通過initcall機制調用初始化函數。initcall作為kernel經典設計機制之一延續至今。
    的頭像 發表于 06-05 11:38 ?1398次閱讀
    <b class='flag-5'>initcall</b><b class='flag-5'>實現</b>原理和調試方法介紹

    如何解決引入注冊機制問題

    耦合狀態,失去了一個.c 一個 .h的意義。 如何解決這種問題 ????引入注冊機制。為了方便說明注冊機制,舉一個例子:手機使用相機這個功能時,有一個操作:將拍攝的照片發送出去。以程序來實現
    的頭像 發表于 08-16 09:17 ?690次閱讀

    基于表驅動的健康監控機制實現方法

    電子發燒友網站提供《基于表驅動的健康監控機制實現方法.pdf》資料免費下載
    發表于 11-06 10:09 ?0次下載
    基于表<b class='flag-5'>驅動</b>的健康監控<b class='flag-5'>機制</b><b class='flag-5'>實現</b>方法
    主站蜘蛛池模板: 亚洲视频在线观看视频| 免费小视频在线观看| 亚洲成年人在线观看| 奶水太多h室友| 精品久久久久久无码人妻国产馆| yellow在线中文| 一线高清视频在线播放| 无敌在线视频观看免费| 欧美jizz19性欧美| 久久久久999| 国产精品久久久久a影院| 99re久久免费热在线视频手机| 亚洲免费视频在线观看| 色小妹影院| 秋霞在线看片无码免费| 麻豆国产99在线中文| 黄色亚洲片| 国产午夜在线观看视频 | 中文字幕国产在线观看| 小p孩玩成年女性啪啪资源| 日韩精品无码视频一区二区蜜桃| 免费 高清 中文在线观看| 精品国产自在现线拍国语| 国产在线播放91| 国产精品18久久久久久欧美网址| YY6080A旧里番在线观看| 99久久国产综合精品网成人影院| 又硬又粗又大一区二区三区视频| 亚洲精品国产拍在线观看| 乌克兰粉嫩摘花第一次| 手机观看毛片| 色欲AV无码乱码精品国产| 日本69xx 老师| 日本护士在线观看| 日本无码欧美激情在线视频| 欧美男男网站免费观看videos| 蜜桃视频一区二区| 免费无码国产欧美久久18| 免费欧美大片| 欧美z000z猪| 青草伊人久久|