哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

一個(gè)用C++ 開(kāi)發(fā)的可用于管理插件的開(kāi)源架構(gòu) Pluma

工程師鄧生 ? 來(lái)源:OSCHINA 社區(qū) ? 作者:悠然紅茶 ? 2022-09-16 11:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 概述

Pluma 是一個(gè)用 C++ 開(kāi)發(fā)的可用于管理插件的開(kāi)源架構(gòu)。該架構(gòu)是個(gè)輕量級(jí)架構(gòu),非常易于理解。

Pluma 架構(gòu)有以下基本概念:

1)插件的外在行為體現(xiàn)為一個(gè)純虛類,可以叫作插件接口;

2)繼承于同一個(gè)插件接口的若干派生類,被認(rèn)為屬于同一種插件,可以叫作插件類;

3)每一個(gè)插件接口或插件類都有個(gè)一一對(duì)應(yīng)的 Provider 類,其中,插件接口對(duì)應(yīng)的 Provider 類里會(huì)定義一個(gè)特殊字符串常量:PLUMA_PROVIDER_TYPE,表示這一類 “插件 Provider” 共同的類型名稱,而這個(gè)類型名稱其實(shí)就是插件接口的類名字符串。

4)多個(gè)插件類可以被放入一個(gè)插件動(dòng)態(tài)庫(kù)中,而這個(gè)動(dòng)態(tài)庫(kù)文件名(不包括后綴部分)可以叫作 “插件名”。

5)插件機(jī)制使用者可以在自己的架構(gòu)中包含一個(gè) Pluma 管理類,該類支持從所指定的位置加載一個(gè)或多個(gè)插件動(dòng)態(tài)庫(kù),并將每個(gè)插件類對(duì)應(yīng)的 Provider,記錄進(jìn)內(nèi)部的表中。

6)插件機(jī)制使用者可以在合適時(shí)機(jī),利用 Pluma 獲取內(nèi)含的插件 Provider,并調(diào)用某個(gè)插件 Provider 的 create () 函數(shù),創(chuàng)建出對(duì)應(yīng)的插件對(duì)象。

7)使用完插件對(duì)象后,不要忘了 delete 它。

現(xiàn)在我們畫一張示意圖:


d2a127d2-3432-11ed-ba43-dac502259ad0.png

2. Pluma 管理類

我們剛剛也說(shuō)了,插件機(jī)制使用者可以包含一個(gè) Pluma 管理類。

該類繼承于 PluginManager 類。

【pluma-1.1/include/pluma/PluginManager.hpp】


poYBAGMj66-AKxy3AAGt4DC0U_8150.jpg 從上面的 load () 函數(shù)和 loadFromFolder () 函數(shù)可以看出,插件管理器既允許用戶單獨(dú)加載某個(gè)插件動(dòng)態(tài)庫(kù),也允許批量性加載某個(gè)目錄下所有的插件動(dòng)態(tài)庫(kù)。另外,值得注意的是,getProviders () 函數(shù)是 protected 的成員,也就是說(shuō),這套架構(gòu)是不希望用戶直接使用這個(gè) PluginManager 類的,即便用了,你也拿不到 Provider。正確的做法是,使用 PluginManager 的子類:Pluma 管理類。 ?? 另外,上面的成員變量 libraries,就是記錄所有已加載的插件動(dòng)態(tài)庫(kù)的映射表。而成員變量 host 則負(fù)責(zé)記錄每個(gè)插件類對(duì)應(yīng)的 Provider 信息。之所以被稱為 host(宿主),是針對(duì)插件而言的。也就是說(shuō)插件本身實(shí)際上是沒(méi)資格知道其真實(shí)宿主的全貌的,它只能訪問(wèn)和它相關(guān)的很小一部分?jǐn)?shù)據(jù)而已,因此 Pluma 將這一小部分?jǐn)?shù)據(jù)整理成一個(gè) host 代理,供插件使用。?? ? Pluma 管理類的代碼截選如下: 【pluma-1.1/include/pluma/Pluma.hpp】

