一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

關(guān)于Ardupilot移植的經(jīng)驗分享

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:驚覺嵌入式 ? 作者:驚覺嵌入式 ? 2021-04-16 11:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Ardupilot移植經(jīng)驗分享(1)簡要介紹了移植Ardupilot的思路,重點講述了下載編譯源碼的要點和搭建源碼閱讀環(huán)境的方法。下載編譯源碼,一方面是為了搭建源碼閱讀環(huán)境,另一方面是當(dāng)閱讀源碼遇到疑問時,可以稍作修改后進(jìn)行調(diào)試驗證。搭建便捷高效的源碼閱讀環(huán)境,更是非常重要。若是選擇的源碼閱讀器不能進(jìn)行函數(shù)跳轉(zhuǎn),不能查看函數(shù)調(diào)用棧,不能快速導(dǎo)航到目標(biāo)函數(shù)或變量,閱讀70萬行ardupilot代碼的工作將寸步難行。這就是筆者花費很大的篇幅來講解的原因,沒看過第一篇的同學(xué)先點擊上面的鏈接噢。

下面開始閱讀源碼之旅。剛才提到,ardupilot工程有700k行代碼,這個統(tǒng)計出版官方開發(fā)者wiki。

雖然龐大的體量令人望而生畏,但若明確了目標(biāo),把握了脈絡(luò),閱讀也非難事。下面讓筆者按著當(dāng)初的思路,分享閱讀的步驟和要點,帶領(lǐng)大家體驗一次奇妙的閱讀之旅。

下面的內(nèi)容分為三個部分:

明確目標(biāo)

把握脈絡(luò)

深入細(xì)節(jié)

明確目標(biāo)

我們的最終目標(biāo)是通過底層適配的方法,移植ardupilot到自己的硬件平臺。不清楚底層適配的同學(xué),請看Ardupilot移植經(jīng)驗分享(1)的“移植Ardupilot的方法有兩種”部分。而閱讀源碼的目標(biāo),也就非常簡單,即要搞清楚如何進(jìn)行適配:

要適配哪些接口(或者說函數(shù))?

實現(xiàn)這些接口時,可參考哪些代碼?

會不會有難以實現(xiàn)的接口?

明確了這幾個問題,可以幫我們縮小閱讀的范圍。我們并不需要真去閱讀那700k行代碼,而是圍繞移植,這個中心目標(biāo),有目的有范圍地進(jìn)行閱讀。

前篇文章介紹ardupilot時,提到代碼分為5個部分,筆者帶領(lǐng)大家回憶下最重要的3個:

載具代碼:業(yè)務(wù)層的代碼,比如飛行器初始化,飛行模式控制。

共享庫:libraries中除以AP_HAL開頭的所有子目錄。包含傳感器驅(qū)動,姿態(tài)位置估算與控制。

硬件抽象層(HAL):libraries中以AP_HAL開頭子目錄,如AP_HAL, AP_HAL_PX4, AP_HAL_Linux。

明白了這三塊之間的相互關(guān)系,上述問題就迎刃而解。一圖以蔽之:

9b1da940-9e22-11eb-8b86-12bb97331649.png

UML圖示說明

本文多處使用UML圖來展示ardupilot的框架和流程,有些遵循標(biāo)準(zhǔn)語法,有些則是筆者自己習(xí)慣。無論如何,為方便大家理解,筆者會在第一次出現(xiàn)該種圖示時做必要說明。

上述是UML組件圖,非標(biāo)準(zhǔn)語法。

實線箭頭表示使用,比如Vehicle specific flight code使用Shared Libraries。

實線表示關(guān)聯(lián)。AP_HAL_PX4實現(xiàn)了AP_HAL接口,準(zhǔn)確說是繼承的關(guān)系。不過筆者在UML類圖中才見過繼承的語法,所以這里僅使用實線。

