只要三步!連老師帶你初探Hi3861程式碼結構

靜思心遠發表於2020-10-13

原創 連志安 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的資訊。符合預期。

 

你也許想看:

 

一文學會HarmonyOS編譯環境的搭建

 

HarmonyOS技術專題釋出了!

相關文章