pYYBAGMj69KAN3DEAABukF5mWyc123.jpg

請(qǐng)大家注意上面代碼中最后一行,這個(gè) Pluma.hpp 還真是有點(diǎn)手黑,偷偷摸摸 #include 了個(gè) Pluma.inl 文件,其實(shí)展開(kāi)來(lái)就是 acceptProviderType () 和 getProviders () 這兩個(gè)模板函數(shù)的實(shí)現(xiàn)。Pluma.inl 文件的內(nèi)容如下: 【pluma-1.1/include/pluma/Pluma.inl】

poYBAGMj6--AMVfqAAEv_7Rt3N4028.jpg

看到了吧,重新定義了個(gè) getProviders (),還搞成一個(gè)模板函數(shù),在函數(shù)體內(nèi)會(huì)反過(guò)來(lái)通過(guò)模板參數(shù),進(jìn)一步得到所涉及的插件 Provider 的 PLUMA_PROVIDER_TYPE 信息,這個(gè)技巧挺重要。也就是說(shuō),外界傳來(lái)的是 vector,而函數(shù)內(nèi)部可以推斷出 ProviderType::PLUMA_PROVIDER_TYPE。將 PLUMA_PROVIDER_TYPE 傳入父類的 PluginManager::getProviders () 函數(shù),就可以拿到符合所指類型的所有 Provider。 我們畫一張 Pluma 簡(jiǎn)圖,后面再細(xì)說(shuō)相關(guān)細(xì)節(jié): d2bc2a14-3432-11ed-ba43-dac502259ad0.png 同一類插件類,會(huì)對(duì)應(yīng)一個(gè) ProviderInfo 節(jié)點(diǎn),該節(jié)點(diǎn)內(nèi)部的 providers 列表,記錄著同屬一類的若干 Provider。

2.1 Host 代理 【pluma-1.1/include/pluma/Host.hpp】

pYYBAGMj7B2AScFnAAFEhApOE-c560.jpgpYYBAGMj7CSAASNtAABxdymdDgU500.jpg

正如前文所說(shuō),Host 代理是針對(duì)插件而言的。而 Host 只有一個(gè) public 成員函數(shù) add (),說(shuō)明其主要對(duì)外行為就是讓插件將對(duì)應(yīng)的 provider 注冊(cè)進(jìn) Host。

3. 插件類和其對(duì)應(yīng)的 Provider 類

在說(shuō)了一大堆插件管理類代碼后,現(xiàn)在終于要開(kāi)始說(shuō)插件部分了。前文已經(jīng)說(shuō)過(guò),插件的外在行為體現(xiàn)為一個(gè)純虛類,可以叫作插件接口。我們現(xiàn)在就以 Pluma 源碼中給出的例子為準(zhǔn),來(lái)說(shuō)明一些細(xì)節(jié)。

3.1 Warrior 接口和 WarriorProvider 類

Pluma 中的插件接口例子是 Warrior,其源碼截選如下: 【pluma-1.1/example/src/interface/Warrior.hpp】


pYYBAGMj7D-AJVCHAABCyGY1gt4715.jpg 這個(gè)接口里只象征性的寫了一個(gè)成員函數(shù) getDescription (),大家明白意思即可。 ?? ? 需要注意的是類定義之后的那句 PLUMA_PROVIDER_HEADER,這個(gè)宏負(fù)責(zé)定義和插件接口對(duì)應(yīng)的 Provider 類。相關(guān)的宏定義如下: 【pluma-1.1/include/pluma/Pluma.hpp】

pYYBAGMj7FWAEQF4AAEHMJvauLA297.jpg

基于這些宏定義,我們可以將 PLUMA_PROVIDER_HEADER (Warrior) 展開(kāi)為:

poYBAGMj7HOAK2VDAAC7dO0qpzE457.jpg

