简介

前几天刚刚收到极术社区发放的XR806开发板,先来拍个美图~

众所周知,这个开发板的最大特点是WiFi/BLE两大无线协议一片配齐。得益于OpenHarmony的加持,在上面搭建复杂应用是个相对轻松的工作。不信?下面我们就来跑一跑XR806的自带demo。

注:本文主要参考了全志在线的XR806文档,很多问题都可以在这里找到答案。

准备工作

以下主要介绍的是在WSL 1(Ubuntu 20.04)下编译XR806所需的准备工作,如果是在Linux系统下直接安装,建议参考官方文档。

代码下载

首先我们需要准备好repo。这里推荐使用全志的版本,好处是服务器比较稳定,一般都能顺利下载,不过需要事先注册一下全志客户服务平台的账号,并且需要添加公钥才行,具体的下载和安装方式可以参考源码下载 - D1。最后记得把repo移到指定位置,或是至少添加到PATH变量中。

接下来我们尝试拉取SDK相关的代码。由于SDK存放于Gitee,因此需要在Gitee上也添加相同的公钥才能拉取代码,这个就不解释了。

注:在这一步中,需要保证当前的python版本是2.6或2.7。如果不是的话,可以通过apt安装python-is-python2,安装好后python就是Python 2.7了。

# 创建文件夹,名称和路径随意
mkdir sdk
cd sdk
# 初始化
repo init -u ssh://git@gitee.com/openharmony-sig/manifest.git -b OpenHarmony_1.0.1_release --no-repo-verify -m devboard_xr806.xml
# 拉取代码
repo sync -c
# 下载通过LFS存储的二进制文件,需要提前通过`apt`安装`git-lfs`
repo forall -c 'git lfs pull'

上面一通操作完后,所有编译需要的代码应该静静地躺在应有的位置了。

环境配置

环境配置的话,推荐看看获取源码及Ubuntu编译环境准备,但有几个地方需要注意:

  1. 在后续编译的过程中需要使用Python 3(主要是hb),因此设置python软链接的这一步是必须的,而这一步会导致repo使用的Python版本有误,如果后续需要拉取代码的话,记得重新设置一下软链接到python2
  2. LLVM不需要下载和安装,这里使用的是gcc。在固件编译 - XR806中,会提到如何配置编译工具链,这里不再赘述。
  3. SDK中的mkimage是32位程序,但是WSL 1默认并不支持32位程序。这里可以参考让win10的WSL子系统支持32bit程序,需要注意的是每次启动WSL都需要来一句sudo service binfmt-support start(如果提示error可以忽略)。

编译完全体demo

第一次编译

第一次编译我们选择了默认的demo,这里我们基本上直接照搬了固件编译 - XR806。

# 编译libSDK
cd device/xradio/xr806/xr_skylark
make PRJ=demo/wlan_ble_demo defconfig
make menuconfig
make lib -j
# 编译完整app
cd -
hb set
hb build -f

注:这一步make menuconfig必须要执行,否则会提示找不到device/xradio/xr806/liteos_m/SDKconfig.gni这个文件。

编译完成后,我们在device/xradio/xr806/xr_skylark/out文件夹下得到了名为xr_system.img的文件。之后参考固件烧录 - XR806即可。

这里我把第一次编译后得到的xr_system.img文件分享出来,大家可以自取:xr_system_default.img 。

demo内容探究

我们花了不少力气,终于把demo编译好了。那么,这个demo到底是个啥呢?其实答案都在xr806/adapter/console/src/command.c这个文件里面。

注:为啥会在这个文件夹呢?聪明如你,只要打开xr806/BUILD.gn这个文件,看到"adapter/console:app_console"这一行,应该就会有答案啦。

可以看到,这个demo实际上支持非常多的命令,足以涵盖XR806支持的大部分功能。这些命令又可以进一步被分为两大类,其中:

  • hm命令看起来是硬件相关的各种命令的集合,其中的iot子命令包括了gpiouart等大家喜闻乐见的功能。这些命令对应的源文件主要在xr806/adapter/console/src文件夹中。
  • 其它命令则更加侧重应用层的相关功能,特别是几乎无所不包的net命令。这些命令对应的源文件主要在xr806/xr_skylark/project/common/cmd文件夹中。

那么要怎么把demo玩起来呢?其实很简单,只要使用熟悉的串口工具,以115200 bps的波特率连接XR806的USB转串口(CP2102N),就可以通过类似于console的方式输入命令了。

注:如果使用PuTTY的话,推荐在连接时勾选Terminal的Implicit CR in every LF选项,这样可以避免回显字符换行不回车的尴尬。

如果你在使用XR806的官方开发板,那么就可以利用挂在PWM2上的LED实现最简单的blink(闪烁),只需要输入以下命令即可:

