学习 C 语言,C++ 语言,数据结构和算法,操作系统,网络,驱动,设计模式等知识用鸿蒙来强化就太对了。本文教你一步一步搭建鸿蒙的开发和运行环境,有点啰嗦,适合小白。

本文所涉及的所有工具都可以在这里找到:
https://pan.baidu.com/s/1HL835nX2JAWsL0DNOnNIFg
(提取码pbe2)
具体有下列步骤:
组装开发板
连接开发板
安装串口驱动
安装 USB 驱动
安装烧录工具
擦除引导程序
烧录系统
登录开发板
修改 OS 启动地址
运行可执行程序
安装 VMWARE
安装编译服务器
访问编译服务器
编译鸿蒙产品
编译鸿蒙组件
打通开发板网络
部署 NFS
新增自定义组件
01
组装开发板
https://www.bilibili.com/video/BV18r4y1F7Lx?from=search&seid=16503504888266711974
02
连接开发板


03
安装串口驱动
请双击 USB-to-Serial Comm Port.exe。进行串口驱动安装,安装完成后。在设备管理器中应该能看到下面这样的 COM 接口,你的 COM 接口编号可能有所不同。表明串口驱动安装成功。

04
安装 USB 驱动
然后双击 zadig-2.5.exe 安装通用 USB 驱动,点击中间的 Install。

05
安装烧录工具
直接解压 HiTool-HM-5.4.9-win32-x86_64.zip 文件。然后双击其中的 HiTool.exe. 界面如下图。然后先将芯片切换到 3518ev300。

06
擦除引导程序
然后就是擦除 uboot 了,记得使用串口来擦除。

由于编译服务器还没有创建,所以我把自己编译好的文件放网上了,你可以下载。
文件路径根据你自己的实际路径,下载下来后存放的位置。
COM 口根据你之前设备管理器看到的那个 CH340 口选择。
确保顶部选中的芯片是 3518ev300。
传输方式选择串口。
按分区烧写。
器件类型 spi nor。
开始地址 0,长度 1M。
点击擦除后 10 秒内拔插 usb 电源线接口(即接 4 个针脚的那个 usb 口,小的那个 usb 头),让板子重启。

07
烧录系统

使用 usb 口烧录(不是串口)。
现在需要烧录 4 个文件(通过右侧绿色+可以添加文件)。
每个文件的名称,器件类型,地址,长度要填写正确。
最后点击烧写。

08
登录开发板
鸿蒙系统烧录好以后,就可以进去看一下鸿蒙系统的模样了。双击 MobaXterm_Personal_20.2.exe. 也可以用你自己喜欢的终端工具。然后点击 Session,在弹出的窗口中填好相关字段。

点击 OK 以后,会进入下面这个界面:

09
设置 OS 启动地址
setenv bootcmd "sf probe 0;sf read 0x40000000 0x100000 0x600000;go 0x40000000";
setenv bootargs "console=ttyAMA0,115200n8 root=flash fstype=jffs2 rw rootaddr=7M rootsize=8M";
保存配置:
saveenv
然后重启:

然后,很快就可以看到鸿蒙 OS 起来了。

10
运行可执行程序
进入 bin 目录,运行 writer 程序(这个程序是我新增的,如果你的开发板上没有,你可以运行 ./camera_app 程序)。

11
创建编译服务器
为了省去搭建编译环境的繁琐,本次将一个已经搭建好的编译服务器制作成镜像。我们只需要使用这个镜像即可获得编译环境。
镜像文件比较大(超过 8G),请直接找老师获取,也可以去前言提到的地方下载(建议晚上睡觉时下载)。
本次使用的 Ubuntu 是不带桌面环境的。内部已经安装好 HarmonyOS 的编译环境,并且安装了 samba 文件共享工具,方便 windows 访问。
请先安装 VMWARE WorkStation 软件,然后打开它, 选择文件→打开。


12
访问服务器
服务器创建完成后。然后我们对它进行上电启动:

当屏幕输出变慢后,我们就可以访问它了,当然也可以在黑窗口里面直接键入各种命令,不过不方便。

我们需要如下2种方法来访问虚拟机:
通过 ssh 访问,即可以远程登录虚拟机的 shell,并执行命令。
通过文件共享访问,可以在 windows 上查看和修改虚拟机中的文件。
注意:
当前创建的虚拟机采用的是桥接模式,它的 IP 地址为 192.168.2.20。你需要确保虚拟机中的 IP 地址和自己 PC 的 IP 地址在同一个网段。
最简单的方法是在自己的网卡上添加一个 192.168.2.X 网段的 IP 地址。Windows 添加 IP 地址的方法请自行查阅。
如果多台编译服务器在同一个局域网络,那么 IP 地址会冲突,因为都是 192.168.2.20。所以,需要对地址进行修改。
13
SSH 访问

