一、編寫一個簡單的Hello world程序
編寫一個Hello world程序比較簡單,可以參考官網(wǎng):
https://device.harmonyos.com/cn/docs/start/introduce/oem_wifi_start-0000001050168544
本文在這里做下總結(jié)。
1.1、確定目錄結(jié)構(gòu)
開發(fā)者編寫業(yè)務時,務必先在./applications/sample/wifi-iot/app路徑下新建一個目錄(或一套目錄結(jié)構(gòu)),用于存放業(yè)務源碼文件,例如:在app下新增業(yè)務my_first_app,其中hello_world.c為業(yè)務代碼,BUILD.gn為編譯腳本,具體規(guī)劃目錄結(jié)構(gòu)如下:
1.2、編寫業(yè)務代碼
在hello_world.c中新建業(yè)務入口函數(shù)HelloWorld,并實現(xiàn)業(yè)務邏輯。并在代碼最下方,使用 HarmonyOS啟動恢復模塊接口SYS_RUN()啟動業(yè)務。(SYS_RUN定義在ohos_init.h文件中)
1.3、編寫用于將業(yè)務構(gòu)建成靜態(tài)庫的BUILD.gn文件
如步驟1所述,BUILD.gn文件由三部分內(nèi)容(目標、源文件、頭文件路徑)構(gòu)成,需由開發(fā)者完成填寫。以my_first_app為例,需要建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,并完如下配置。
static_library中指定業(yè)務模塊的編譯結(jié)果,為靜態(tài)庫文件libmyapp.a,開發(fā)者根據(jù)實際情況完成填寫。sources中指定靜態(tài)庫.a所依賴的.c文件及其路徑,若路徑中包含"http://"則表示絕對路徑(此處為代碼根路徑),若不包含"http://"則表示相對路徑。include_dirs中指定source所需要依賴的.h文件路徑。
1.4、編寫模塊BUILD.gn文件,指定需參與構(gòu)建的特性模塊
配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段中增加索引,使目標模塊參與編譯。features字段指定業(yè)務模塊的路徑和目標,以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相關(guān)代碼結(jié)構(gòu)
目前hi3861用的是liteos-m內(nèi)核,但是目前hi3681的liteos-m被芯片rom化了,固化在芯片內(nèi)部了。所以在harmonyOS代碼是找不到hi3861的內(nèi)核部分。但是這樣不妨礙我們?nèi)ダ砬録i3861的其他代碼結(jié)構(gòu)。hi3861平臺配置文件
buildliteplatformhi3861v100_liteos_riscvplatform.json
該文件描述了hi3681平臺相關(guān)的代碼路徑,例如application、startup等。
這里我列舉出來幾個比較重要的:
子系統(tǒng):applications
路徑:applications/sample/wifi-iot/app
作用:這個路徑下存放了hi3681編寫的應用程序代碼,例如我們剛剛寫的hello world 代碼就放在這個路徑下。
子系統(tǒng):iot_hardware
路徑:base/iot_hardware/frameworks/wifiiot_lite
作用:存放了 hi3681 芯片相關(guān)的驅(qū)動、例如spi、gpio、uart等。
子系統(tǒng):vendor
路徑:vendor/hisi/hi3861/hi3861
作用:存放了 hi3681 相關(guān)的廠商SDK之類的文件。其中最重要的是
vendorhisihi3861hi3861appwifiiot_appinitapp_io_init.c
vendorhisihi3861hi3861appwifiiot_appsrcapp_main.c
其中,app_io_init.c 是hi3681內(nèi)核啟動后的io口相關(guān)設置,用戶需根據(jù)應用場景,合理選擇各外設的IO復用配置。
app_main.c 是內(nèi)核啟動進入的應用程序入口。
三、Hi3861啟動流程
由于hi3681的liteos-m被芯片rom化了,固化在芯片內(nèi)部了。所以我們主要看內(nèi)核啟動后的第一個入口函數(shù)。
代碼路徑:
app_main一開始打印了 SDK版本號,最后一行會調(diào)用HOS_SystemInit(); 函數(shù)進行鴻蒙系統(tǒng)的初始化。我們進去看下初始化做了哪些動作。
路徑:base/startup/services/bootstrap_lite/source/system_init.c
我們可以看到主要是初始化了 一些相關(guān)模塊、系統(tǒng),包括有bsp、device(設備)。其中最終的是MODULE_INIT(run),它負責調(diào)用了所有run段的代碼,那么run段的代碼是哪些呢?事實上就是我們前面application中使用SYS_RUN() 宏設置的函數(shù)名。
還記得我們前面寫的hello world應用程序嗎?
也就是說所有用SYS_RUN() 宏設置的函數(shù)都會在使用MODULE_INIT(run);的時候被調(diào)用,為了驗證這一點,我們可以加一些打印信息,如下:
我們重新編譯后燒錄。打開串口查看打印信息,如下:
可以看到在35行之后,就打印 Hello world的信息。符合預期。
責任編輯:lq
-
程序
+關(guān)注
關(guān)注
117文章
3798瀏覽量
81469 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4349瀏覽量
63027 -
模塊接口
+關(guān)注
關(guān)注
0文章
2瀏覽量
5496
原文標題:只要三步!連老師帶你初探Hi3861代碼結(jié)構(gòu)
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
使用MCUXpresso for VS Code插件開發(fā)Zephyr的hello world
![使用MCUXpresso for VS Code插件開發(fā)Zephyr的<b class='flag-5'>hello</b> <b class='flag-5'>world</b>](https://file1.elecfans.com/web3/M00/04/A6/wKgZPGd3PBeAcAcFAABDETVNApk954.png)
關(guān)于esp8266串行調(diào)試的問題求解
esp32運行make flash燒寫hello world遇到的疑問求解
使用make flash命令燒錄Hello_world程式失敗了,為什么?
hello_world例程里面CONFIG_FREERTOS_HZ沒定義,但又能編譯燒錄,為什么?
鴻蒙ArkUI-X跨平臺開發(fā):【 編寫第一個ArkUI-X應用】
![鴻蒙ArkUI-X跨平臺開發(fā):【 <b class='flag-5'>編寫</b>第<b class='flag-5'>一個</b>ArkUI-X應用】](https://file1.elecfans.com/web2/M00/E7/6A/wKgaomZHYpCAfHdmAABRB5pcYsA368.jpg)
鴻蒙OpenHarmony【輕量系統(tǒng) 編寫“Hello World”程序】 (基于Hi3861開發(fā)板)
![鴻蒙OpenHarmony【輕量系統(tǒng) <b class='flag-5'>編寫</b>“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”<b class='flag-5'>程序</b>】 (基于Hi3861開發(fā)板)](https://file1.elecfans.com/web2/M00/E6/F1/wKgaomZF3JuAZ8IMAAAxJKnBYwA272.png)
鴻蒙OpenHarmony【小型系統(tǒng) 編寫“Hello World”程序】 (基于Hi3516開發(fā)板)
![鴻蒙OpenHarmony【小型系統(tǒng) <b class='flag-5'>編寫</b>“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”<b class='flag-5'>程序</b>】 (基于Hi3516開發(fā)板)](https://file1.elecfans.com/web2/M00/E3/EA/wKgZomY92mCAOpDmAABBE-im69c216.png)
鴻蒙OpenHarmony【標準系統(tǒng) 編寫“Hello World”程序】(基于RK3568開發(fā)板)
![鴻蒙OpenHarmony【標準系統(tǒng) <b class='flag-5'>編寫</b>“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”<b class='flag-5'>程序</b>】(基于RK3568開發(fā)板)](https://file1.elecfans.com/web2/M00/E4/5A/wKgaomY8nl-ALH4oAAA3gQX5Lbg184.png)
鴻蒙OpenHarmony南向:【Hi3516標準系統(tǒng)入門(IDE方式)】
![鴻蒙OpenHarmony南向:【Hi3516標準系統(tǒng)入門(IDE方式)】](https://file1.elecfans.com/web2/M00/E1/C7/wKgZomY52MmAS66XAAADCp1_zEY399.jpg)
鴻蒙OpenHarmony【標準系統(tǒng)編寫“Hello World”程序】 (基于RK3568開發(fā)板)
![鴻蒙OpenHarmony【標準系統(tǒng)<b class='flag-5'>編寫</b>“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”<b class='flag-5'>程序</b>】 (基于RK3568開發(fā)板)](https://file1.elecfans.com/web2/M00/C5/CD/wKgZomYCdwyAIFf5AAB_7E1pFms943.jpg)
鴻蒙OpenHarmony【小型系統(tǒng)編寫“Hello World”程序】 (基于Hi3516開發(fā)板)
![鴻蒙OpenHarmony【小型系統(tǒng)<b class='flag-5'>編寫</b>“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”<b class='flag-5'>程序</b>】 (基于Hi3516開發(fā)板)](https://file1.elecfans.com/web2/M00/C5/CD/wKgZomYCdwyAIFf5AAB_7E1pFms943.jpg)
鴻蒙OpenHarmony【輕量系統(tǒng)編寫“Hello World”程序】 (基于Hi3861開發(fā)板)
![鴻蒙OpenHarmony【輕量系統(tǒng)<b class='flag-5'>編寫</b>“<b class='flag-5'>Hello</b> <b class='flag-5'>World</b>”<b class='flag-5'>程序</b>】 (基于Hi3861開發(fā)板)](https://file1.elecfans.com/web2/M00/C5/D1/wKgZomYChGOAUaiiAADe1d8SeRY102.jpg)
全志D1s開發(fā)板軟件入門之Hello World演示
用于EK-RA8D1 MIPI LCD顯示器的GUIX Hello World
![用于EK-RA8D1 MIPI LCD顯示器的GUIX <b class='flag-5'>Hello</b> <b class='flag-5'>World</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論