我們要實現(xiàn)的是AP_HAL接口,是上圖中的紅色圓圈。現(xiàn)有的實現(xiàn)有AP_HAL_PX4(對應(yīng)Pixhawk平臺),AP_HAL_Linux(對應(yīng)NAVIO)。我們要添加一個平臺,為圖中藍(lán)色部分,即AP_HAL_TI。

閱讀的重點也就確定了:

搞清楚AP_HAL的每一個接口,位于libraries/AP_HAL。

參考AP_HAL_PX4的實現(xiàn),位于libraires/AP_HAL_PX4。

9b29501a-9e22-11eb-8b86-12bb97331649.png

不過若想完成移植大業(yè),僅閱讀這兩塊內(nèi)容是不夠的。

AP_HAL接口被飛控業(yè)務(wù)代碼以及共享庫調(diào)用,有些接口確切的功能必須結(jié)合具體的使用場景才能搞清楚。并且,想讓飛行器飛起來,還是要跑業(yè)務(wù)代碼。在這過程中遇到異常時,若完全不了解業(yè)務(wù)代碼,那將很難定位問題。

AP_HAL_PX4依賴于底層平臺(PX4Firmware)所提供的功能。當(dāng)你想?yún)⒖糀P_HAL_PX4是如何實現(xiàn)某個接口的時候,你可能會發(fā)現(xiàn)它只是簡單地把任務(wù)交給了PX4Firmware。當(dāng)然,這只是少數(shù)情況。參考大部分的實現(xiàn)時,看AP_HAL_PX4本身的代碼就足夠了。

因此,除了重點閱讀AP_HAL和AP_HAL_PX4外,我們需要適當(dāng)?shù)南蛏虾拖蛳卵由?。尤其是向上,掌握飛控業(yè)務(wù)代碼的整體框架,在需要深入某個細(xì)節(jié)時,至少要知道去哪兒看。

把握脈絡(luò)

在深入了解HAL的每一個接口之前,我們需要先了解程序的整體框架。

main函數(shù)在哪兒?

了解整體框架的第一步,莫過于找到程序入口。

主函數(shù)的定義位于ArduCopter/ArduCopter.cpp的結(jié)尾處。

AP_HAL_MAIN_CALLBACKS(&copter);

AP_HAL_MAIN_CALLBACKS用于定義主函數(shù)。

#define AP_HAL_MAIN_CALLBACKS(CALLBACKS) extern “C” {

int AP_MAIN(int argc, char* const argv[]);

int AP_MAIN(int argc, char* const argv[]) {

hal.run(argc, argv, CALLBACKS);

return 0;

}

}

主函數(shù)的名稱不一定是大家熟悉的main,對于pixhawk平臺來說,其是Ardupilot_main。

#if CONFIG_HAL_BOARD == HAL_BOARD_PX4 || CONFIG_HAL_BOARD == HAL_BOARD_VRBRAIN

#define AP_MAIN __EXPORT ArduPilot_main

#endif

經(jīng)過預(yù)編譯后,其最終的形態(tài)如下,這就是ardupilot的主函數(shù)。

extern “C”

{

int __attribute__ ((visibility (“default”))) ArduPilot_main(int argc, char* const argv[]);

int __attribute__ ((visibility (“default”))) ArduPilot_main(int argc, char* const argv[])

{

hal.run(argc, argv, &copter);

return 0;

}

}

也許你會疑惑,為什么要如此大費周章地定義主函數(shù)呢?

首先,主函數(shù)的名稱依平臺而定,這肯定是要用宏的。

其次,ardupilot項目不僅僅是ArduCopter,它還有APMrover2,AntennaTracker,ArduPlane和ArduSub,即ardupilot工程有多個入口函數(shù),在編譯時根據(jù)目標(biāo)類型來選擇。使用AP_HAL_MAIN_CALLBACKS來定義,可避免重復(fù)代碼,并且后續(xù)修改時只需要修改AP_HAL_MAIN_CALLBACKS宏即可。

