LV01-01-AliOSThings-11-任务与内存管理-05-任务私有数据

本文主要是任务与内存管理——任务私有数据典型应用的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

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

一、多任务间共享全局变量

1. 先来看一个实例

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 (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>
#include "ulog/ulog.h"

#define TASK_NUM 2

#define MUDULE_NAME "task_global"

int loop_count = 0;
const char* task_names[TASK_NUM] =
{
"task1",
"task2",
};

void log_loop_count(void)
{
LOGI(MUDULE_NAME, "task name is %s\r\n", aos_task_name());
LOGI(MUDULE_NAME, "loopcount = %d\r\n",loop_count++);
}

void task_entry(void *arg)
{
while(1)
{
log_loop_count();
aos_msleep(1000);
}
}


int application_start(int argc, char *argv[])
{
int count = 0;
int index;
int ret;
aos_set_log_level(AOS_LL_INFO);
for(index = 0; index < TASK_NUM; index++)
{
ret = aos_task_new(task_names[index], task_entry, NULL, 4*256);
if(ret != 0)
{
LOGE(MUDULE_NAME, "%s create is err\r\n", task_names[index]);
}

}


while(1) {
//printf("hello world! count %d \r\n", count++);
aos_msleep(1000);
};
}

我们编译烧写后运行,会有如下下打印信息:

image-20231202152052102

可以看到这个全局变量loopcount不断累加,每个任务都会对它进行加1操作。

2. 新需求的引入

这个时候我们有这样一个需求,我们现在想要统计每一个任务的运行次数,要怎么办?第一个想法肯定是,我们用两个变量不就行了吗?给每个任务都定义一个loopcount变量来分别进行计数,话是这样讲,但是实际情况是,我们的任务除了设置的任务名,其他都是一样的,就像任务函数名字、任务内部执行的内容等。当然我们也可以创建两个任务函数,使用不同的任务函数名字,但是对于做相同工作的任务来说,何必写这么多重复的任务函数呢?

那我们怎么解决这个为每个任务计数的需求呢?这就需要用到任务私有数据啦。

二、任务私有数据使用方法

1. API分析

image-20200729111417985

我们每创建一个任务就会有一个任务控制块,每一个任务控制块都有私有数据key_k数组,这个key_k是一个void类型的指针数组,数组的大小由NUM控制,这是一个宏,是可以配置的。

当我们调用aos_task_key_create()函数创建key的时候,就会遍历任务控制块中的key_k数组中的key,哪一个是有效的,可用的(主要是内核来决定的),这个函数就会获取这个key的下标,并返回到aos_task_key_create()函数的参数中,创建完毕后,我们就有一个key值可以用了。这样在每一个任务控制块的key_k数组中都使能了这么一个元素。

2. demo分析

我们打开AOS_SDK_PATH/application/example/kernel_demo/aos_api_demo/task_app/task_key.c:

image-20200729111700495

image-20200729111813200

3. 私有数据应用

3.1 应用需求

1
为每个任务创建私有数据,来记录任务的循环执行次数

3.2 代码实现

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
97
/*
* 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>
#include "ulog/ulog.h"

#define TASK_NUM 2

#define MUDULE_NAME "task_global"

aos_task_key_t task_key;

int * p_task_loop_count[TASK_NUM];
const char* task_names[TASK_NUM] =
{
"task1",
"task2",
/*
"task3",
"task4",
"task5",
"task6",
"task7",
"task8",
"task9",
"task10",
*/
};

void log_loop_count(void)
{
int loop_count = *((int *)aos_task_getspecific(task_key));

LOGI(MUDULE_NAME, "task name is %s\r\n", aos_task_name());
LOGI(MUDULE_NAME, "loopcount = %d\r\n",loop_count);


}

void task_entry(void *arg)
{
//任务计数值加加,并设置到任务的私有空间地址上
aos_task_setspecific(task_key,arg);
while(1)
{
(*(int *)arg)++;
log_loop_count();
aos_msleep(1000);
}
}


int application_start(int argc, char *argv[])
{
int count = 0;
int index;
int ret;
aos_set_log_level(AOS_LL_INFO);
//创建私有数据key值
ret = aos_task_key_create(&task_key);

if(ret != 0)
{
LOGE(MUDULE_NAME, "key create is err\r\n");

}
for(index = 0; index < TASK_NUM; index++)
{
//为每个任务创建任务私有数据空间
p_task_loop_count[index] =(int *)aos_zalloc(sizeof(int));
if(p_task_loop_count[index] == NULL)
{

LOGE(MUDULE_NAME, "%s aos_zalloc is err\r\n", task_names[index]);

}
ret = aos_task_new(task_names[index], task_entry, p_task_loop_count[index], 4*256);
if(ret != 0)
{
LOGE(MUDULE_NAME, "%s create is err\r\n", task_names[index]);
}

}


while(1) {
printf("hello world! count %d \r\n", count++);

aos_msleep(1000);
};
}

也可以看当时学习的时候的代码:feat:任务私有数据测试 · 022cb03 · sumumm/AliOS-Things-Prj - Gitee.com