LV01-01-AliOSThings-06-HelloWorld工程目录

本文主要是mk3080的HelloWorld工程目录分析的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows版本 windows11
Ubuntu版本 Ubuntu22.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
点击查看本文参考资料
分类 网址 说明
官方网站 阿里云 阿里云官网主页
阿里生活物联平台 生活物联网平台(飞燕平台)主页
AliGenie 天猫精灵开放平台AliGenie主页
阿里物联网平台 阿里物联网平台主页
Bluetooth 技术网站 蓝牙协议规范什么的可以来这里找
Telink Telink | Chips for a Smarter IoT (telink-semi.com)
Telink中文官网
开发手册 AliOS Things开发指南 AliOS Things开发指南,这里是最新版本,可以直接从官网找到
AliOS Things开发指南 AliOS Things应用开发指南,这里应该是3.3版本的完整开发文档
AliOS Things开发指南(3.0) AliOS Things应用开发指南,这里应该是3.0版本的完整开发文档
生活物联网平台开发文档 生活物联网平台(飞燕平台)开发文档
《设备端开发指南》
Wi-Fi IoT品类定义与功能开发 天猫精灵IoT开放平台——Wi-Fi IoT品类定义与功能开发
硬件平台 mk3080 WiFi开发板 WiFi开发板使用指南-阿里云开发者社区
esp8266开发板 一个教程:ESP8266-NodeMCU开发板详解-太极创客 (taichi-maker.com)
TLSR8258 Datasheet Datasheet for Telink BLE + IEEE802.15.4 MultiStandard Wireless SoC TLSR8258
参考资料 AliOS Things 3.0 应用开发指南 这个只是一篇参考文章,里面是一些环境搭建相关的,可以参考
IP知识百科 - 华为 (huawei.com) IP的一些相关知识点
点击查看相关文件下载
分类 网址 说明
蓝牙规范相关文档 Core Specification 5.2 核心规格 5.2,该规范定义了创建可互操作的Bluetooth 设备所需的技术。
《Core_v5.2.pdf》
Mesh Model(v1.1) 本Bluetooth 规范定义了模型(以及它们所需的状态和消息),这些模型用于在mesh 网络中的节点上执行基本功能,超出了Bluetooth Mesh 配置文件 规范中定义的基础模型。
本规范包括定义跨设备类型标准功能的通用模型,以及支持关键mesh 场景的模型,如照明控制、传感器、时间和场景。
《MshMDL_v1.1.pdf》
Mesh Profile(v1.0.1) 该Bluetooth 规范定义了基本要求,以实现可互操作的mesh 网络解决方案,用于Bluetooth 低能量无线技术。
《MshPRFv1.0.1.pdf》
Mesh Device Properties 本规范包含Bluetooth Mesh 配置文件 和Bluetooth Mesh 模型规范所要求的设备属性的定义。
但是跟之前的有些区别,我主要看的之前的版本:《MMeshDeviceProperties_v1.2.pdf》
GATT Specification Supplement GATT Specification Supplement | Bluetooth® Technology Website。
好像可以在线看:《GATT Specification Supplement》
Assigned Numbers GATT的一些类型定义可以在这里找。
AliOS Things alios-things/AliOS-Things Gitee上的AliOSThings SDK源码仓库
alibaba/AliOS-Things GitHub上的AliOSThings SDK源码仓库
天猫精灵蓝牙Mesh协议栈 alibaba-archive/genie-bt-mesh-stack GitHub上的天猫精灵蓝牙Mesh协议栈源码仓库。
之前是在alibaba/genie-bt-mesh-stack这个仓库。
写笔记的时候最新提交为faf523618a6a2560090fc423222b9db80984bb7a
蓝牙Mesh设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

一、工程顶层目录

接下来就是分析一下我们工程顶层目录 helloworld_mk3080 下的文件都是什么。我们使用ls -a简单查看一下这个 helloworld_mk3080 目录下都有哪些文件:

image-20231111135921785

我们还可以安装tree命令来查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hk@vm:~/6AliOS/helloworld_mk3080$ tree -a -L 1
.
├── .aos
├── aos_config.h
├── aos.mk
├── appdemo.c
├── autobuild.json
├── board
├── .config
├── Config.in
├── ..config.tmp
├── .defconfig
├── .important.bak
├── k_app_config.h
├── maintask.c
├── out
├── README.md
└── .vscode