hm iot pwm init p=2
hm iot pwm start p=2 d=50 f=5

这些命令的使用方法推荐直接看源代码,因为有不少命令并没有给出完整的帮助文档,感觉这个可以在后续优化一下。

全功能demo编译

在阅读到xr806/adapter/console/src/command.c这个文件时,我们会注意到在#if PRJCONF_NET_EN下有一些开关,这些开关控制了一些命令是否编译。那么,如果我们把这些开关都打开,不就可以得到一个全功能的demo了吗?说干就干!

看起来,我们需要做的工作就是把这些开关都打开,然后重新编译即可。不过事情的发展一般都没有这么顺利,我们等下会遇到两个问题(剧透了哈)。

改好文件后,我们在device/xradio/xr806/xr_skylark文件夹下重新编译一下libSDK

make build_clean
make lib -j

看着似乎没问题对不对?不急,我们再回到sdk目录,开始进行二阶段编译:

hb build -f

这次编译看起来一切顺利,直到……最后遇到了这么一个编译错误:

[OHOS ERROR] /home/metro/tools/gcc-arm-none-eabi-10-2020-q4-major/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld: ../../../../lib/libnopoll.a(nopoll_conn.o): in function `__nopoll_conn_new_common':
[OHOS ERROR] /home/metro/xr806/sdk/device/xradio/xr806/xr_skylark/src/net/nopoll/src/nopoll_conn.c:927: undefined reference to `mbedtls_debug_set_threshold'
[OHOS ERROR] /home/metro/tools/gcc-arm-none-eabi-10-2020-q4-major/bin/../lib/gcc/arm-none-eabi/10.2.1/../../../../arm-none-eabi/bin/ld: ../../../../lib/libnopoll.a(nopoll_conn.o): in function `__nopoll_conn_accept_complete_common':
[OHOS ERROR] /home/metro/xr806/sdk/device/xradio/xr806/xr_skylark/src/net/nopoll/src/nopoll_conn.c:5047: undefined reference to `mbedtls_debug_set_threshold'
[OHOS ERROR] collect2: error: ld returned 1 exit status

这里提示找不到一个名为mbedtls_debug_set_threshold的函数。这个问题是怎么出现的呢?一通搜索之后,我们找到了这个函数,它是在xr806/xr_skylark/src/net/mbedtls-2.16.8/library/debug.c中被定义的,看起来功能非常简单:

static int debug_threshold = 0;void mbedtls_debug_set_threshold( int threshold )
{debug_threshold = threshold;
}

注:实际上mbedtls_debug_set_threshold这个函数在多个文件中被定义了,但是实际使用的是上述文件。为什么这么肯定呢?看了xr806/xr_skylark/src/net/Kconfig中关于MBEDTLS_VER的默认选项,懂得都懂。

这个函数看起来有被正确定义,那么为什么会找不到呢?抬头看上面的几行代码,发现有一行非常显眼的预编译指令:

#if defined(MBEDTLS_DEBUG_C)

啊哈,看来可能是这个宏没定义造成的(实际上在这里已经被VSCode的代码高亮实锤了)。问题看来是这样的:xr806/xr_skylark/src/net/nopoll/src/nopoll_conn.c这个文件使用了mbedtls_debug_set_threshold这个函数,但这个函数只在MBEDTLS_DEBUG_C被定义的情况下才可用,因此需要在某个地方打开这个宏(当然在相应文件删除掉这个函数的调用也是一种解决方法)。

但是,在尝试搜索MBEDTLS_DEBUG_C的时候,会发现在xr806/xr_skylark/include/net/mbedtls-2.16.8/mbedtls/configs文件夹中定义了很多不同的配置,显然最终只会取到其中一个配置。那么到底是谁才是最终使用到的头文件呢?最终我们在xr806/xr_skylark/src/net/mbedtls-2.16.8/Makefile中找到了答案:是xr806/xr_skylark/include/net/mbedtls-2.16.8/mbedtls/configs/config-xr-mini-cliserv.h这个文件。解决方案就很简单了:直接来到第113行,把//注释符干掉就行了。

解决了这个问题,我们开心地重新编译libSDK,然后回到sdk目录重新二次编译,然后就结……等下,怎么又一个错误呢?定睛一看,这回的问题看起来在打包上:

