嘗鮮!我在華為鴻蒙上編寫的第一個 Hello World!那些說鴻蒙是PPT的可以閉嘴了!
作者:阿拉蕾aaa
來源:my.oschina.net/u/4518335/blog/4557426
最激動入門級選手的心的時刻來了,本示例將演示如何編寫簡單業(yè)務(wù),輸出“Hello World”。
修改源碼
bugfix和新增業(yè)務(wù)兩種情況,涉及源碼修改。下面以新增業(yè)務(wù)舉例,向開發(fā)者介紹如何進(jìn)行源碼修改。
1.確定目錄結(jié)構(gòu)。
開發(fā)者編寫業(yè)務(wù)時,務(wù)必先在./applications/sample/wifi-iot/app路徑下新建一個目錄(或一套目錄結(jié)構(gòu)),用于存放業(yè)務(wù)源碼文件。
例如:在app下新增業(yè)務(wù)my_first_app,其中hello_world.c為業(yè)務(wù)代碼,BUILD.gn為編譯腳本,具體規(guī)劃目錄結(jié)構(gòu)如下:
.
└──?applications
????└──?sample
????????└──?wifi-iot
????????????└──?app
????????????????│──?my_first_app
????????????????│??│──?hello_world.c
????????????????│??└──?BUILD.gn
????????????????└──?BUILD.gn
2.編寫業(yè)務(wù)代碼。
在hello_world.c中新建業(yè)務(wù)入口函數(shù)HelloWorld,并實現(xiàn)業(yè)務(wù)邏輯。并在代碼最下方,使用OpenHarmony啟動恢復(fù)模塊接口SYS_RUN()啟動業(yè)務(wù)。(SYS_RUN定義在ohos_init.h文件中)
#include?"ohos_init.h"
#include?"ohos_types.h"
void?HelloWorld(void)
{
????printf("[DEMO]?Hello?world.\n");
}
SYS_RUN(HelloWorld);
3.編寫用于將業(yè)務(wù)構(gòu)建成靜態(tài)庫的BUILD.gn文件。
如步驟1所述,BUILD.gn文件由三部分內(nèi)容(目標(biāo)、源文件、頭文件路徑)構(gòu)成,需由開發(fā)者完成填寫。以my_first_app為例,需要創(chuàng)建./applications/sample/wifi-iot/app/my_first_app/BUILD.gn,并完如下配置。
static_library("myapp")?{
????sources?=?[
????????"hello_world.c"
????]
????include_dirs?=?[
????????"http://utils/native/liteos/include"
????]
}
static_library中指定業(yè)務(wù)模塊的編譯結(jié)果,為靜態(tài)庫文件libmyapp.a,開發(fā)者根據(jù)實際情況完成填寫。 sources中指定靜態(tài)庫.a所依賴的.c文件及其路徑,若路徑中包含"http://"則表示絕對路徑(此處為代碼根路徑),若不包含"http://"則表示相對路徑。 include_dirs中指定source所需要依賴的.h文件路徑。
4.編寫模塊BUILD.gn文件,指定需參與構(gòu)建的特性模塊。
配置./applications/sample/wifi-iot/app/BUILD.gn文件,在features字段中增加索引,使目標(biāo)模塊參與編譯。features字段指定業(yè)務(wù)模塊的路徑和目標(biāo),以my_first_app舉例,features字段配置如下。
import("http://build/lite/config/component/lite_component.gni")
lite_component("app")?{
????features?=?[
????????"my_first_app:myapp",
????]
}
my_first_app是相對路徑,指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn。 myapp是目標(biāo),指向./applications/sample/wifi-iot/app/my_first_app/BUILD.gn中的static_library("myapp")。
調(diào)測驗證
目前調(diào)試驗證的方法有兩種,分別為通過printf打印日志、通過asm文件定位panic問題,開發(fā)者可以根據(jù)具體業(yè)務(wù)情況選擇。
由于本示例業(yè)務(wù)簡單,采用printf打印日志的調(diào)試方式即可。下面開始介紹這兩種調(diào)試手段的使用方法。
printf打印
代碼中增加printf維測,信息會直接打印到串口上。開發(fā)者可在業(yè)務(wù)關(guān)鍵路徑或業(yè)務(wù)異常位置增加日志打印,如下所示。
void?HelloWorld(void)
{
????printf("[DEMO]?Hello?world.\n");
}
根據(jù)asm文件進(jìn)行問題定位
系統(tǒng)異常退出時,會在串口上打印異常退出原因調(diào)用棧信息,如下文所示。通過解析異常棧信息可以定位異常位置。
=======KERNEL?PANIC=======
**********************Call?Stack*********************
Call?Stack?0?--?4860d8?addr:f784c
Call?Stack?1?--?47b2b2?addr:f788c
Call?Stack?2?--?3e562c?addr:f789c
Call?Stack?3?--?4101de?addr:f78ac
Call?Stack?4?--?3e5f32?addr:f78cc
Call?Stack?5?--?3f78c0?addr:f78ec
Call?Stack?6?--?3f5e24?addr:f78fc
********************Call?Stack?end*******************
為解析上述調(diào)用棧信息,需要使用到Hi3861_wifiiot_app.asm文件,該文件記錄了代碼中函數(shù)在Flash上的符號地址以及反匯編信息。asm文件會隨版本大包一同構(gòu)建輸出,存放在./out/wifiiot/路徑下。
1.將調(diào)用棧CallStack信息保存到txt文檔中,以便于編輯。(可選)
2.打開asm文件,并搜索CallStack中的地址,列出對應(yīng)的函數(shù)名 信息。通常只需找出前幾個棧信息對應(yīng)的函數(shù),就可明確異常代碼方向。
Call?Stack?0?--?4860d8?addr:f784c?--?WadRecvCB
Call?Stack?1?--?47b2b2?addr:f788c?--?wal_sdp_process_rx_data
Call?Stack?2?--?3e562c?addr:f789c
Call?Stack?3?--?4101de?addr:f78ac
Call?Stack?4?--?3e5f32?addr:f78cc
Call?Stack?5?--?3f78c0?addr:f78ec
Call?Stack?6?--?3f5e24?addr:f78fc
3.根據(jù)以上調(diào)用棧信息,可以定位WadRecvCB函數(shù)中出現(xiàn)了異常。
4.完成代碼排查及修改。
運行結(jié)果
示例代碼編譯、燒錄、運行、調(diào)測后,會顯示如下結(jié)果
ready?to?OS?start
FileSystem?mount?ok.
wifi?init?success!
[DEMO]?Hello?world.