放一起看下效果:

ArduCopter/ArduCopter.cpp

AP_HAL_MAIN_CALLBACKS(&copter);

ArduSub/ArduSub.cpp

AP_HAL_MAIN_CALLBACKS(&sub);

如果你想知道筆者是如何找到這個入口的,請看尋找ardupilot的main函數(shù)。

HAL引用

ArduPilot_main中只有一行關(guān)鍵代碼:

hal.run(argc, argv, &copter);

hal是HAL實例的引用,這個引用定義在Copter.cpp中。

const AP_HAL::HAL& hal = AP_HAL::get_HAL();

get_HAL()函數(shù)為業(yè)務(wù)層提供獲取HAL實例的接口,其在AP_HAL_Namespace.h中聲明,由HAL_PX4實現(xiàn)。

libraries/AP_HAL/AP_HAL_Namespace.h

// Must be implemented by the concrete HALs.

const HAL& get_HAL();

libraires/AP_HAL_PX4/HAL_PX4_Class.cpp中實現(xiàn)了get_HAL函數(shù),其創(chuàng)建并返回HAL實例。

const AP_HAL::HAL& AP_HAL::get_HAL() {

static const HAL_PX4 hal_px4;

return hal_px4;

}

HAL類是硬件抽象層(HAL)的一個集合類,它包含了對硬件抽象層其他類的實例的引用。HAL類、get_HAL()以及HAL類引用的其他類,聲明在AP_HAL命名空間中。具體可查看AP_HAL_Namespace.h,這里就不貼代碼了,給張類圖:

9b43cce2-9e22-11eb-8b86-12bb97331649.png

HAL類定義在HAL.h中,它用于管理其他各種類的實例,從而為業(yè)務(wù)層提供便捷的訪問。

9ba79772-9e22-11eb-8b86-12bb97331649.png

UML圖示說明

上圖為UML類圖。每一個帶C標(biāo)記的方框表示一個類。方框中可添加成員變量和函數(shù)的說明。

成員變量的格式為:name:type

成員函數(shù)的格式為:name (parameter-list) : return-type,每一個形參的格式為:name:type

除了在方框中定義成員變量,還可以使用箭頭指向類的方式來表示。所以,上圖展示出HAL類中有著各種驅(qū)動類的實例。

業(yè)務(wù)層在獲得了hal后,就可以通過它訪問具體的驅(qū)動接口,比如說:

使用hal.console-》printf()打印日志

使用AP_HAL::millis()和AP_HAL::micros() 獲取上電啟動到現(xiàn)在所經(jīng)過的時間

使用hal.scheduler-》delay() 和 hal.scheduler-》delay_microseconds() 睡眠一定的時間

使用hal.gpio-》pinMode(), hal.gpio-》read() 和 hal.gpio-》write() 訪問GPIO引腳

通過hal.i2c_mgr訪問I2C設(shè)備

通過hal.spi訪問SPI設(shè)備

AP_HAL_PX4框架

libraries/AP_HAL之中定義的是HAL接口,順帶著介紹下其實現(xiàn)。

PX4的實現(xiàn)位于libraries/AP_HAL_PX4之中,其結(jié)構(gòu)為:

定義了PX4命名空間,基本上所有驅(qū)動類位于其中。

每一個AP_HAL空間中的驅(qū)動類,都在PX4空間中能找到實現(xiàn)。比如PX4UARTDriver繼承自UARTDriver,實現(xiàn)了其定義的全部接口。

HAL_PX4類繼承自HAL類。

PX4中的驅(qū)動類依賴于PX4Firmware中間件以實現(xiàn)具體的驅(qū)動功能,比如PX4_I2C繼承自PX4Firmware中的I2C類。

下圖描述了AP_HAL空間,PX4空間以及PX4Firmware的關(guān)系。只繪制了少部分AP_HAL中的類以做示意。若全放出來的話,那這圖就沒法兒看了。