代碼很清晰,為 Warrior 接口聲明一個(gè)配套的 WarriorProvider 類。這個(gè)類里包含著重要的 PLUMA_PROVIDER_TYPE 常量,以及最關(guān)鍵的 create () 函數(shù)。 Warrior 的實(shí)現(xiàn)文件更加簡(jiǎn)單: 【pluma-1.1/example/src/interface/Warrior.cpp】

poYBAGMj7IiATyndAAAdbDAFUyo300.jpg

也在使用宏,展開(kāi)宏后可見(jiàn):

poYBAGMj7JuAfQEfAABlUGbcW7E941.jpg

因?yàn)?Warrior 本身是個(gè)純虛類,所以 WarriorProvider 里也不用實(shí)現(xiàn) create () 函數(shù)。

3.2 Warrior 派生類和派生 Provider

在 pluma 源碼的例子中,提供了三個(gè) Warrior 派生類,SimpleWarrior、Eagle 和 Jaguar。默認(rèn)的是 SimpleWarrior,它被集成進(jìn) example/src/host 目錄。也就是說(shuō),即便我們一個(gè)額外的插件庫(kù)都不提供,示例至少還可以使用 SimpleWarrior。而 Eagle 和 Jaguar 則位于 example/src/plugin 目錄,可以打包進(jìn)一個(gè)插件動(dòng)態(tài)庫(kù)。 【pluma-1.1/example/src/host/SimpleWarrior.hpp】

poYBAGMj7LSARMTfAABc8jwniCk595.jpg

前文我們已經(jīng)看到,對(duì)于插件接口(Warrior)來(lái)說(shuō),用到的宏是PLUMA_PROVIDER_HEADER(Warrior),現(xiàn)在針對(duì)實(shí)際插件類(SimpleWarrior),會(huì)用到另一個(gè)宏P(guān)LUMA_INHERIT_PROVIDER(SimpleWarrior, Warrior)。這個(gè)宏的定義如下: 【pluma-1.1/include/pluma/Pluma.hpp】

pYYBAGMj7MyAbcGLAABcjVqQTZo262.jpg

展開(kāi)后可見(jiàn):

poYBAGMj7N-Aa6YVAAA8D8bxK8o324.jpg

很簡(jiǎn)單,就是在完成 Provider 的核心使命,提供一個(gè)創(chuàng)建插件類對(duì)象的 create () 函數(shù)。與 SimpleWarriorProvider 類似,另外兩個(gè) Warrior 派生類 Eagle 和 Jaguar 大體也是這么寫的。示意圖如下: d2e2adc4-3432-11ed-ba43-dac502259ad0.png 在研究 Pluma 所給示例時(shí),我已事先將 Pluma 封裝成靜態(tài)庫(kù)了,現(xiàn)在要把 Eagle 和 Jaguar 編譯并封裝成一個(gè)動(dòng)態(tài)庫(kù),就需要鏈接 Pluma 靜態(tài)庫(kù),除此之外,還需要編譯其他一些輔助文件,列舉如下: 1)Connector.cpp 2)dllmain.cpp 3)Eagle.hpp 4)Jaguar.hpp 5)Warrior.cpp 其中 Connector.cpp 文件,是插件動(dòng)態(tài)庫(kù)向外界 Host 注冊(cè)自己所有 Provider 的地方。它必須實(shí)現(xiàn)一個(gè) connect () 函數(shù),代碼截選如下:

poYBAGMj7P6AI6h3AABiredLvDQ088.jpg

我們先不要著急分析上面的 connect () 動(dòng)作,可以先跟著我看看插件的加載流程,后文我們就會(huì)知道,connect () 只是加載流程的一環(huán)而已。

4. 插件加載流程

我們看一下 Pluma 架構(gòu)所給例子的 main () 函數(shù),就可以了解插件的加載流程了:

pYYBAGMj7RiABMrSAAELwFnSM8M836.jpg

其中和加載插件相關(guān)的句子主要就是 pluma.acceptProviderType 和 pluma.load 兩句了。前者主要負(fù)責(zé)在 Host 的knownTypes映射表中添加一個(gè) ProviderInfo 節(jié)點(diǎn),后者負(fù)責(zé)加載插件動(dòng)態(tài)庫(kù),并將動(dòng)態(tài)庫(kù)里匹配的 Provider 指針記入 ProviderInfo 節(jié)點(diǎn)。

