只要三步!連老師帶你初探Hi3861程式碼結構
原創 連志安 HarmonyOS社群 今天
收錄於話題
#IoT 2
#開發板 2
一、編寫一個簡單的Hello world程式
編寫一個Hello world程式比較簡單,可以參考官網:
https://device.harmonyos.com/cn/docs/start/introduce/oem_wifi_start-0000001050168544
本文在這裡做下總結。
1.1、確定目錄結構
開發者編寫業務時,務必先在./applications/sample/wifi-iot/app路徑下新建一個目錄(或一套目錄結構),用於存放業務原始碼檔案,例如:在app下新增業務my_first_app,其中hello_world.c為業務程式碼,BUILD.gn為編譯指令碼,具體規劃目錄結構如下:
1.2、編寫業務程式碼
在hello_world.c中新建業務入口函式HelloWorld,並實現業務邏輯。並在程式碼最下方,使用 HarmonyOS啟動恢復模組介面SYS_RUN()啟動業務。(SYS_RUN定義在ohos_init.h檔案中)
1.3、編寫用於將業務構建成靜態庫的BUILD.gn檔案
如步驟1所述,BUILD.gn檔案由三部分內容(目標、原始檔、標頭檔案路徑)構成,需由開發者完成填寫。以my_first_app為例,需要建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,並完如下配置。
static_library中指定業務模組的編譯結果,為靜態庫檔案libmyapp.a,開發者根據實際情況完成填寫。sources中指定靜態庫.a所依賴的.c檔案及其路徑,若路徑中包含"//"則表示絕對路徑(此處為程式碼根路徑),若不包含"//"則表示相對路徑。include_dirs中指定source所需要依賴的.h檔案路徑。
1.4、編寫模組BUILD.gn檔案,指定需參與構建的特性模組
配置./applications/sample/wifi-iot/app/BUILD.gn檔案,在features欄位中增加索引,使目標模組參與編譯。features欄位指定業務模組的路徑和目標,以my_first_app舉例,features欄位配置如下。
my_first_app是相對路徑,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。
myapp是目標,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。
二、Hi3861相關程式碼結構
目前hi3861用的是liteos-m核心,但是目前hi3681的liteos-m被晶片rom化了,固化在晶片內部了。所以在harmonyOS程式碼是找不到hi3861的核心部分。但是這樣不妨礙我們去理清hi3861的其他程式碼結構。hi3861平臺配置檔案
build\lite\platform\hi3861v100_liteos_riscv\platform.json
該檔案描述了hi3681平臺相關的程式碼路徑,例如application、startup等。
這裡我列舉出來幾個比較重要的:
子系統:applications
路徑:applications/sample/wifi-iot/app
作用:這個路徑下存放了hi3681編寫的應用程式程式碼,例如我們剛剛寫的hello world 程式碼就放在這個路徑下。
子系統:iot_hardware
路徑:base/iot_hardware/frameworks/wifiiot_lite
作用:存放了 hi3681 晶片相關的驅動、例如spi、gpio、uart等。
子系統:vendor
路徑:vendor/hisi/hi3861/hi3861
作用:存放了 hi3681 相關的廠商SDK之類的檔案。其中最重要的是
vendor\hisi\hi3861\hi3861\app\wifiiot_app\init\app_io_init.c
vendor\hisi\hi3861\hi3861\app\wifiiot_app\src\app_main.c
其中,app_io_init.c 是hi3681核心啟動後的io口相關設定,使用者需根據應用場景,合理選擇各外設的IO複用配置。
app_main.c 是核心啟動進入的應用程式入口。
三、Hi3861啟動流程
由於hi3681的liteos-m被晶片rom化了,固化在晶片內部了。所以我們主要看核心啟動後的第一個入口函式。
程式碼路徑:
app_main一開始列印了 SDK版本號,最後一行會呼叫HOS_SystemInit(); 函式進行鴻蒙系統的初始化。我們進去看下初始化做了哪些動作。
路徑:base/startup/services/bootstrap_lite/source/system_init.c
我們可以看到主要是初始化了 一些相關模組、系統,包括有bsp、device(裝置)。其中最終的是MODULE_INIT(run),它負責呼叫了所有run段的程式碼,那麼run段的程式碼是哪些呢?事實上就是我們前面application中使用SYS_RUN() 巨集設定的函式名。
還記得我們前面寫的hello world應用程式嗎?
也就是說所有用SYS_RUN() 巨集設定的函式都會在使用MODULE_INIT(run);的時候被呼叫,為了驗證這一點,我們可以加一些列印資訊,如下:
我們重新編譯後燒錄。開啟串列埠檢視列印資訊,如下:
可以看到在35行之後,就列印 Hello world的資訊。符合預期。
你也許想看:
相關文章
- 優化你的程式碼結構 --- MVP優化MVP
- GitHub生成帶token的專案程式碼連結地址Github
- ai老師帶我飛AI
- 攻擊銀行內網,只要三步內網
- 老當機帶你用 PHP 實現資料結構之二叉樹PHP資料結構二叉樹
- 只要五分鐘,帶你學會策略模式模式
- 一文帶你瞭解Linux軟連結與硬連結!Linux
- 三步帶你玩轉前端裝飾器前端
- 架構師帶你玩轉分散式鎖架構分散式
- 阿里架構師帶你深入淺出jvm阿里架構JVM
- 資料結構 - 樹,初探資料結構
- 資料結構(一)-初探資料結構
- 老程式碼多=過度耦合=if else?阿里巴巴工程師這樣捋直老程式碼阿里工程師
- 只要200行JavaScript程式碼,就能把特斯拉汽車帶到您身邊JavaScript
- 三步帶你實現資料視覺化視覺化
- 阿里架構師Peter老師講述Java程式設計師→架構師所需要掌握的技能阿里架構Java程式設計師
- Flutter 6 個建議改善你的程式碼結構Flutter
- JavaScript 的資料結構和演算法 - 連結串列程式碼篇JavaScript資料結構演算法
- 基本資料結構實現--單連結串列【含測試程式碼】資料結構
- 基本資料結構實現--雙連結串列【含測試程式碼】資料結構
- 前端深入之css篇丨初探【transform】,手把手帶你實現1024程式設計師節動畫前端CSSORM程式設計師動畫
- 好程式設計師帶你認識“jQuery”程式設計師jQuery
- 資料結構--單連結串列的建立和遍歷(程式碼優化)資料結構優化
- Tony 老師搭建 MMM 架構架構
- java架構的程式碼結構Java架構
- particle雲架構程式碼結構架構
- 如何看待俞敏洪帶百名老師帶貨賣農產品,實在RPA帶你瞭解真相
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 資料結構 - 雜湊表,初探資料結構
- iOS 初探程式碼混淆(OC)iOS
- 重構你的javascript程式碼JavaScript
- 乾貨好文帶你理解C語言中的連結串列C語言
- 1024 程式設計師節,帶你走程式序員的世界—程式設計師
- 程式設計師大殺器?帶你玩轉ChatGPT程式設計師ChatGPT
- 結構體-*老--質價比結構體
- 老許,你要轉Flutter不要?只要你開金口,面試題現在就給你送來Flutter面試題
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素