LV01-01-AliOSThings-07-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设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

一、main函数

1. main函数在哪?

我们要分析一个工程源码,自然要从main函数开始,这是整个工程的入口函数,我们在helloworld_mk3080工程目录下用下面的命令搜索:

1
2
hk@vm:~/6AliOS/helloworld_mk3080$ grep -nR "int main" ./
./board/mk3080/startup/startup.c:30:int main(void)

结果如下,可以看到main函数定义在 board/mk3080/startup/startup.c 中:

image-20231116073741862

2. 系统初始化

我们学习过单片机,知道main函数前面肯定还有很多其他的东西,这里一起简单了解下吧,由于3.1版本的Alios-Things官方似乎都不维护了,文档也不见了,下图是以前的帮助文档中板级移植指导部分的说明:

image-20200708155737439

详细的这里就不多赘述了。

3. main函数简析

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
* Copyright (C) 2015-2017 Alibaba Group Holding Limited
*/
// 包含头文件
#include "aos/kernel.h"
#include <k_api.h>
#include <stdio.h>
#include <stdlib.h>

#include "aos/init.h"
#include "aos/kernel.h"
// 其他文件实现的函数接口
extern void board_basic_init(); // 开发板初始化
extern void aos_maintask(void* arg); // 操作系统应用程序的第一个任务

/*
main task stask size(cpu_stack_t)
*/
#ifndef AOS_MAIN_TASK_STACK_SIZE
#define AOS_MAIN_TASK_STACK_SIZE (2048) // maintask任务 任务堆栈的大小
#endif

/*
main task pri
*/
#define AOS_MAIN_TASK_PRI 32 // maintask 任务优先级

static ktask_t *g_main_task;

int main(void)
{
/* board basic init: CLK, heap, define in board\aaboard_demo\startup\board.c */
board_basic_init(); // 初始化时钟,初始化堆空间(操作系统内存管理初始化)

/* kernel init, malloc can use after this! */
krhino_init(); // rhino(AliOS Things 操作系统内核)内核初始化

/* main task to run */
krhino_task_dyn_create(&g_main_task, "main_task", 0, AOS_MAIN_TASK_PRI, 0,
AOS_MAIN_TASK_STACK_SIZE, (task_entry_t)aos_maintask, 1); // 创建maintask任务

/* kernel start schedule! */
krhino_start(); // 启动操作系统内核

/* never run here */
return 0;
}

4. aos_maintask

接下来我们看一下主任务,这里我们可以使用vscode或者sourceinsight等代码编辑器分析和跳转函数的引用,也可以使用grep命令自己搜索分析,我这里使用grep命令在helloworld_mk3080工程目录搜索:

1
2
3
4
hk@vm:~/6AliOS/helloworld_mk3080$ grep -nR "aos_maintask" ./
# ......
./maintask.c:46:void aos_maintask(void* arg)
# ......

搜索到的相关的字符串会有很多,大概分析一下就知道 maintask.c 中的这个才是:

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
28
29
30
31
32
33
34
35
36
37
extern void board_tick_init(void);
extern void board_stduart_init(void);
extern void board_dma_init(void);
extern void board_gpio_init(void);
extern void board_kinit_init(kinit_t* init_args);

/* For user config
kinit.argc = 0;
kinit.argv = NULL;
kinit.cli_enable = 1;
*/
static kinit_t kinit = {0, NULL, 1};

/**
* @brief Board Initialization Function
* @param None
* @retval None
*/
void board_init(void)
{
board_tick_init();
board_stduart_init();
board_dma_init();
board_gpio_init();
}

void aos_maintask(void* arg) // 当操作系统启动后,会调用这个函数
{
board_init(); // 初始化开发板相关的硬件
board_kinit_init(&kinit);// 初始化开发跟内核相关的硬件
aos_components_init(&kinit); // 初始化我们工程当中用到的组件

#ifndef AOS_BINS
// 跳转到我们用户的应用程序,我们helloworld在application_start实现
application_start(kinit.argc, kinit.argv); /* jump to app entry */
#endif
}

5. application_start

我们再来看一下application_start这个函数,我们在helloworld_mk3080工程目录搜索:

1
2
3
hk@vm:~/6AliOS/helloworld_mk3080$ grep -nR "int application_start" ./
./maintask.c:13:extern int application_start(int argc, char *argv[]);
./appdemo.c:12:int application_start(int argc, char *argv[])

可以看到这个函数是定义在 appdemo.c 中:

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
/*
* Copyright (C) 2015-2020 Alibaba Group Holding Limited
*/

#include <stdio.h>
#include <stdlib.h>
#include <aos/kernel.h>
#include "aos/init.h"
#include "board.h"
#include <k_api.h>

int application_start(int argc, char *argv[])
{
int count = 0;

printf("nano entry here!\r\n");

//fd = board_lcd_create("name");
//board_lcd_write(fd,buffer,len);

while(1) {
printf("hello world! count %d \r\n", count++); // 打印hellow信息

aos_msleep(1000); // 调用系统ms休眠接口,每1000ms,打印一次helloworld
};
}