4.1 pluma.acceptProviderType<>()

我們先說(shuō) pluma.acceptProviderType 一句。在前文介紹 Pluma.inl 文件的內(nèi)容時(shí),我們已經(jīng)看到一個(gè)叫作 acceptProviderType 的模板函數(shù)了,當(dāng)時(shí)沒(méi)有細(xì)說(shuō),現(xiàn)在我把它的代碼再貼一下: 【pluma-1.1/include/pluma/Pluma.inl】

poYBAGMj7TiAck7tAABsH0sPDoI046.jpg

里面調(diào)用的是 PluginManager 基類的 registerType () 函數(shù)。 我們前文主要關(guān)心的是 PLUMA_PROVIDER_TYPE,現(xiàn)在再說(shuō)一下后兩個(gè)參數(shù)。PLUMA_INTERFACE_VERSION 表示管理器當(dāng)前應(yīng)該使用的插件接口的版本,因?yàn)槲覀儾荒艽_定更高版本的插件接口會(huì)不會(huì)增加或刪除成員函數(shù),所以這個(gè)值其實(shí)是個(gè)限定值,如果后續(xù)用戶嘗試加載更高版本的插件,那么是無(wú)法通過(guò)校驗(yàn)的。 第三個(gè)參數(shù) PLUMA_INTERFACE_LOWEST_VERSION 則是限定最低值,如果嘗試加載比這個(gè)值更低版本的插件,肯定也是不會(huì)通過(guò)的。 在剛剛看到的 main () 函數(shù)里,是這樣寫的:

pluma.acceptProviderType();

也就是說(shuō),Pluma 插件管理器對(duì) Warrior 接口對(duì)應(yīng)的 WarriorProvider 類感興趣。而當(dāng)初定義 Warrior 時(shí),在 Warrior.cpp 文件里的確指明了 WarriorProvider 能限定的當(dāng)前版本號(hào)和最低版本號(hào):

PLUMA_PROVIDER_SOURCE(Warrior, 1, 1);

這些類型信息、版本號(hào)限定信息都會(huì)被注冊(cè)在 Host 的 knownTypes 映射表中,每種接口類型對(duì)應(yīng)一個(gè) ProviderInfo 節(jié)點(diǎn)。注冊(cè)動(dòng)作的代碼如下:

【pluma-1.1/src/pluma/PluginManager.cpp】

pYYBAGMj7WyAEUAbAABNgvDLs0g044.jpg

【pluma-1.1/src/pluma/Host.cpp】

pYYBAGMj7YKAdyMMAABiYEWlb3o152.jpg

當(dāng)然,新加的 ProviderInfo 節(jié)點(diǎn)的 providers 列表是個(gè)空列表,待后續(xù)再添加 Provider * 內(nèi)容。

4.2 pluma.load()

接著,我們繼續(xù)看 main () 函數(shù)里調(diào)用的 pluma.load (),其實(shí)調(diào)用的是其父類 PluginManager 的 load ()。相關(guān)代碼截選如下:

【pluma-1.1/src/pluma/PluginManager.cpp】

poYBAGMj7ZiANhKSAADTuumCVjE057.jpg

可以看到,一開(kāi)始就在著手加載動(dòng)態(tài)庫(kù),并調(diào)用動(dòng)態(tài)庫(kù)里的 connect () 函數(shù)。前文我們實(shí)際上已經(jīng)列舉過(guò)示例代碼里的 connect () 函數(shù)了,現(xiàn)在再貼一次:

poYBAGMj7a-ALQ-rAABA98TDc7Y693.jpg

前文在闡述到 connect () 時(shí),暫時(shí)沒(méi)有細(xì)說(shuō) add () 動(dòng)作,現(xiàn)在我們來(lái)看看它的代碼:

【pluma-1.1/src/pluma/Host.cpp】