4 directories, 12 files

各个目录具体说明如下:

image-20231111142804028

二、board目录

接下来我们来看一下board目录,我们使用下面的命令查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
hk@vm:~/6AliOS/helloworld_mk3080$ tree -a board/
board/
└── mk3080
├── aos.mk
├── config
│   ├── board.h
│   ├── k_config.c
│   ├── k_config.h
│   └── partition_conf.c
├── Config.in
├── ld
│   ├── rlx8711B-symbol-v02-img2-2ndboot.ld
│   ├── rlx8711B-symbol-v02-img2.ld
│   ├── rlx8711B-symbol-v02-img2_xip1.ld
│   └── rlx8711B-symbol-v02-img2_xip2.ld
├── README.md
└── startup
├── board.c
└── startup.c

4 directories, 13 files
image-20231111162054211

三、out目录

我们先来看一下out目录下有什么:

1
2
3
4
5
6
hk@vm:~/6AliOS/helloworld_mk3080$ tree -a out -L 1
out
├── config
└── helloworld_mk3080@mk3080

2 directories, 0 files
image-20231111155938420

后边学习源码以及编译原理的时候会再学习config目录,这里我们先来了解一下 helloworld_mk3080@mk3080 目录。

1. 几个常用命令

1.1 file

我们可以使用man命令查看file命令的说明,此命令用于查看文件信息:

1
2
3
4
5
6
SYNOPSIS
file [-bcEhiklLNnprsvzZ0] [--apple] [--extension] [--mime-encoding]
[--mime-type] [-e testname] [-F separator] [-f namefile]
[-m magicfiles] [-P name=value] file ...
file -C [-m magicfiles]
file [--help]

1.2 readelf

此命令用于查看elf文件详情

1
2
3
4
5
6
7
8
9
10
SYNOPSIS
readelf [-a|--all]
[-h|--file-header]
[-l|--program-headers|--segments]
[-S|--section-headers|--sections]
[-g|--section-groups]
[-t|--section-details]
[-e|--headers]
[-s|--syms|--symbols]
# ......

这个命令选项有很多,用到了再查就好了。

1.3 hexdump

此命令用于查看hex、bin文件详情:

1
2
3
4
5
SYNOPSIS
hexdump [-bcCdovx] [-e format_string] [-f format_file] [-n length]
[-s skip] file ...
hd [-bcdovx] [-e format_string] [-f format_file] [-n length] [-s skip]
file ...

2. config

这个目录后边学习编译原理的时候会再学习,这里先忽略。

3. helloworld_mk3080@mk3080

我们先看一下 helloworld_mk3080@mk3080目录下的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hk@vm:~/6AliOS/helloworld_mk3080/out$ tree -a helloworld_mk3080@mk3080 -L 1
helloworld_mk3080@mk3080
├── aos_all_components.mk
├── auto_component
├── binary
├── config_2ndboot.mk
├── config.mk
├── .depends_2ndboot.mk
├── .depends.mk
├── includes
├── libraries
├── modules
└── modules_2ndboot

6 directories, 5 files

image-20231111162129885

3.1 binary目录

我们看一下都有哪些文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hk@vm:~/6AliOS/helloworld_mk3080/out/helloworld_mk3080@mk3080$ tree -a binary/ -L 1
binary/
├── boot_all.bin
├── helloworld_mk3080@mk3080.bin
├── helloworld_mk3080@mk3080.elf
├── helloworld_mk3080@mk3080.hex
├── helloworld_mk3080@mk3080.map
├── helloworld_mk3080@mk3080_map.csv
├── helloworld_mk3080@mk3080_ota.bin
├── helloworld_mk3080@mk3080_ota.bin.xz
├── helloworld_mk3080@mk3080.stripped.elf
├── image2_2ndboot.bin
├── link.opts
└── readme.txt

0 directories, 12 files

这里简单介绍一下这些文件,具体详细的可以看单片机的相关笔记,在学习单片机的过程中,有详细了解过bin文件、hex文件和elf文件的内容。

  • (1)bin文件

.bin 就是二进制文件,cpu就是从这个.bin文件中取值,它存放在flash里面 是data数据。

  • (2)elf文件

elf 是linux系统特有的。.elf文件可以直接在linux系统里直接执行,里面包括很多跟linux,跟硬件架构相关的信息,但是在mk3080上,是不能执行的。在遇到很难解决的bug时,会查看elf文件进行分析,我们可以通过file命令查看elf文件的一些信息:

