LV01-01-AliOSThings-11-任务与内存管理-01-基本概念

本文主要是任务与内存管理——多任务、多进程、多线程、内存管理等的基本概念的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
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. C程序内存空间分布

C语言程序编译后会生成一个可执行文件,它在内存中是怎么分布的?如下图所示:

image-20200726212846777

2. 两种内存分配方式

2.1 静态内存

image-20200726213137672

2.2 动态内存

image-20200726213226550

2.3 两种内存的区别

image-20200726213252478

3. 动态内存分配基本原理

image-20200726213345560

标准C库其实是有一套内存动态分配的函数接口的,但是我们在嵌入式开发工程中一般是不使用的,因为C库的分配释放函数使用的算法效率比较低。像我们接触到操作系统后,linux、AliOSThings、FreeRTOS等他们都会有自己的一套内存管理方案。

上图是AliOSThings的内存管理的大概原理。我们首先会申请一块大的内存空间(比如一个很大的数组),然后在这块内存空间中进行分块分类管理,让我们需要使用内存的时候,就从这个大的数组中取出符合要求的块。上图中就是一些被占用的内存块,黑色区域表示空闲。比如说,我们一开始的时候,创建了三个任务,它们占用了一片内存:

image-20231202124716801

现在我们中间的任务2不需要了,将这个任务删除,那么这个任务所占用的空间就被释放出来:

image-20231202124824291

然后后面,突然有一个消息队列要用内存,这个时候,就可以将之前释放的内存分配给消息队列:

image-20231202124917128

这就是内存管理大概得一个流程。

二、多任务

任务是一个逻辑概念,指由一个软件完成的活动,或者是一系列共同达到某一个目的的操作。通常一个任务是一个程序的一次运行,一个任务包含一个或多个完成独立功能的子任务,这个独立的子任务就是进程或线程。例如,一个杀毒软件的一次运行是一个任务,目的是从各种病毒的侵害中保护计算机系统,这个任务包含多个独立功能的子任务(进程或线程),包含实时监控功能、定时查杀功能、防火墙功能及用户交互功能等。就好比假设一个应用程序中由一个或多个可执行文件共同执行组成,那么此应用程序的一次执行就是一个任务,而这些可执行文件的执行就是一个进程的执行,而可执行文件是由一个线程或多个线程构成的,当只有一个线程构成了这个进程,则此时进程和线程就可以理解成一样的概念(可执行文件的一次运行)。

进程是一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的基本单位(系统好比是一个大型的任务,由多个进程(可执行文件)构成,而资源分配和资源调度分别都是一个进程,所以进程是系统进行资源分配和调度的基本单位)。一次任务的运行可以并发激活多个进程,这些进程相互合作来完成该任务的一个最终的目标。

前面已经提到,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程进程切换等操作时需要较复杂的上下文切换等动作。为了进一步减少处理机制的空转时间,支持多处理器及减少上下文切换开销,进程在演化中出现了另一个概念——线程。它是进程内独立的一条运行路线,是处理器调用的最小单元,也可以成为轻量级进程。线程可以对进程的内存空间和资源进程访问,并与同一个进程中的其他线程共享。因此,线程上下文切换的开销比创建进程小得多。

一个进程可以拥有多个线程,每个线程必须有一个父进程。线程不拥有系统资源,它只具有运行所必需的一些数据,如堆栈、寄存器与线程控制块(TCB),线程与其父进程的其他线程共享该进程所拥有的全部资源。要注意的是,由线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响。由此可知,多线程中的同步是非常重要的问题。

刚感觉多任务的概念还是有些迷,又查了查:

对于CPU来说一个任务起码就是一个进程,打开一个程序至少有一个进程,但是有可能打开一个程序,比如登录了几个QQ,这时QQ在电脑里起码有登录的QQ的数量个进程,而一个进程下可能有好几个线程,这些线程可以说是最小的执行单元,比如登着QQ,这个进程内有处理发送聊天文字的线程,有实时接收消息的线程,有收发图片的线程。

1. 多个工作流

image-20200726213603437

2. 多进程与多线程

image-20200726214438870

3. 多任务调度机制

image-20200726213732141

要注意中断的优先级远远高于任务的优先级。

4. 任务优先级

image-20200726213852427

5. 任务堆栈

image-20200726213921145