poYBAGMj7cSAWJqUAACPOR6pUWQ601.jpg

上面代碼中那個(gè) plumaGetType () 函數(shù)其實(shí)是 Provider 的私有成員,一般人訪問(wèn)不了,但 Host 是它的友元類,所以可以訪問(wèn)。代碼中會(huì)先校驗(yàn)待添加的 Provider 是否合格,如果合格則以 plumaGetType () 返回值為 key 值,并向臨時(shí)映射表 addRequests 中添加該 Provider 指針。所謂合格是指,這個(gè) Provider 的類型是 Host 感興趣的,并且其版本號(hào)也是合適的。

值得注意的是,待添加的 Provider*,只是臨時(shí)先放進(jìn)一個(gè) addRequests 映射表中。addRequests 映射表的定義如下:

【pluma-1.1/include/pluma/Host.hpp】

poYBAGMj7d6AEQzAAAAviHyQa3M128.jpg

那么這個(gè)臨時(shí)性的 addRequests 映射表的內(nèi)容會(huì)怎樣處理呢?說(shuō)起來(lái)也簡(jiǎn)單,會(huì)被 “搬移” 進(jìn) Host 的 knownTypes 映射表中某個(gè) ProviderInfo 的內(nèi)部列表去。main () 在調(diào)用完 connect () 函數(shù)后,調(diào)用的 confirmAddictions () 就是做這個(gè)事情的:

【pluma-1.1/src/pluma/Host.cpp】

poYBAGMj7fiAGhc6AAC7cpn6_Q8730.jpg

我們畫一張調(diào)用關(guān)系圖看看:


d302c168-3432-11ed-ba43-dac502259ad0.png ??

我們可以通過(guò)這張調(diào)用關(guān)系圖回顧一下,主要流程就是在加載插件動(dòng)態(tài)庫(kù),并執(zhí)行動(dòng)態(tài)庫(kù)里的 connect () 函數(shù)。該函數(shù)會(huì)將動(dòng)態(tài)庫(kù)里可用的所有 Provider * 記入 Host 的 knownTypes 映射表中。

同時(shí),動(dòng)態(tài)庫(kù)對(duì)應(yīng)的 DLibrary 對(duì)象,也會(huì)插入 Pluma 管理類內(nèi)部的 libraries 映射表中。

為了鞏固知識(shí),我們把前文的兩張圖再整合一下。


d348a0ca-3432-11ed-ba43-dac502259ad0.png

5. 使用插件 Provider

5.1 pluma.getProviders()

在 Providers 都添加進(jìn) Pluma 管理類后,我們就可以在需要時(shí)獲取 provider 了,為此 Pluma 類提供了 getProviders () 函數(shù):

【pluma-1.1/src/pluma/PluginManager.cpp】

poYBAGMj7iOAJtYcAAA8tMoiTbU450.jpg

【pluma-1.1/src/pluma/Host.cpp】

pYYBAGMj7jaAPO0HAABhoNso11Q109.jpg

代碼很簡(jiǎn)單,就是幫使用者把感興趣的某類插件 Provider 全部找出來(lái)。如果當(dāng)初我們已經(jīng)通過(guò) acceptProviderType () 注冊(cè)了對(duì)應(yīng)的類型(PLUMA_PROVIDER_TYPE),那么至少可以拿到一個(gè) list,否則就只能拿到 NULL 了。如果我們可以拿到若干 Provider,就可以調(diào)用其 create () 函數(shù)創(chuàng)建對(duì)應(yīng)的插件對(duì)象了。

當(dāng)工作做完后,用戶應(yīng)該及時(shí) delete 掉之前創(chuàng)建出的插件對(duì)象。在程序退出之前,用戶應(yīng)該調(diào)用 pluma.unloadAll () 刪除所有插件 Provider 及 DLibrary 對(duì)象。DLibrary 對(duì)象析構(gòu)時(shí),會(huì)自動(dòng)關(guān)閉已經(jīng)打開(kāi)的動(dòng)態(tài)鏈接庫(kù)。