9bb2a63a-9e22-11eb-8b86-12bb97331649.png

HAL_PX4的初始化詳見其構(gòu)造函數(shù),在HAL_PX4_Class.cpp之中

HAL_PX4::HAL_PX4() :

AP_HAL::HAL(

&uartADriver, /* uartA */

&uartBDriver, /* uartB */

&uartCDriver, /* uartC */

&uartDDriver, /* uartD */

&uartEDriver, /* uartE */

&uartFDriver, /* uartF */

&i2c_mgr_instance,

&spi_mgr_instance,

&analogIn, /* analogin */

&storageDriver, /* storage */

&uartADriver, /* console */

&gpioDriver, /* gpio */

&rcinDriver, /* rcinput */

&rcoutDriver, /* rcoutput */

&schedulerInstance, /* scheduler */

&utilInstance, /* util */

nullptr, /* no onboard optical flow */

nullptr) /* CAN */

{}

setup()和loop()

ArduCopter的主要工作,在setup()和loop()中執(zhí)行。setup()進(jìn)行初始化,而loop()如其名稱一樣,將被底層循環(huán)調(diào)用,以主持飛行工作的大局。

9bcbb31e-9e22-11eb-8b86-12bb97331649.png

搞清聯(lián)系

至目前為止,我們了解了程序框架的4要素,它們是:

程序入口:AP_HAL_MAIN_CALLBACKS(&copter)

隨處可用的hal引用:const AP_HAL::HAL& hal = AP_HAL::get_HAL();

setup()

loop()

我們知道setup()會被底層調(diào)用一次,還知道loop()會被底層循環(huán)調(diào)用。不過它們是在哪兒被調(diào)用的呢?這與AP_HAL_MAIN_CALLBACKS定義出的入口函數(shù)有什么關(guān)聯(lián)嗎?如果不搞清楚這些問題,筆者覺得并不算是掌握了脈絡(luò)。好的,現(xiàn)在筆者來深入剖析它們的關(guān)系。

setup,loop和底層的關(guān)系是這樣的:

Callbacks接口定義了兩個純虛函數(shù)setup和loop。

ArduCopter.cpp中定義了Copter類,繼承Callbacks接口,所以Copter的實例就是Callbacks對象。

9c31c37a-9e22-11eb-8b86-12bb97331649.png

ArduCopter.cpp將創(chuàng)建出的Callbacks對象傳遞給HAL_PX4,以供其調(diào)用。就是ArduPilot_main中的那行代碼:

hal.run(argc, argv, &copter);

具體的調(diào)用流程是這樣的:

AHRS_Test.cpp通過宏AP_HAL_MAIN定義出了Ardupilot_main()。

上電啟動后,硬件平臺調(diào)用Ardupilot_main()。

Ardupilot_main()調(diào)用HAL層的入口函數(shù)HAL_PX4::run(),并將自己的Callbacks對象傳遞給它。

HAL_PX4::run()調(diào)用了自己的main_loop()。

main_loop先調(diào)用AHRS_Test.cpp的setup()進(jìn)行業(yè)務(wù)初始化。

main_loop循環(huán)調(diào)用AHRS_Test.cpp的loop(),直到斷電。

一圖以蔽之

9c44acba-9e22-11eb-8b86-12bb97331649.png

也可以用eclipse的查看調(diào)用棧功能來展示:

9c4c91c8-9e22-11eb-8b86-12bb97331649.png

9c612c64-9e22-11eb-8b86-12bb97331649.png

看完上述內(nèi)容,是不是感覺有點復(fù)雜呢。筆者來總結(jié)一下:

首先,記住兩點最關(guān)鍵的:

ArduCopter代碼定義setup()和loop(),setup()進(jìn)行初始化,而運行時的主要工作是在loop()之中。

HAL_PX4_Class負(fù)責(zé)程序調(diào)度,即調(diào)用setup()和loop()。

