<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          嘗鮮!我在華為鴻蒙上編寫的第一個 Hello World!那些說鴻蒙是PPT的可以閉嘴了!

          共 3089字,需瀏覽 7分鐘

           ·

          2020-09-16 06:49


          作者:阿拉蕾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.
          瀏覽 101
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产成人 亚洲 欧洲在线 | 午夜影院操| 国产无码动漫一区 | 亚洲自拍无码 | 免费精品黄色网页 |