LV01-01-AliOSThings-15-工作队列-03-工作队列的使用实例

本文主要是工作队列——工作队列的使用实例的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
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设备开发指南 阿里云生活服务平台开发手册——蓝牙设备开发一节中的内容

这节的实例是基于mk3080开发板的。

一、LED闪烁-多任务

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
49
50
51
52
53
54
55
56
57
58
59
60
61
/** =====================================================
* Copyright © hk. 2022-2025. All rights reserved.
* File name : 07_led_task.c
* Author : 上上签
* Date : 2023-12-09
* Version :
* Description:
* ======================================================
*/

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

#include "aos/init.h"
#include "board.h"

#include "ulog/ulog.h"
#include "aos/hal/gpio.h"
#include "aos/cli.h"


#define RED_LED 0 // PA14
#define GRE_LED 1 // PA15
#define MODULE_NAME "led_task_app" /* module name used by ulog */

static gpio_dev_t led_gpio_dev[2] = {0};

int led_init(void)
{
//由于PA14时rtl8710的jtag接口,我要使用GPIO功能,必须先关闭jtag借口
sys_jtag_off();
led_gpio_dev[0].port = RED_LED;
led_gpio_dev[0].config = OUTPUT_PUSH_PULL;
led_gpio_dev[0].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[0]);

led_gpio_dev[1].port = GRE_LED;
led_gpio_dev[1].config = OUTPUT_PUSH_PULL;
led_gpio_dev[1].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[1]);

return 0;
}

int application_start(int argc, char *argv[])
{
led_init();
aos_set_log_level(AOS_LL_INFO);
aos_cli_init();

while(1)
{
aos_msleep(1000);
hal_gpio_output_toggle(&led_gpio_dev[1]);
}
return 0;
}

二、LED闪烁-工作队列

1. 运行在默认的工作队列

源码如下,也可以看这里:helloworld_mk3080/example/07_work_new.c · sumumm/AliOS-Things-Prj - 码云 - 开源中国 (gitee.com)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/** =====================================================
* Copyright © hk. 2022-2025. All rights reserved.
* File name : 07_work_new.c
* Author : 上上签
* Date : 2023-12-09
* Version :
* Description:
* ======================================================
*/

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

#include "aos/init.h"
#include "board.h"

#include "ulog/ulog.h"
#include "aos/hal/gpio.h"
#include "aos/cli.h"


#define RED_LED 0 // PA14
#define GRE_LED 1 // PA15
#define MODULE_NAME "work_new_app" /* module name used by ulog */

static gpio_dev_t led_gpio_dev[2] = {0};

static aos_work_t led_work;

static void work_entry(void *arg)
{
LOGI(MODULE_NAME, "led[0] is toggle!\r\n");
hal_gpio_output_toggle(&led_gpio_dev[0]);
aos_work_sched(&led_work);
}

int led_init(void)
{
//由于PA14时rtl8710的jtag接口,我要使用GPIO功能,必须先关闭jtag借口
sys_jtag_off();
led_gpio_dev[0].port = RED_LED;
led_gpio_dev[0].config = OUTPUT_PUSH_PULL;
led_gpio_dev[0].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[0]);

led_gpio_dev[1].port = GRE_LED;
led_gpio_dev[1].config = OUTPUT_PUSH_PULL;
led_gpio_dev[1].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[1]);

return 0;
}

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

led_init();
aos_set_log_level(AOS_LL_INFO);
aos_cli_init();

/* init the work. The work was executed with a delay of 1000ms after startup. */
ret = aos_work_init(&led_work, work_entry, NULL, 2000);
if (ret != 0) {
LOGE(MODULE_NAME, "create work error!");
return;
}
aos_work_sched(&led_work);

while(1)
{
aos_msleep(1000);
hal_gpio_output_toggle(&led_gpio_dev[1]);
}
return 0;
}

2. 运行在指定的工作队列

源码如下,也可以看这里:helloworld_mk3080/example/07_work_queue_new.c · sumumm/AliOS-Things-Prj - 码云 - 开源中国 (gitee.com)

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/** =====================================================
* Copyright © hk. 2022-2025. All rights reserved.
* File name : 07_work_queue_new.c
* Author : 上上签
* Date : 2023-12-09
* Version :
* Description:
* ======================================================
*/

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

#include "aos/init.h"
#include "board.h"

#include "ulog/ulog.h"
#include "aos/hal/gpio.h"
#include "aos/cli.h"


#define RED_LED 0 // PA14
#define GRE_LED 1 // PA15
#define MODULE_NAME "work_new_app" /* module name used by ulog */

static gpio_dev_t led_gpio_dev[2] = {0};

static aos_work_t led_work;
static aos_workqueue_t message_work_queue;

static void work_entry(void *arg)
{
LOGI(MODULE_NAME, "led[0] is toggle!");
hal_gpio_output_toggle(&led_gpio_dev[0]);
aos_work_run(&message_work_queue, &led_work);
}

int led_init(void)
{
//由于PA14时rtl8710的jtag接口,我要使用GPIO功能,必须先关闭jtag借口
sys_jtag_off();
led_gpio_dev[0].port = RED_LED;
led_gpio_dev[0].config = OUTPUT_PUSH_PULL;
led_gpio_dev[0].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[0]);

led_gpio_dev[1].port = GRE_LED;
led_gpio_dev[1].config = OUTPUT_PUSH_PULL;
led_gpio_dev[1].priv = NULL;
//gpio PA14初始化
hal_gpio_init(&led_gpio_dev[1]);

return 0;
}

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

led_init();
aos_set_log_level(AOS_LL_INFO);
aos_cli_init();

/**
* Create a user-defined work queue.
* workqueue: message_work_queue (aos_workqueue_t structure variable)
* pri: 10(priority of the workqueue background task)
* stack_size: 512(stack size of the workqueue background task)
*/
ret = aos_workqueue_create(&message_work_queue, 10, 8*256);
if (ret != 0) {
LOGE(MODULE_NAME, "create workqueue error");
return;
}

/* init the work. The work was executed with a delay of 1000ms after startup. */
ret = aos_work_init(&led_work, work_entry, NULL, 2000);
if (ret != 0) {
LOGE(MODULE_NAME, "create work error!");
return;
}
/**
* start the work, using the newly created workqueue .
*/
aos_work_run(&message_work_queue, &led_work);

while(1)
{
aos_msleep(1000);
hal_gpio_output_toggle(&led_gpio_dev[1]);
}
return 0;
}