不過呢,有點繞的是:HAL_PX4_Class并不提供程序入口,程序入口由ArduCopter提供,它們會定義Ardupilot_main()。由Ardupilot_main()啟動HAL_PX4_Class。

為什么不由HAL_PX4_Class來定義程序入口?再想想?因為程序有很多可選入口嘛。還記得APMrover2,AntennaTracker,ArduPlane和ArduSub嗎。

深入淺出

我們了解了程序框架的4要素,并且深入研究了它們之間的調(diào)度邏輯,是時候“淺出”一下了。我們來看一個ardupilot里面的example。

9c69c52c-9e22-11eb-8b86-12bb97331649.png

為一覽全貌,筆者折疊了很多代碼塊。大家發(fā)現(xiàn)什么了沒?程序4要素都在其中。example是獨立于業(yè)務(wù)代碼之外,可單獨運行的代碼。其與業(yè)務(wù)代碼處在相同的層次上,它們都依賴于共享庫和HAL。

9c730cf4-9e22-11eb-8b86-12bb97331649.png

AHRS_Test.cpp是姿態(tài)解算的示例。ardupilot工程中有各種示例代碼,有AP_HAL驅(qū)動的example,也有各種共享庫的example,有兩個作用:

演示功能模塊的用法。

對功能模塊進(jìn)行測試。當(dāng)我們實現(xiàn)了新平臺的HAL接口時,使用example來驗證,遠(yuǎn)比直接跑業(yè)務(wù)代碼要方便有效。

在工程根目錄下查找所有示例:

9c7b38ca-9e22-11eb-8b86-12bb97331649.png

怎么用這個示例呢,使用如下命令編譯固件并上傳:

。/waf build --target examples/AHRS_Test --upload

ardupilot是單線程的嗎?

看了由setup()和loop()組成的框架,你可能會認(rèn)為ardupilot是單線程的。早期的ardupilot跑在ardunio上,setup()和loop()就是歷史的痕跡。那時的ardupilot確實是loop外加一個定時器回調(diào),算是2個線程。

從pixhawk開始,這一切就不同了。pixhawk平臺的底層系統(tǒng)是Nuttx實時操作系統(tǒng),其支持帶優(yōu)先級的多線程功能,而AP_HAL_PX4充分利用了這一特性。請看筆者嘔心瀝血繪制的高清大圖(請在新標(biāo)簽頁中打開圖片):

9c95b740-9e22-11eb-8b86-12bb97331649.png

上圖展示了各個線程的大體框架,左邊線程的優(yōu)先級大于右邊的。除了main_loop和timer_thread,還有許多其他的線程。最多的是總線通信線程,有SPI, I2C, CAN, Uart。也可通過下表進(jìn)行了解,優(yōu)先級的數(shù)值越大代表優(yōu)先級越高。

名稱優(yōu)先級定時間隔函數(shù)名說明

bus242

DeviceBus::bus_thread用于SPI

timer1811msPX4Scheduler::_timer_thread

main1802.5msmain_loop主線程

uavcan1791msPX4Scheduler::_uavcan_thread

bus178

DeviceBus::bus_thread用于I2C

uart601msPX4Scheduler::_uart_thread

storage5910msPX4Scheduler::_storage_thread

io581msPX4Scheduler::_io_thread

main_loop里面的并行實際上是一個偽并行,由ardupilot自己設(shè)計的AP_Scheduler系統(tǒng)來進(jìn)行調(diào)度。這里就不展開了,后續(xù)有機會的話會單獨介紹。

深入細(xì)節(jié)

不知不覺寫了好多,下一篇再講具體的HAL接口。對了,講解移植流程,就得等Ardupilot移植經(jīng)驗分享(4)了。

原文標(biāo)題:Ardupilot移植經(jīng)驗分享(2)

文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70790