[OHOS ERROR] chmod 777 ../../../../../tools/mkimage && ../../../../../tools/mkimage  -c .image.cfg -o xr_system.img
[OHOS ERROR] err: bin 1 and bin 2 were overlaped!
[OHOS ERROR] Overlapped size: 3072 Byte(3kB)
[OHOS ERROR] bin 1 name:app.bin    begin: 0x00008000    end: 0x00018C00
[OHOS ERROR] bin 2 name:app_xip.bin    begin: 0x00018000
[OHOS ERROR]
[OHOS ERROR] We've rearranged bin files and generated new cfg file 'image_auto_cal.cfg', the new one is recommended.
[OHOS ERROR] Generate image file failed
[OHOS ERROR] cfg string:
[OHOS ERROR] /*
[OHOS ERROR]  *
[OHOS ERROR]  * Automatically generated file; DO NOT EDIT.
[OHOS ERROR]  * XR806 SDK Configuration
[OHOS ERROR]  *
[OHOS ERROR]  */
[OHOS ERROR] {
[OHOS ERROR]     "magic" : "AWIH",
[OHOS ERROR]     "version" : "0.5",
[OHOS ERROR]  "OTA" : {"addr": "1536k", "size": "4K"},
[OHOS ERROR]     "image" : {"max_size": "1532k"},
[OHOS ERROR]     "section" :[
[OHOS ERROR]   {"id": "0xa5ff5a00", "bin" :"boot_40M.bin", "cert": "null", "flash_offs": "0K", "sram_offs": "0x00230000", "ep": "0x00230101", "attr":"0x1"},
[OHOS ERROR]   {"id": "0xa5fe5a01", "bin" :"app.bin", "cert": "null", "flash_offs": "32K", "sram_offs": "0x00201000", "ep": "0x00201101", "attr":"0x1"},
[OHOS ERROR]   {"id": "0xa5fd5a02", "bin" :"app_xip.bin", "cert": "null", "flash_offs": "96K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x2"},
[OHOS ERROR]   {"id": "0xa5fa5a05", "bin" :"wlan_bl.bin", "cert": "null", "flash_offs": "1070K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"},
[OHOS ERROR]   {"id": "0xa5f95a06", "bin" :"wlan_fw.bin", "cert": "null", "flash_offs": "1073K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"},
[OHOS ERROR]   {"id": "0xa5f85a07", "bin" :"sys_sdd_40M.bin", "cert": "null", "flash_offs": "1098K", "sram_offs": "0xffffffff", "ep": "0xffffffff", "attr":"0x1"},
[OHOS ERROR]   {}
[OHOS ERROR]  ]
[OHOS ERROR] }

看样子,这里虽然报错了,但是顺手就告诉了你问题所在和解决方案:其实就是app.bin这个文件太大,导致原来的分区装不下了,这边只要使用自动生成好的xr806/xr_skylark/project/demo/wlan_ble_demo/image/xr806/image_auto_cal.cfg文件,替换掉原有的xr806/xr_skylark/project/demo/wlan_ble_demo/image/xr806/image_wlan_ble.cfg就行啦。再来一次hb build -f,这回终于成!功!了!

这回生成的xr_system_full.img ,老规矩放在这边让读者自取,只要按照之前步骤直接刷机就可以啦。

demo完全体演示

这回我们挑个和WiFi有关的应用。首先,我们先让开发板通上网(也就是STA模式),这个只需要通过以下几行命令即可实现:

hm net sta enable
# hm net scan # 需要搜索周围热点时可使用
hm net sta connect <ssid> <psk> # <ssid>和<psk>替换成热点的SSID和密码

注:

  1. 关于hm net命令的用法,可以参考WiFi联网 - XR806,当然直接看代码也不错。
  2. 这里显然只能搜到2.4G的网络,如果实在没有可用热点的话,也可以使用AP模式,具体就不再赘述了,看上面的文档就好。

在运行后,我们可以得到如下log,说明已经成功分配了IP地址,正式连上网了:

...
======== Callback: connected
[net INF] IPv6 addr state change: 0x0 --> 0x1
[net INF] msg <>
[net INF] netif (IPv4) is up
[net INF] address: 192.168.31.156
[net INF] gateway: 192.168.31.1
[net INF] netmask: 255.255.255.0
[net INF] msg <network IPv6 state>

下一步我们来演示httpd,也就是HTTP服务器的应用。这个说来简单,如果已经把完全体demo刷进去,只需要执行下面一行命令即可。

net httpd 1

接下来,我们直接访问http://192.168.31.156,稍等片刻,接下来就是见证奇迹的时刻:

当然,这个demo里面还有非常多值得一试的功能,等待读者慢慢发掘。

总结

本文梳理了XR806的编译过程,并且通过不懈努力总算编译好了完全体demo,得到的回报是充分尝试了SDK支持的各种功能。如果还有后续文章的话,我想尝试一下这个移植好的shttpd,看看能不能在上面搭建更多有趣的应用。

原贴链接:https://bbs.aw-ol.com/topic/824/
全志在线开发者交流企鹅群(客服机器人24小时在线解答):498263967
资源获取、问题讨论可以到全志在线开发者社区进行:https://www.aw-ol.com/
全志及开发者最新动态可以关注全志在线微信公众号