点击 OK 以后,就登录到了编译服务器的 shell。

14
文件共享访问
为了从 Windows 访问编译服务器上的源代码和编译出的目标文件,在编译服务器上已经安装好了 samba 文件共享服务,只需要在 windows 这边映射网络驱动器即可,按如下方法操作。

右键点击计算机,选择映射网络驱动器。

15
编译产品
整个工程是存放在 ~/harmonyos/openharmony 目录,得先进入这个目录,然后执行 python 脚本来编译产品。
如下红色框即编译整个产品:

特别提醒:
python build.py ipcamera_hi3518ev300 -b debug
大约需要 10 多分钟完成产品编译,编译成功后,结果如下:

然后在 windows 文件夹下可以看到编译出来的结果:

每次系统烧录时,将上述 3 个文件以及 uboot 文件:
(Z:\vendor\hisi\hi35xx\hi3518ev300\uboot\out\boot\u-boot-hi3518ev300.bin)
16
更新源码
鸿蒙系统目前更新比较频繁,如果需要获取最新版本,请执行下面的命令更新源码。
然后再执行下面 2 条命令:
cd ~/harmonyos/openharmony
repo sync -c
17
编译组件
编译完整产品比较耗时,大多数时候我们修改的代码较少,只需要编译指定的组件就行了。
由 -T 指定编译一个已经存在的组件,只编译一个小组件,速度飞快。

文本编辑器(如 notepad++)打开 build/lite/product/ ipcamera_hi3518ev300.json 文件:

这个组件涉及的代码文件是哪些呢,继续看对应目录的 BUILD.gn 文件,对于此例子为 applications/sample/camera/app:

生成的程序在下面这个目录:

18
打通网络
设备本身没有以太口,只有 wifi 接口。但默认情况下 wifi 是无法工作的。输入 ifconfig 你会看到 wlan0 接口 IP 地址为 0。

配置 SSID 和密码
修改 wpa_sample.c 源码
配置自启动
编译系统
19
配置 SSID 和密码
修改:
applications\sample\camera\communication\wpa_supplicant\config\ wpa_supplicant.conf
修改后的内容如下。这个文件的目的是配置 wifi 用户名和密码:
country=GB
ctrl_interface=udp
network={
ssid="teacher"
psk="12345678qwe"
}
= 号 2 端不要留空格。
ssid 和 psk 按你自己的实际进行配置,比如你手机热点的网络名和密码。
20
修改源码
修改 applications\sample\camera\communication\wpa_supplicant\src\wpa_sample.c 源代码。
只修改 main 函数部分。这个程序的目的是读取 wifi 用户名和密码配置文件,并进行 wifi 连接。
int main(int argc, char *argv[])
{
g_wpaArgc = argc;
for (int i = 0; i < g_wpaArgc; i++) {
g_wpaArg[i] = argv[i];
}
g_wpaArgc=5;
g_wpaArg[1] = "-i";
g_wpaArg[2]="wlan0";
g_wpaArg[3]="-c";
g_wpaArg[4]="/etc/wpa_supplicant.conf";
int ret = pthread_create(&g_wpaThread, NULL, ThreadMain, NULL);
if (ret != 0) {
printf("[WpaSample]create thread failed error:%s.\n", strerror(ret));
return 1;
}
pthread_join(g_wpaThread, NULL);
return 0;
}
21
配置自启动
刚才修改的 main 会生成一个可执行程序,这个程序我们需要把它配置在启动脚本中,这样每次板子重启都会运行这个程序。
修改文件 vendor\huawei\camera\init_configs\ init_liteos_a_3518ev300.cfg ,红色部分为新增:
{
"jobs" : [{
"name" : "pre-init",
"cmds" : [
"mkdir /storage/data/log",
"chmod 0755 /storage/data/log",
"chown 4 4 /storage/data/log",
"mkdir /storage/data/softbus",
"chmod 0700 /storage/data/softbus",
"chown 7 7 /storage/data/softbus",
"mkdir /sdcard",
"chmod 0777 /sdcard",
"mount vfat /dev/mmcblk0 /sdcard rw,umask=000",
"mount vfat /dev/mmcblk1 /sdcard rw,umask=000"
]
}, {
"name" : "init",
"cmds" : [
"start shell",
"start apphilogcat",
"start foundation",
"start bundle_daemon",
"start media_server",
"start appspawn",
"start wpa_supplicant"
]
}, {
"name" : "post-init",
"cmds" : [
"chown 0 99 /dev/dev_mgr",
"chown 0 99 /dev/hdfwifi",
"chown 0 99 /dev/gpio",
"chown 0 99 /dev/i2c-0",
"chown 0 99 /dev/i2c-1",
"chown 0 99 /dev/i2c-2",
"chown 0 99 /dev/uartdev-0",
"chown 0 99 /dev/uartdev-1",
"chown 0 99 /dev/uartdev-2",
"chown 0 99 /dev/spidev0.0",
"chown 0 99 /dev/spidev1.0",
"chown 0 99 /dev/spidev1.1"
]
}
],
"services" : [{
"name" : "foundation",
"path" : "/bin/foundation",
"uid" : 7,
"gid" : 7,
"once" : 0,
"importance" : 1,
"caps" : [10, 11, 12, 13]
}, {
"name" : "shell",
"path" : "/bin/shell",
"uid" : 2,
"gid" : 2,
"once" : 0,
"importance" : 0,
"caps" : [4294967295]
}, {
"name" : "appspawn",
"path" : "/bin/appspawn",
"uid" : 1,
"gid" : 1,
"once" : 0,
"importance" : 0,
"caps" : [2, 6, 7, 8, 23]
}, {
"name" : "apphilogcat",
"path" : "/bin/apphilogcat",
"uid" : 4,
"gid" : 4,
"once" : 1,
"importance" : 0,
"caps" : []
}, {
"name" : "media_server",
"path" : "/bin/media_server",
"uid" : 5,
"gid" : 5,
"once" : 1,
"importance" : 0,
"caps" : []
}, {
"name" : "wms_server",
"path" : "/bin/wms_server",
"uid" : 6,
"gid" : 6,
"once" : 1,
"importance" : 0,
"caps" : []
}, {
"name" : "bundle_daemon",
"path" : "/bin/bundle_daemon",
"uid" : 8,
"gid" : 8,
"once" : 0,
"importance" : 0,
"caps" : [0, 1]
},{
"name": "wpa_supplicant",
"path": "/bin/wpa_supplicant",
"uid" : 0,
"gid" : 0,
"once" : 1,
"importance" : 0,
"caps": []
}
]
}
22
编译系统
此时我们配置好了 wifi 用户名和密码,也修改了 wifi 启动程序并设置好了启动脚本。接下来我们把这些修改编译到系统中,然后再烧录到板子上。
当完整编译系统,烧录好以后,新版本的系统起来以后,我们可以看到 wlan0 的接口的 IP 地址正常获取到了。