原文標(biāo)題:Ardupilot移植經(jīng)驗分享(2)

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    機智云配網(wǎng)教程第三期:單片機代碼移植實戰(zhàn)

    前言本篇文章將分享單片機移植經(jīng)驗??梢韵螺d并按步驟移植,也可以直接使用已移植好的工程文件。文中將介紹我在移植過程中遇到的問題,并提供解決方
    的頭像 發(fā)表于 07-01 17:32 ?175次閱讀
    機智云配網(wǎng)教程第三期:單片機代碼<b class='flag-5'>移植</b>實戰(zhàn)

    求助,關(guān)于K230 linux SENSOR 移植讀取CIF的RAW數(shù)據(jù)的疑問?

    在K230 linux SENSOR 移植指南中給出了K230移植普通攝像頭的教程,mipi讀取的時ISP后的數(shù)據(jù),但如果我想在k230里面移植自己的攝像頭,通過mipi接口讀取cif節(jié)點的raw
    發(fā)表于 06-16 06:56

    簡述電源設(shè)計經(jīng)驗技巧

    在電源設(shè)計領(lǐng)域中,經(jīng)驗的積累往往決定了產(chǎn)品的穩(wěn)定性和可靠性。若是電子新人了解到一些實用的設(shè)計技巧,電源設(shè)計將事半功倍。下面將總結(jié)大佬的14條電源設(shè)計經(jīng)驗,以此提供參考和指導(dǎo)。
    的頭像 發(fā)表于 04-23 09:26 ?405次閱讀

    工業(yè)控制PCBA抗震設(shè)計要點:經(jīng)驗分享與技術(shù)探討

    。本文將結(jié)合實際經(jīng)驗,分享一些關(guān)于工業(yè)控制PCBA抗震設(shè)計的要點和技巧。 首先,合理的布局是提升PCBA抗震性能的基礎(chǔ)。在布局時,應(yīng)充分考慮元器件的重量、尺寸以及安裝方式,將重的元器件放置在PCB的中心位置或靠近支撐點,以降低重心,減少振動帶
    的頭像 發(fā)表于 04-14 17:51 ?873次閱讀

    從DeepSeek到Qwen,AI大模型的移植與交互實戰(zhàn)指南-飛凌嵌入式

    在不久前發(fā)布的《技術(shù)實戰(zhàn)|OK3588-C開發(fā)板上部署DeepSeek-R1大模型的完整指南》一文中,小編為大家介紹了DeepSeek-R1在飛凌嵌入式OK3588-C開發(fā)板上的移植部署、效果展示以及性能評測,本篇文章不僅將繼續(xù)為大家?guī)?b class='flag-5'>關(guān)于DeepSeek-R1的干貨知
    的頭像 發(fā)表于 03-28 08:06 ?1660次閱讀
    從DeepSeek到Qwen,AI大模型的<b class='flag-5'>移植</b>與交互實戰(zhàn)指南-飛凌嵌入式

    移植LWIP+FREERTOS時遇到的問題怎么解決?

    :將ST官網(wǎng)的LWIP1.4.1 的例子(關(guān)于LWIP的部分)移植到步驟1 的FreeRTOS 系統(tǒng)的工程里面,只是添加LWIP初始化的任務(wù),并沒有調(diào)用任何接口的情況下可以Ping 通 而且長時間
    發(fā)表于 03-11 06:48

    詳解Object Detection Demo的移植

    繼上一篇移植了 Mediapipe 的 LLM Inference 后,這篇文章我們將繼續(xù)探索 Object Detection Demo 的移植。
    的頭像 發(fā)表于 02-05 13:42 ?495次閱讀
    詳解Object Detection Demo的<b class='flag-5'>移植</b>

    電子工程師的經(jīng)驗分享

    電子工程師在實際工作中積累了豐富的經(jīng)驗,這些經(jīng)驗對于新手工程師和電子專業(yè)的學(xué)生具有重要的參考價值。 一、電路設(shè)計經(jīng)驗 電路設(shè)計核心思想 電路設(shè)計的核心在于理解電路的基本原理和功能需求。在設(shè)計電路
    的頭像 發(fā)表于 01-14 10:14 ?623次閱讀

    多平臺FPGA工程快速移植與構(gòu)建

    作為一名FPGA工程師,經(jīng)常需要在多個FPGA設(shè)備之間移植項目,核心的問題是IP的管理和移植,今天通過安裝和使用 FuseSoC 在多個 AMD FPGA 之間移植一個簡單的項目。從 AMD Spartan 7 更改為 AMD
    的頭像 發(fā)表于 11-20 16:12 ?1931次閱讀
    多平臺FPGA工程快速<b class='flag-5'>移植</b>與構(gòu)建

    外設(shè)移植 安信可Ai-WB2+FPM383C指紋

    以下作品由安信可社區(qū)用戶 WT_0213 制作 關(guān)于 FPM383C 指紋模塊 在之前的帖子介紹的已經(jīng)比較詳細(xì)了可以看下這個帖子。 【外設(shè)移植】FPM383C 指紋模塊 +Ai-M61-32S
    的頭像 發(fā)表于 10-29 14:54 ?692次閱讀
    外設(shè)<b class='flag-5'>移植</b> 安信可Ai-WB2+FPM383C指紋

    Nordic-RT-Thread5.1.0移植筆記

    Nordic-RT-Thread5.1.0移植筆記
    的頭像 發(fā)表于 10-16 08:09 ?1329次閱讀
    Nordic-RT-Thread5.1.0<b class='flag-5'>移植</b>筆記

    基于機智云移植STM32L496G代碼移植

    前言最近我拿到了STM32L496AGMCU,發(fā)現(xiàn)其擴展版可以連接ESP-01S。我想嘗試將開發(fā)板連接到我們的機智云上,并根據(jù)機智云提供的文檔進(jìn)行程序移植。STM32CubeMX移植機智云自動生成
    的頭像 發(fā)表于 09-20 08:05 ?1197次閱讀
    基于機智云<b class='flag-5'>移植</b>STM32L496G代碼<b class='flag-5'>移植</b>

    【GD32 MCU 移植教程】9、從 STM32F10x 系列移植到 GD32F30x 系列

    對比、外設(shè)及性能對比以及從 STM32F10x 移植到 GD32F30x 的移植步驟,旨在讓開發(fā)者能夠快速從STM32F10x 移植到 GD32F30x,縮短研發(fā)周
    的頭像 發(fā)表于 09-07 09:57 ?1986次閱讀
    【GD32 MCU <b class='flag-5'>移植</b>教程】9、從 STM32F10x 系列<b class='flag-5'>移植</b>到 GD32F30x 系列

    【GD32 MCU 移植教程】8、從 STM32F4xx 系列移植到 GD32F4xx 系

    、外設(shè)及性能對比以及從 STM32F4xx 移植到 GD32F4xx 的移植步驟,旨在讓開發(fā)者能夠快速從STM32F4xx移植到 GD32F4xx,縮短研發(fā)周期,
    的頭像 發(fā)表于 09-06 09:40 ?2650次閱讀
    【GD32 MCU <b class='flag-5'>移植</b>教程】8、從 STM32F4xx 系列<b class='flag-5'>移植</b>到 GD32F4xx 系

    【GD32 MCU 移植教程】5、GD32E230 系列移植到 GD32F330 系列

    移植到 GD32F330 系列的需求,本文 檔專門針對既有的 GD32E230 代碼如何移植到 GD32F330 做一個詳細(xì)的介紹;
    的頭像 發(fā)表于 09-03 10:05 ?2631次閱讀
    【GD32 MCU <b class='flag-5'>移植</b>教程】5、GD32E230 系列<b class='flag-5'>移植</b>到 GD32F330 系列