在WSL上编译并运行全志XR806的完全体demo相关推荐

  1. macmini java,尽管在macBookPro上编译和运行完美,但Mac mini上的桥头问题编译项目仍然存在...

    我正在我的MBP上运行这个项目并且工作正常,从回购中拉出来甚至将整个项目复制到我的Mac mini时,图像中的错误就会发生 . 我确信它有效(验证正确添加桥接头并在目标的构建设置中设置适当的标志,因为 ...

  2. 在Linux手机上编译和运行2048游戏学习C++

    能运行原生Linux手机的系统至少有数千款,并且大部分都是旧款,也就是普通的备用机,拿来学习C++吧,愉快无比. 效果如下: 游戏中效果: 源码地址: plibither8/2048.cpp 介绍: ...

  3. mac上java文件如何编译_如何在Mac上用Java编译和运行程序?

    小编典典 在Mac OSX或任何主要操作系统上编译和运行Java应用程序非常容易.Apple随OSX一起提供了一个功能齐全的Java运行时和开发环境,因此您要做的就是编写Java程序并使用内置工具来编 ...

  4. 如何在Windows下使用Linux系统来编译和运行程序?

    很多开发人员都有这样的疑问:自己平时是在Windows下面办公的,而自己编写的程序的运行环境又是Linux的,如何从Windows切换到Linux呢?是不是要专门到Linux机器上去编写代码呢? 实际 ...

  5. Linux下开启openmp编译,OpenMP程序的编译和运行

    <OpenMP程序的编译和运行>由会员分享,可在线阅读,更多相关<OpenMP程序的编译和运行(13页珍藏版)>请在人人文库网上搜索. 1.SHANGHAI UNIVERSIT ...

  6. C语言通过Windows命令行编译和运行程序

    准备: 提前设置好环境变量 一份写好的C语言源代码 首先,需要找到自己使用编译器下的文件gcc(如果还没有自己的编译器,下方有链接) 通常位于所在储存编译器文件中的一个叫MinGW(后面可能带数字)的 ...

  7. scala 编译插件_使用Scala插件在Griffon应用程序中编译和运行Scala代码

    scala 编译插件 用于Griffon的Scala插件 0.7.1版本现已发布. 这个插件可以在Griffon应用程序上编译和运行Scala代码. Scala插件使用LangBridge插件与其他J ...

  8. 64位Linux上编译32位软件

    问题:我的软件是运行在32位环境下的,原来也是在CentOS 6.3 32位上编译,运行都是没有问题的: 最近CentOS 7出来了,但是只有x86_64的,我的任务就是将我的软件移植到64位的Cen ...

  9. 用scanline取BMP上某点的颜色,代码如下,为什么可以编译,运行时却出错呢?...

    用scanline取BMP上某点的颜色,代码如下,为什么可以编译,运行时却出错呢? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiM ...

最新文章

  1. 论 MySql InnoDB 如何通过插入意向锁控制并发插入
  2. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发
  3. C#中跨线程访问控件问题解决方案
  4. React Native 重新建项目遇到的一些问题
  5. 两向量点乘坐标运算_高三数学冲刺复习之向量小题的题型总结(含好用的补充公式)...
  6. 二分查找、变形及应用
  7. 201521123040《Java程序设计》第10周学习总结
  8. WIN8 下IE突然无法打开(管理员权限可打开)
  9. pdf打印机有什么功能
  10. KDJ指标详解教程跟KDJ指标详解的绝招
  11. 【多目标进化优化】MOEA 的分类
  12. 【信息检索】词典、倒排记录表和容错式检索
  13. 中秋之际,我想给月亮做一个智能化改造
  14. 单纯的一个复杂的json例子
  15. 图像处理神经网络是什么,图像处理神经网络模型
  16. 爬虫系列 | 5、详解爬虫中正则的用法
  17. 引起电源模块发热的4个主要原因分别是什么?
  18. 如何保证互联网平台服务的可靠性和稳定性?
  19. Httpclient调用短信验证码接口
  20. [AWT] GridLayout

热门文章

  1. 千年疑惑:为什么我越累越失眠,越睡越疲惫?
  2. 100天精通Andriod逆向——第6天:Andriod 开发入门
  3. 如何用机器学习算法计算特征重要性
  4. 你的声音价值百万,教你六个利用声音赚钱的方法
  5. 小白学习老九君C++笔记(10) 使用类创建对象
  6. 简单几步骤导出网易考拉海购中多个商品的图片
  7. 基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能
  8. 一期Go群问答-并发控制-数据竞争-错误与异常
  9. POJ3349-Snowflake Snow Snowflakes
  10. DirectX11 板条箱示例Demo