1
2
3
4
5
hk@vm:~/6AliOS/helloworld_mk3080/out/helloworld_mk3080@mk3080/binary$ file helloworld_mk3080@mk3080.elf 
helloworld_mk3080@mk3080.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

hk@vm:~/6AliOS/helloworld_mk3080/out/helloworld_mk3080@mk3080/binary$ file helloworld_mk3080@mk3080.stripped.elf
helloworld_mk3080@mk3080.stripped.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, stripped

上边我们会发现还有一个elf文件,名字为helloworld_mk3080@mk3080.stripped.elf,这个stripped是什么意思?这个文件其实是由strip命令处理得到的,这个命令的功能是用于从文件中去除指定符号或调试信息,可以针对一般文件与函数库文件进行操作,能够减少文件占用空间大小。

image-20231115073317651

我们还可以通过带选项的readelf命令来查看elf文件信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
hk@vm:~/6AliOS/helloworld_mk3080/out/helloworld_mk3080@mk3080/binary$ readelf helloworld_mk3080@mk3080.elf -h
ELF 头:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
类别: ELF32
数据: 2 补码,小端序 (little endian)
版本: 1 (current)
OS/ABI: UNIX - System V
ABI 版本: 0
类型: EXEC (可执行文件)
系统架构: ARM
版本: 0x1
入口点地址: 0x101
程序头起点: 52 (bytes into file)
Start of section headers: 1387948 (bytes into file)
标志: 0x5000200, Version5 EABI, soft-float ABI
本头的大小: 52 (字节)
程序头大小: 32 (字节)
Number of program headers: 4
节头大小: 40 (字节)
节头数量: 22
字符串表索引节头: 21
  • (3)hex文件

51、STM8等单片机中经常烧录的就是.hex文件 ,它是包含描述信息的bin文件 ,必须通过专用工具进行烧录。

  • (4).csv文件

在AliOS Things编译输出的成果物中这个文件是整个可执行程序,占用的ROM 和 RAM空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
hk@vm:~/6AliOS/helloworld_mk3080/out/helloworld_mk3080@mk3080/binary$ cat helloworld_mk3080@mk3080_map.csv 

AOS MEMORY MAP
|=================================================================|
| MODULE | ROM | RAM |
|=================================================================|
| arch_armv7m | 2173 | 0 |
| board_mk3080 | 624 | 36 |
| debug | 3471 | 24 |
| helloworld_mk3080 | 141 | 12 |
| kernel_init | 90 | 0 |
| kv | 2325 | 24 |
| libc_nano | 11395 | 464 |
| libgcc | 3384 | 0 |
| lib_platform | 5068 | 3256 |
| lib_wlan | 321 | 4 |
| mcu_rtl8710bn | 9139 | 1156 |
| newlib_stub | 306 | 0 |
| osal_aos | 986 | 0 |
| rhino | 12205 | 7688 |
| ulog | 377 | 7 |
| vfs | 1092 | 1113 |
| yloop | 1306 | 32 |
| *fill* | 99 | 32 |
|=================================================================|
| TOTAL (bytes) | 54502 | 13848 |
|=================================================================|

3.2 libraries目录

Alios Things 包含很多功能组件,为了便于编译管理,它会把每个组件生成.a文件,之后进行统一链接:

image-20231115074036762

这些就是一些静态库文件,后边学习编译的时候会了解什么是静态库。如何查看静态库信息?我们可以通过readelf命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
hk@vm:~/6AliOS/helloworld_mk3080/out/helloworld_mk3080@mk3080/libraries$ readelf app_adapter.a -h

文件:app_adapter.a(maintask.o)
ELF 头:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
类别: ELF32
数据: 2 补码,小端序 (little endian)
版本: 1 (current)
OS/ABI: UNIX - System V
ABI 版本: 0
类型: REL (可重定位文件)
系统架构: ARM
版本: 0x1
入口点地址: 0x0
程序头起点: 0 (bytes into file)
Start of section headers: 18812 (bytes into file)
标志: 0x5000000, Version5 EABI
本头的大小: 52 (字节)
程序头大小: 0 (字节)
Number of program headers: 0
节头大小: 40 (字节)
节头数量: 28
字符串表索引节头: 27