(目錄)
OpenHarmony快速入門
Hello World
編寫Hello World程式
- 參考:【鴻蒙2.0裝置開發教程】小熊派HarmonyOS 鴻蒙·季 開發教程_哔哩哔哩_bilibili
添加Hello World源碼檔案
下載下傳源碼的方法可參考梅科爾工作室-#14天鴻蒙裝置開發實戰#環境搭建筆記-開源基礎軟體社群-51CTO.COM,部署環境->簡易步驟中的在Ubuntu上擷取源碼相應步驟,此處使用其中的第一種方法,将代碼下載下傳到
code3
中。
- 将Ubuntu的檔案遠端映射到Windows檔案夾中後,将下載下傳的源碼檔案使用VS Code打開(直接拖到VS Code就可以)
-
新增my_app檔案夾
在./applications/BearPi/BearPi-HM_Nano/sample路徑下建立一個my_app目錄,用于存放業務源碼檔案
-
新增hello_world.c檔案
在./applications/BearPi/BearPi-HM_Nano/sample/my_app路徑下建立一個hello_world.c檔案,該檔案為業務源碼檔案。
-
新增BUILD.gn檔案
在./applications/BearPi/BearPi-HM_Nano/sample/my_app路徑下建立一個BUILD.gn檔案,該檔案為業務源碼編譯腳本。
編寫Hello World業務代碼
在hello_world.c中建立業務入口函數Hello_World,并實作業務邏輯。并在代碼最下方,使用HarmonyOS啟動恢複子產品接口APP_FEATURE_INIT()啟動業務。(printf定義在stdio.h檔案中,APP_FEATURE_INIT定義在ohos_init.h檔案中)
源碼如下:
#include <stdio.h> // 引入頭檔案
#include "ohos_init.h" // 引入頭檔案
// <>和""尋找路徑不一樣,<>從系統庫開始查找,""從使用者目錄開始找,若未找到才到系統庫中去查找
void Hello_World(void)
{
printf("Hello World!\r\n"); // 列印,\r是回車,\n是換行
}
APP_FEATURE_INIT(Hello_World); // app函數入口,啟動Hello_World
編寫編譯建構檔案BUILD.gn
在./applications/BearPi/BearPi-HM/sample/my_app下的BUILD.gn檔案中添加如下代碼。
# static_library中指定業務子產品的編譯結果,為靜态庫檔案libmyapp.a,開發者根據實際情況完成填寫。
static_library("myapp") { # 此處參數填xxx,靜态庫檔案就是libxxx.a
# sources中指定靜态庫.a所依賴的.c檔案及其路徑,若路徑中包含"//"則表示絕對路徑(此處為代碼根路徑),若不包含"//"則表示相對路徑。
sources = [
"hello_world.c"
]
# include_dirs中指定source所需要依賴的.h檔案路徑。
include_dirs = [
"//utils/native/lite/include" # ohos_init.h
]
}
- static_library中指定業務子產品的編譯結果,為靜态庫檔案libmyapp.a,開發者根據實際情況完成填寫。
- sources中指定靜态庫.a所依賴的.c檔案及其路徑,若路徑中包含"//"則表示絕對路徑(此處為代碼根路徑),若不包含"//" 則表示相對路徑。
- include_dirs中指定source所需要依賴的.h檔案路徑。
編寫子產品BUILD.gn檔案,指定需參與建構的特性子產品。
在./applications/BearPi/BearPi-HM/sample下的BUILD.gn檔案中添加如下代碼(可以将features中原有的子產品注釋掉,添加上
"my_app:myapp",
)
import("//build/lite/config/component/lite_component.gni")
lite_component("app") {
features = [
# 指定需參與建構的特性子產品
"my_app:myapp",
]
}
- my_app是相對路徑,指向./applications/BearPi/BearPi-HM/sample/my_app/BUILD.gn。
- myapp是目标,指向./applications/BearPi/BearPi-HM/sample/my_app/BUILD.gn中的static_library("myapp")。
編譯燒錄Hello World程式
- 首先打開MobaXterm工具,登入伺服器後,進入源碼目錄code3下
- 輸入
,開始編譯源碼,如果出現hpm dist
字樣,說明編譯成功BUILD SUCCESS
- 使用HiBurn工具燒錄源碼(先将電腦與開發闆連接配接起來,通過
檢視端口)裝置管理器->端口
- COM:端口的選擇要和裝置管理器中顯示的端口一緻
- 波特率選擇921600,左上角setting->Com setting->Baud
- Select File:燒錄檔案選擇剛才生成的bin檔案(\home\bearpi\code\code3\out\BearPi-HM_Nano路徑下Hi3861_wifiiot_app_allinone.bin)
- Auto burn:前面打勾
- 點選Connect,下方顯示Connecting...時,再按一下開發闆複位按鍵,此時Connect按鈕變成Disconnect
- 等待燒錄,燒錄成功後,下方重新顯示Connecting...(如果再按複位按鍵,代碼又會重新燒錄),此時點選Disconnect,Disconnect按鈕又變回Connect
- 使用MobaXterm中的序列槽工具檢視日志
- 左上角->Session->Serial
- Serial port:選擇端口号,與裝置管理器中顯示的端口一緻
- Speed(bps):波特率設定為115200
- 點選OK
- 再次點選開發闆複位按鍵,日志就會被列印出來,可以看到列印出來Hello World!
點亮LED燈
- 參考:【鴻蒙2.0裝置開發教程】小熊派HarmonyOS 鴻蒙·季 開發教程_哔哩哔哩_bilibili
如何編寫點亮LED燈程式
添加點亮LED燈源碼檔案
-
新增my_led檔案夾
在./applications/BearPi/BearPi-HM_Nano/sample路徑下建立一個my_led目錄,用于存放業務源碼檔案。
-
新增led_example.c檔案
在./applications/BearPi/BearPi-HM_Nano/sample/my_led路徑下建立一個led_example.c檔案,該檔案為業務源碼檔案。
-
新增BUILD.gn檔案
在./applications/BearPi/BearPi-HM_Nano/sample/my_led路徑下建立一個BUILD.gn檔案,該檔案為業務源碼編譯腳本。
編寫點亮LED燈業務代碼
在led_example.c中建立業務入口函數led_example,并實作業務邏輯。并在代碼最下方,使用HarmonyOS啟動恢複子產品接口APP_FEATURE_INIT()啟動業務。
源碼如下:
#include "ohos_init.h" // 引入頭檔案
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
void led_example(void)
{
GpioInit(); // 初始化Gpio
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO); // 設定管腳複用功能,第一個參數是LED燈接在晶片上的引腳号,第二個參數将該GPIO設定為普通GPIO
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT); // 設定WIFI_IOT_IO_NAME_GPIO_2為輸出模式
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 1); // 設定WIFI_IOT_IO_NAME_GPIO_2的高低電平,1為高電平,0為低電平
}
APP_FEATURE_INIT(led_example); // app函數入口,啟動led_example
編寫編譯建構檔案BUILD.gn
在./applications/BearPi/BearPi-HM/sample/my_led下的BUILD.gn檔案中添加如下代碼。
# static_library中指定業務子產品的編譯結果,為靜态庫檔案libmyled.a,開發者根據實際情況完成填寫。
static_library("myled") { # 此處參數填xxx,靜态庫檔案就是libxxx.a
# sources中指定靜态庫.a所依賴的.c檔案及其路徑,若路徑中包含"//"則表示絕對路徑(此處為代碼根路徑),若不包含"//"則表示相對路徑。
sources = [
"led_example.c"
]
# include_dirs中指定source所需要依賴的.h檔案路徑。
include_dirs = [
"//utils/native/lite/include", # ohos_init.h
"//base/iot_hardware/interfaces/kits/wifiiot_lite" # "wifiiot_gpio.h"與"wifiiot_gpio_ex.h"
]
}
- static_library中指定業務子產品的編譯結果,為靜态庫檔案libmyled.a,開發者根據實際情況完成填寫。
- sources中指定靜态庫.a所依賴的.c檔案及其路徑,若路徑中包含"//"則表示絕對路徑(此處為代碼根路徑),若不包含"//" 則表示相對路徑。
- include_dirs中指定source所需要依賴的.h檔案路徑。
編寫子產品BUILD.gn檔案,指定需參與建構的特性子產品。
在./applications/BearPi/BearPi-HM/sample下的BUILD.gn檔案中添加如下代碼(可以将features中原有的子產品注釋掉,添加上
"my_app:myapp",
)
如何編譯燒錄點亮LED燈程式
- 首先打開MobaXterm工具,登入伺服器後,進入源碼目錄code3下
- 輸入
,開始編譯源碼,如果出現hpm dist
字樣,說明編譯成功BUILD SUCCESS
- 使用HiBurn工具燒錄源碼(先将電腦與開發闆連接配接起來,通過
檢視端口)裝置管理器->端口
- COM:端口的選擇要和裝置管理器中顯示的端口一緻
- 波特率選擇921600,左上角setting->Com setting->Baud
- Select File:燒錄檔案選擇剛才生成的bin檔案(\home\bearpi\code\code3\out\BearPi-HM_Nano路徑下Hi3861_wifiiot_app_allinone.bin)
- Auto burn:前面打勾
- 點選Connect,下方顯示Connecting...時,再按一下開發闆複位按鍵,此時Connect按鈕變成Disconnect
- 等待燒錄,燒錄成功後,下方重新顯示Connecting...(如果再按複位按鍵,代碼又會重新燒錄),此時點選Disconnect,Disconnect按鈕又變回Connect
- 點選複位按鍵,LED燈被點亮
更改源代碼,LED燈閃爍
更改LED燈源碼檔案
- 首先添加unistd.h頭檔案,需要使用其中的usleep函數,之後在for循環中使用,實作LED閃爍
#include "ohos_init.h" // 引入頭檔案
#include "unistd.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
void led_example(void)
{
GpioInit(); // 初始化Gpio
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO); // 設定管腳複用功能,第一個參數是LED燈接在晶片上的引腳号,第二個參數将該GPIO設定為普通GPIO
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT); // 設定WIFI_IOT_IO_NAME_GPIO_2為輸出模式
// LED燈閃爍10次
for (int i = 0; i < 10; i++)
{
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 1); // 設定WIFI_IOT_IO_NAME_GPIO_2的高低電平,1為高電平,0為低電平
usleep(1000000); // 延時1000000微秒
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 0); // 設定WIFI_IOT_IO_NAME_GPIO_2的高低電平,0為高電平,0為低電平
usleep(1000000); // 延時1000000微秒
}
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 1); // 設定WIFI_IOT_IO_NAME_GPIO_2的高低電平,1為高電平,0為低電平
}
APP_FEATURE_INIT(led_example); // app函數入口,啟動led_example
**疑惑:**新增了unistd.h頭檔案,沒有在BUILD.gn中添加新依賴的.h檔案路徑,但是沒有報錯
重新燒錄
- 點選Connect,下方顯示Connecting...時,再按一下開發闆複位按鍵,此時Connect按鈕變成Disconnect
- 等待燒錄,燒錄成功後,下方重新顯示Connecting...(如果再按複位按鍵,代碼又會重新燒錄),此時點選Disconnect,Disconnect按鈕又變回Connect
- 點選複位按鍵,LED燈閃爍10次後常亮
HarmonyOS編譯架構介紹
- 參考:【鴻蒙2.0裝置開發教程】小熊派HarmonyOS 鴻蒙·季 開發教程_哔哩哔哩_bilibili
ninja編譯工具
簡介
在Unix/Linux下通常使用Makefile來控制代碼的編譯,但是Makefile對于比較大的項目有時候會比較慢,代碼在編譯都變成了程式員放松的借口了。是以這個Google的程式員在開發Chrome的時候因為忍受不了Makefile的速度,自己重新開發出來一套新的控制編譯的工具叫作Ninja,Ninja相對于Makefile這套工具更注重于編譯速度。除了Chrome現在還有一些其他的比較大的項目也在開始使用Ninja。
如何編譯子產品
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIzIjNfhGLwIDOfdHLlpXazVmcvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iY5gTYykzM3EWO2MWZzUWM4EzN1E2NyImN4gDNxUjM4YDZ0EDN28CX3AjMyAjMvw1cldWYtl2Lc12bj5yb0NWM14ycvlnbv1mchhWLsR2Lc9CX6MHc0RHaiojIsJye.png)
代碼運作邏輯
初始化入口是位于vendor\hisi\hi3861\hi3861\app\wifiiot_app\src路徑下的app_main.c,入口函數是app.main,最後執行
HOS_SystemInit();
,這個函數裡面又封裝了幾個函數,其中如果沒有函數
SYS_INIT(service);
則不會出現相應的結果。
HarmonyOS CMSIS-RTOS2接口簡介
參考:【鴻蒙2.0裝置開發教程】小熊派HarmonyOS 鴻蒙·季 開發教程_哔哩哔哩_bilibili
什麼是CMSIS-RTOS2接口
CMSIS-RTOS2接口簡介
CMSIS是Cortex微控制器軟體接口标準(Cortex Microcontroller Software Interface Standard)是ARM和一些編譯器廠家以及半導體廠家共同遵循的一套标準,是由ARM專門針對Cortex-M系列提出的标準。在該标準的約定下,ARM和晶片廠商會提供一些通用的API接口來通路Cortex核心以及一些專用外設,以減少更換晶片以及開發工具等移植工作所帶來的金錢以及時間上的消耗。
CMSIS-RTOS2(CMSIS-RTOS API Version 2)是Arm® Cortex®-M 處理器的通用的RTOS接口。為需要RTOS功能的軟體元件提供了标準化的API。
CMSIS-RTOS2是一個通用的API,它與底層的RTOS核心無關,寫應用程式的程式員在使用者代碼中調用CMSIS-RTOS2 API函數,可以更友善地将應用程式從一個RTOS到另一個RTOS,使用CMSIS-RTOS2 API的中間件也可以避免很多不必要的移植工作。
鴻蒙是如何封裝CMSIS-RTOS2接口
鴻蒙與CMSIS-RTOS2接口聯系
鴻蒙在CMSIS-RTOS2接口中封裝了LiteOS-m的核心代碼
路徑位于
kernel\liteos_m\components\cmsis\2.0\cmsis_liteos2.c
上層應用或中間件如果要使用LiteOS-m核心,需要通過調用CMSIS-RTOS API 2.0的接口,之後實作核心的一些功能調用
如何使用CMSIS-RTOS2接口
如何使用CMSIS-RTOS2接口
- 在業務代碼中包含"cmsis_os2.h"
- 通過調用“cmsis_os2.h”中的API函數使用系統相關功能
梅科爾工作室-#14天鴻蒙裝置開發實戰#快速入門筆記OpenHarmony快速入門
更多API介紹可參考:Main Page (arm-software.github.io),以後用到相關接口可在此網站檢視
感悟
前面hello world程式與led程式都不是太難,但是在HarmonyOS編譯架構介紹這些比較底層的地方聽迷糊了,感覺函數之間層層嵌套,不好把握,可能本身就比較晦澀難懂,不過有些地方對我這個初學者來說并不準備深入探究,否則會占用太多的時間,以後更加熟悉之後再進行二刷,效果會更好,現在隻需要了解其中的大緻流程就可以了,後面如果用到再回頭來看。話不多說,繼續肝。