【pluma-1.1/src/pluma/PluginManager.cpp】

pYYBAGMj7lGALRXEAAEA--e0ITw849.jpg

6. 結(jié)束

至此,Pluma 架構(gòu)的主體代碼就分析完畢了,希望對(duì)大家有所幫助。

?


審核編輯:劉清

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

    關(guān)注

    0

    文章

    265

    瀏覽量

    19555
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    596

    瀏覽量

    23212
  • 開(kāi)源架構(gòu)
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    7054

原文標(biāo)題:聊聊Pluma插件管理框架

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C++ 11 14 17 20內(nèi)存管理-指針、智能指針和內(nèi)存池基礎(chǔ)與提升

    大模型在云端吞吐著海量數(shù)據(jù),當(dāng)自動(dòng)駕駛汽車在毫秒間做出生死決策,我們不得不重新審視支撐這切數(shù)字大廈的基石——C++內(nèi)存管理。盡管高級(jí)語(yǔ)言層出不窮,但在對(duì)性能、延遲和資源控制有著極致要求的底層核心領(lǐng)域,
    的頭像 發(fā)表于 04-20 15:51 ?518次閱讀

    C++與lua聯(lián)合編程

    手工業(yè)”。然而,這兩種內(nèi)存管理機(jī)制截然不同的語(yǔ)言,如何在個(gè)進(jìn)程內(nèi)進(jìn)行高效的數(shù)據(jù)交換,直是企業(yè)級(jí)開(kāi)發(fā)中的痛點(diǎn)。(看讠果aixuetang。
    發(fā)表于 04-19 16:27

    KubePi:開(kāi)源Kubernetes可視化管理面板,讓集群管理如此簡(jiǎn)單

    KubePi:開(kāi)源Kubernetes可視化管理面板,讓集群管理如此簡(jiǎn)單 在云原生時(shí)代,Kubernetes已成為容器編排的事實(shí)標(biāo)準(zhǔn),但其復(fù)雜性卻讓許多開(kāi)發(fā)者望而卻步。KubePi作
    發(fā)表于 02-11 12:53

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到個(gè)開(kāi)源的模擬IIC的庫(kù),封裝的比較好,但是是使用c++寫的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng)中 C
    發(fā)表于 01-26 08:58

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    創(chuàng)建源文件時(shí)什么都不給,默認(rèn)是.cpp。 3、返回值 C語(yǔ)言中,如果個(gè)函數(shù)沒(méi)有指定返回值類型,默認(rèn)返回int類型;C++中,如果
    發(fā)表于 12-24 07:23

    NVIDIA 收購(gòu)開(kāi)源工作負(fù)載管理提供商 SchedMD

    軟件的主要開(kāi)發(fā)商,Slurm 是用于 HPC 和 AI 的開(kāi)源工作負(fù)載管理系統(tǒng)。此次收購(gòu)旨在幫助強(qiáng)化
    的頭像 發(fā)表于 12-16 18:24 ?1475次閱讀

    CC++之間的聯(lián)系

    ,后來(lái)才逐漸演變?yōu)?b class='flag-5'>一種成熟的面向?qū)ο缶幊陶Z(yǔ)言。 總之,C語(yǔ)言和C++雖然有很多共同之處,但在編程范式、安全性、抽象層次等方面存在顯著差異。開(kāi)發(fā)者可以根據(jù)項(xiàng)目需求選擇合適的語(yǔ)言,
    發(fā)表于 12-11 06:51

    分享個(gè)嵌入式開(kāi)發(fā)學(xué)習(xí)路線

    如果你想要學(xué)習(xí)嵌入式開(kāi)發(fā),我建議按照這個(gè)學(xué)習(xí)路線準(zhǔn)備: 1. 基礎(chǔ)鋪墊期(1-2個(gè)月) 理解嵌入式系統(tǒng)的“硬件基礎(chǔ)”和“編程入門”,能看懂簡(jiǎn)單電路,寫出基礎(chǔ)C語(yǔ)言代碼。這階段的學(xué)習(xí)
    發(fā)表于 12-04 11:01

    C++程序異常的處理機(jī)制

    語(yǔ)法 C++異常處理涉及到3個(gè)關(guān)鍵字: throw---拋出個(gè)異常,帶參數(shù) try---用于標(biāo)識(shí)可能會(huì)出現(xiàn)異常的代碼段 catch--
    發(fā)表于 12-02 07:12

    深入剖析RabbitMQ高可用架構(gòu)設(shè)計(jì)

    在微服務(wù)架構(gòu)中,消息隊(duì)列故障導(dǎo)致的系統(tǒng)不可用率高達(dá)27%!如何構(gòu)建個(gè)真正可靠的消息中間件架構(gòu)?本文將深入剖析RabbitMQ高
    的頭像 發(fā)表于 08-18 11:19 ?1091次閱讀

    技能+1!如何在樹莓派上使用C++控制GPIO?

    和PiGPIO等庫(kù),C++可用于編程控制樹莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對(duì)速度和精度要求較高的硬件項(xiàng)目。在樹莓派社區(qū)中,關(guān)于“Python
    的頭像 發(fā)表于 08-06 15:33 ?4501次閱讀
    技能+1!如何在樹莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    火爆開(kāi)發(fā)中 | 開(kāi)源FPGA硬件板卡,硬件第期發(fā)布

    更好地滿足大家的需求,我們特此發(fā)起投票,邀請(qǐng)大家就 “開(kāi)源開(kāi)發(fā)板 PCIe 接口金手指好還是卡槽好” 發(fā)表自己的看法(歡迎大家積極投票并在評(píng)論區(qū)留言哦)。 金手指接口,直接集成在 PCB 板上,具有
    發(fā)表于 07-09 13:54

    使用英特爾? NPU 插件C++運(yùn)行應(yīng)用程序時(shí)出現(xiàn)錯(cuò)誤:“std::Runtime_error at memory location”怎么解決?

    使用OpenVINO?工具套件版本 2024.4.0 構(gòu)建C++應(yīng)用程序 使用英特爾? NPU 插件運(yùn)行了 C++ 應(yīng)用程序 遇到的錯(cuò)誤: Microsoft C++ excep
    發(fā)表于 06-25 08:01

    VSCode 編寫自己的 KiCad 插件(下)

    “ ?很多小伙伴都想自己開(kāi)發(fā) KiCad 插件,但不知從何入手。本文由華秋電子的另位 KiCad 開(kāi)發(fā)者波波同學(xué)撰寫,分享了如何快速搭建環(huán)境,并開(kāi)
    的頭像 發(fā)表于 06-19 11:44 ?3184次閱讀
    <b class='flag-5'>用</b> VSCode 編寫自己的 KiCad <b class='flag-5'>插件</b>(下)

    VSCode編寫自己的KiCad插件(上)詳細(xì)步驟教程

    “ ?很多小伙伴都想自己開(kāi)發(fā) KiCad 插件,但不知從何入手。本文由華秋電子的另位 KiCad 開(kāi)發(fā)者波波同學(xué)撰寫,分享了如何快速搭建環(huán)境,并開(kāi)
    的頭像 發(fā)表于 06-17 11:10 ?3412次閱讀
    <b class='flag-5'>用</b>VSCode編寫自己的KiCad<b class='flag-5'>插件</b>(上)詳細(xì)步驟教程
    乃东县| 聂拉木县| 乳山市| 宾川县| 浦北县| 冷水江市| 济阳县| 乌拉特后旗| 陆河县| 望奎县| 务川| 垫江县| 广饶县| 镇巴县| 安阳县| 杭锦旗| 上林县| 汤原县| 榆林市| 惠州市| 栾城县| 潢川县| 油尖旺区| 广饶县| 建水县| 牙克石市| 长沙县| 冕宁县| 大同县| 南漳县| 合作市| 兴隆县| 句容市| 渑池县| 阆中市| 延川县| 汾阳市| 望城县| 正宁县| 育儿| 土默特右旗|