23
部署 NFS
当网络打通以后,我们就可以部署 NFS(网络文件系统)了。部署 NFS 最大的好处是,可以将 windows 的某个文件夹当成开发板上的文件夹来使用,这样,不需要把编译的程序手动拷贝到开发板去,就可以执行编译出来的程序。
主要分为如下 3 个过程:
安装 NFS Server
配置和启动 Server
挂载 NFS
24
安装 NFS
在 PC 上安装 NFS 服务器。双击 nfs1169.exe 进行安装,同常规软件安装方法。
25
配置 NFS
安装好以后,就是配置了,这一步稍微麻烦。首先需要以管理员身份运行 NFS 服务器。
开始→所有程序→haneWIN 软件→NFS→NFS 服务器(右键点击)--选择(以管理员身份运行)。

编辑输出表文件,如下:

然后保存,然后我们配置防火墙,使得 NFS 相关的网络通信畅通。先看需要放行哪些端口。

需要放行的端口有: 111, 1058, 2049。TCP 和 UDP 都需要。然后我们配置放行这些端口(即允许这些端口的流量通过)。
控制面板\系统和安全\Windows 防火墙:





确保规则已配置好。然后重启防火墙(关闭防火墙,再打开防火墙)。

26
重启 NFS
开始---所有程序---haneWIN 软件---NFS---重启所有服务(以管理员身份运行)
27
挂载 NFS
在开发板 shell 界面,挂载 NFS。
先确保开发板和 PC 之间能互通(可以从 PC ping 开发板)。我的开发板和 PC 都通过 wifi 连接手机热点,所以在一个网段,能互相 ping 通。然后开发板上面执行下面的命令。

然后我们就可以执行 windows 上的程序了。

上述这些内容,是通过从编译服务器拷贝出来的。如何拷贝,请参阅访问虚拟机章节。
28
添加组件
如果我们要新增程序怎么处理。请仿照范例中的 camer_app 处理。具体如下,比如我新增了一个 reader 程序,一个 writer 程序。以下描述 reader 的添加逻辑。
在 applications\sample\camera 目录下,将 app 目录复制一份,改名为 reader:

然后修改 reader 里面的文件。先修改 BUILD.gn:

然后源码根据自己的实际情况修改。最后修改编译脚本 build\lite\product\ ipcamera_hi3518ev300.json。添加红框中的一行,然后按组件编译方式编译就可以了。


专注开源技术,共建鸿蒙生态

点“阅读原文”了解更多






