首页 > 其他分享 >Thread RCP和NCP方案

Thread RCP和NCP方案

时间:2023-11-28 10:15:35浏览次数:49  
标签:OpenThread Telink Thread NCP zephyr RCP ot

【技术专栏】泰凌微电子Thread RCP和NCP方案介绍(一) https://mp.weixin.qq.com/s/Qn0WCaJCT5hJP9fgqB9o1g

【技术专栏】泰凌微电子 Thread RCP 和 NCP 方案介绍(二) https://mp.weixin.qq.com/s/gbQFljbzf7kLdh8HYYbPBA

 

【技术专栏】泰凌微电子Thread RCP和NCP方案介绍(一)

泰凌微电子 2023-08-23 08:30 发表于上海 收录于合集#技术专栏51个

1

介绍

 

Thread规范建立了一种可靠、安全且能效高的无线通信协议,适用于资源受限的设备,常见于智能家居和商业建筑。OpenThread包含了Thread的完整网络层范围,包括IPv6、6LoWPAN、带有MAC安全性的IEEE 802.15.4、网状链路建立和网状路由等功能。

 

Telink已将由谷歌的团队开发的OpenThread实现整合到Zephyr RTOS中,实现了与Telink硬件的无缝兼容。这个整合的源代码可以在GitHub上方便地获取,并且还提供了软件开发工具包(SDK)。

 

在这个教程的上半部分中,您将在Telink Zephyr开发环境上构建OpenThread NCP和RCP固件。

 

学习内容

 

 

 

  • 使用Telink Zephyr开发环境配置OpenThread编译环境。
  • 构建OpenThread Co-Processor固件( ot-ncp-ftd 和 ot-rcp )。

 

所需条件

 

 

 

硬件:

  • 2块B91开发套件。

  • 1台Raspberry Pi 3B+或更高版本,并安装Raspbian操作系统映像。

  • 1台Linux主机,至少带有两个USB端口。

  • 1个已连接互联网的交换机(或路由器)和若干条以太网电缆。

 

软件:

  • Telink烧录和调试工具 —— LinuxBDT。

  • 其他工具,比如Git和West。

 

2

前提条件

 

  • Thread基本概念和OpenThread Co-Processor

在进行本教程之前,建议先完成OpenThread Simulation codelab并阅读OpenThread Co-Processor Designs,以便熟悉基本的Thread概念和OpenThread Co-Processor架构,对RCP和NCP两种设备有一个简单了解。

 

  • Linux主机

Linux主机(Ubuntu v20.04 LTS或更高版本)充当构建机器,用于设置Telink Zephyr开发环境并烧录所有Thread开发板。为了完成这些任务,Linux主机需要两个可用的USB端口和互联网连接。

 

  • Telink B91开发套件

本教程需要2块B91开发板。下面的图片展示了一个套件中所需的最少组件。

 

图片

 

本教程将使用一块B91开发板作为RCP(无线电协处理器),使用另一个B91开发板作为NCP(网络协处理器)。如果您尚未拥有这块开发板,您可以从Telink官方网站获取有关B91开发套件的更多详细信息。需要用到的部分组件如下表所示:

 

图片

 

  • 安装有Raspbian操作系统镜像的树莓派3B+或更高版本

在本教程中,需要使用带有Raspbian Bullseye Lite OS image 或Raspbian Bullseye with Desktop的树莓派3B+或更高版本。它通过以太网连接到互联网,并将配置为OpenThread边界路由器(OTBR)的主机。

 

  • 网络连接

本教程需要一个已连接互联网的交换机(或路由器)和若干条以太网电缆。它们用于将Raspberry Pi与Linux主机连接起来,便于用户通过主机对Raspberry Pi进行配置。

 

  • LinuxBDT

Telink 烧录和调试工具 (BDT) 适用于所有Telink芯片系列,可用于擦除和烧录OpenThread固件到Telink B91开发套件上。在您的Linux主机上安装基于X86架构的LinuxBDT。

 

  • 其他

  • Git,用于设置Telink Zephyr开发环境。

  • West,用于管理Zephyr项目并构建OpenThread二进制文件。

 

3

固件设置

 

  • Telink Zephyr开发环境设置

在Linux主机上打开命令行,执行以下命令,以确保您的APT软件包管理器是最新的。

 

$ sudo apt update
$ sudo apt upgrade

 

完成后,继续执行以下步骤。

 

1、安装依赖项。

 

$ wget https://apt.kitware.com/kitware-archive.sh
$ sudo bash kitware-archive.sh
$ sudo apt install --no-install-recommends git cmake ninja-build gperf \
ccache dfu-util device-tree-compiler \
python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \
make gcc gcc-multilib g++-multilib libsdl2-dev

 

Zephyr目前需要主要依赖项的最低版本,例如 CMake (3.20.0)、Python3 (3.6)、Devicetree 编译器 (1.4.6)。

 

$ cmake --version
$ python3 --version
$ dtc --version

 

在执行后续步骤之前,验证系统上安装的版本。如果版本不对,将 APT 镜像切换到稳定且最新的镜像,或手动更新这些依赖项。

 

2、安装west。

 

$ pip3 install --user -U west
$ echo 'export PATH=~/.local/bin:"$PATH"' >> ~/.bashrc
$ source ~/.bashrc

确保 ~/.local/bin 包含在 $PATH 环境变量中。

 

3、获取Zephyr项目的源码。

 

$ west init ~/zephyrproject
$ cd ~/zephyrproject
$ west update
$ west blobs fetch hal_telink
$ west zephyr-export

 

在中国大陆,使用 west init ~/zephyrproject 和 west update 获取 Zephyr 源代码,通常需要花费额外的时间。此外,某些项目可能无法从国外服务器更新,寻找其他方法来下载最新的源代码。

 

4、为 Zephyr 安装额外的 Python 依赖项。

 

$ pip3 install --user -r ~/zephyrproject/zephyr/scripts/requirements.txt

 

5、设置 Zephyr 工具链。下载 Zephyr 工具链(大约 1~2 GB)到本地目录中,以允许您烧录固件到开发板。在中国大陆境内,该步骤可能需要花费额外时间。

 

$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.1/zephyr-sdk-0.16.1_linux-x86_64.tar.xz
$ wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.1/sha256.sum | shasum --check --ignore-missing

 

下载Zephyr SDK并将其放置在推荐路径中,如下所示。

 

$HOME/zephyr-sdk[-x.y.z]
$HOME/.local/zephyr-sdk[-x.y.z]
$HOME/.local/opt/zephyr-sdk[-x.y.z]
$HOME/bin/zephyr-sdk[-x.y.z]
/opt/zephyr-sdk[-x.y.z]
/usr/zephyr-sdk[-x.y.z]
/usr/local/zephyr-sdk[-x.y.z]

 

其中 [-x.y.z] 可以是任何文本的可选项,例如 -0.13.2。SDK安装后不能移动该目录。接着安装Zephyr工具链。

 

$ tar xvf zephyr-sdk-0.16.1_linux-x86_64.tar.xz
$ cd zephyr-sdk-0.16.1
$ ./setup.sh -t riscv64-zephyr-elf -h -c

 

6、构建Hello World示例。使用Hello World示例验证官方Zephyr项目配置是否正确,然后再继续设置自定义项目。

 

$ cd ~/zephyrproject/zephyr
$ west build -p auto -b tlsr9518adk80d samples/hello_world

 

使用west build命令从Zephyr存储库的根目录构建hello_world示例。您可以在 build/zephyr 目录下找到名为 zephyr.bin 的固件。

 

7、将Zephyr环境脚本添加到 ~/.bashrc。在bash中执行一下命令。

 

$ echo "source ~/zephyrproject/zephyr/zephyr-env.sh" >> ~/.bashrc
$ source ~/.bashrc

 

8、添加Telink Zephyr远程库。下载Telink repo到本地作为开发分支并更新该分支。

 

$ cd ~/zephyrproject/zephyr
$ git remote add telink-semi https://github.com/telink-semi/zephyr
$ git fetch telink develop
$ git checkout develop
$ cd ..
$ west update
$ west blobs fetch hal_telink

 

更多信息参考Zephyr Doc – Getting Started Guide:https://docs.zephyrproject.org/latest/getting_started/index.html

 

4

固件编译

 

本教程中将构建两种固件:

  • ot-ncp-ftd

  • ot-rcp

 

编译方法如下:

 

1、无线电协处理器(ot-rcp)

 

$ cd ~/zephyrproject
$ rm -rf build_ot_coprocessor
$ west build -b tlsr9518adk80d -d build_ot_coprocessor zephyr/samples/net/openthread/coprocessor -- -DDTC_OVERLAY_FILE="usb.overlay" -DOVERLAY_CONFIG=overlay-rcp-usb-telink.conf

 

2、网络协处理器(ot-ncp-ftd)

打开位于 zephyr/samples/net/openthread/coprocessor/overlay-rcp-usb-telink.conf 文件,按如下示范进行修改。
# Telink RCP USB-CDC-ACM

CONFIG_OPENTHREAD_COPROCESSOR_NCP=y
CONFIG_OPENTHREAD_COPROCESSOR_RCP=n
...
CONFIG_USB_DEVICE_PRODUCT="OpenThread CoProcessor NCP"
完成后打开位于 zephyr/samples/net/openthread/coprocessor/boards/tlsr9518adk80d.conf 文件,按如下示范进行修改。
CONFIG_OPENTHREAD_NUM_MESSAGE_BUFFERS=256
然后执行以下命令编译 ot-ncp-ftd 固件。
$ cd ~/zephyrproject
$ rm -rf build_ot_ncp_ftd
$ west build -b tlsr9518adk80d -d build_ot_ncp_ftd zephyr/samples/net/openthread/coprocessor -- -DDTC_OVERLAY_FILE="usb.overlay" -DOVERLAY_CONFIG=overlay-rcp-usb-telink.conf

 

5

小结

 

您现在已经了解了下述内容:

 

  • 如何搭建并使用Telink Zephyr开发环境。

  • 如何构建 ot-ncp-ftd 和 ot-rcp 两种二进制文件。

 

在下一篇文章中,您可以使用这两种固件分别与树莓派协同工作,创建和管理Thread网络。

 

图片

关 于 泰 凌

泰凌微电子致力于为客户提供一站式的低功耗高性能无线连接SoC芯片解决方案,包括经典蓝牙,蓝牙低功耗,蓝牙Mesh,Zigbee,Thread,Matter,Apple HomeKit,Apple“查找(Find My)”,和私有协议等低功耗2.4GHz多协议无线连接系统级芯片和丰富的固件协议栈。公司产品广泛应用于智能照明,智能家居/楼宇,智能遥控,无线外设,智能零售,穿戴设备,无线音频,智能玩具,物流追踪,智慧城市等各类消费和商业应用场景中。

 

1

介绍

 

接着本教程的上一篇文章:泰凌微电子Thread RCP和NCP方案介绍(一),本篇将演示使用 LinuxBDT 工具将 OpenThread RCP 和 NCP 固件烧录到 Telink B91 开发板,并且分别与树莓派协同工作,创建和管理 Thread 网络的所必须的步骤。

 

学习内容

 

 

 

  • 分别将 OpenThread Co-Processor 固件( ot-ncp-ftd 和 ot-rcp )烧录到两块 Telink B91 开发板上。

  • 在 Raspberry Pi 3B+ 或更高版本上,使用Docker和RCP搭建OpenThread 边界路由器(OTBR)。

  • 在 Raspberry Pi 3B+ 或更高版本上,使用 Pyspinel 验证 NCP 功能。

 

所需条件

 

 

 

硬件:

  • 2 块 B91 开发套件。

  • 1 台 Raspberry Pi 3B+ 或更高版本,并安装 Raspbian 操作系统映像。

  • 1 台 Linux 主机,至少带有两个 USB 端口。

  • 1 个已连接互联网的交换机(或路由器)和若干条以太网电缆。

 

软件:

  • Telink 烧录和调试工具 —— LinuxBDT。

  • 其他工具,比如 Git 和 West。

 

2

固件烧录

 

泰凌 LinuxBDT 设置

 

 

 

下载 Telink Linux BDT 烧录工具,并将其解压到 Linux 主机的本地目录,例如 ~,以允许用户将固件烧录到B91开发板。

 

$ cd ~
$ wget http://wiki.telink-semi.cn/tools_and_sdk/Tools/BDT/LinuxBDT.tar.bz2
$ tar -vxf LinuxBDT.tar.bz2 

 

将 BDT 通过 USB 接口连接到 Linux 主机上,在命令行输入如下指令。

 

$ cd LinuxBDT
$ sudo ./bdt lsusb -v
Bus 002 Device 001: ID 1d6b:0003 xHCI Host Controller
Bus 001 Device 003: ID 0bda:565a Integrated_Webcam_HD
Bus 001 Device 023: ID 413c:301a Dell MS116 USB Optical Mouse
Bus 001 Device 037: ID 248a:826a Telink Web Debugger v3.6
Bus 001 Device 001: ID 1d6b:0002 xHCI Host Controller

 

能搜索到 Telink Web Debugger v3.6,代表 BDT 烧录器顺利连接到 Linux 主机。

 

固件烧录

 

 

 

如下图所示,使用USB连接线将一块 Telink B91 开发板连接到 Telink 烧录板。

 

图片

 

 

 

在命令行输入如下指令(以烧录 ot-ncp-ftd固件为例)。

 

$ cd ~/zephyrproject/build_ot_ncp_ftd/zephyr
$ cp zephyr.bin ~/LinuxBDT/bin/ot-ncp-ftd.bin
$ cd ~/LinuxBDT
$ sudo ./bdt 9518 ac
 Activate OK!
$ sudo ./bdt 9518 wf 0 -i bin/ot-ncp-ftd.bin
 EraseSectorsize...
 Total Time: 2181 ms
 Flash writing...
 [100%][-] [##################################################]
 File Download to Flash at address 0x000000: 491700 bytes
 Total Time: 30087 ms

 

ot-rcp 的烧录方法和 ot-ncp-ftd 的基本一样,不同之处在于固件名称。烧录完成后分别将两块B91开发板做好标记区分,烧录 ot-ncp-ftd 的开发板标记为“NCP”,烧录 ot-rcp 的开发板标记为“RCP”。

 

3

固件应用

 

本教程使用树莓派来验证RCP和NCP两种固件功能。

 

  • 树莓派安装 Docker 作为 OTBR 的 Host 端,验证 RCP 功能。

  • 树莓派安装并运行 Pyspinel,验证 NCP 功能。

 

树莓派

 

 

 

1、确保写入 SD 卡中的是 Raspbian Bullseye Lite OS image 或 Raspbian Bullseye with Desktop。

 

2、您可以选择通过 SSH 连接到树莓派,也可以直接在 Raspbian 桌面上操作。本教程将使用 SSH。

 

3、在下一步安装 OTBR Docker 或 Pyspinel 之前,先更新本地代码库和软件包管理器。

 

$ sudo apt-get update
$ sudp apt-get upgrade

 

无线电协处理器(RCP)

 

 

 

ot-rcp 固件的烧录步骤参考 ot-ncp-ftd 烧录过程,将 B91 开发板连接到树莓派的 USB 端口上,连接方式如下图所示。

 

图片

 

 

 

安装 Docker

 

 

 

重新启动树莓派并打开一个 SSH 终端窗口。

 

1、安装 Docker。

 

$ curl -sSL https://get.docker.com | sh

 

2、将当前用户添加到 Docker 组中,授予权限,这样在每个命令前都不需要加上sudo。

 

$ sudo usermod -aG docker $USER
 你需要重启树莓派来使改动生效。

 

3、若 Docker 尚未启动,请将其启动:

 

$ sudo dockerd

 

4、OTBR 防火墙脚本在 Docker 容器内创建规则。运行 modprobe 以加载 iptables 的内核模块。

 

$ sudo modprobe ip6table_filter

 

配置并运行 Docker

 

 

 

本教程直接从 OpenThread Docker Hub 拉取 OTBR Docker 镜像,该镜像已经过 OpenThread 团队的测试和验证。

 

1、拉取镜像:

 

$ docker pull openthread/otbr:latest

 

2、查看 Docker 容器中的镜像列表:

 

$ docker images
REPOSITORY        TAG       IMAGE ID       CREATED      SIZE
openthread/otbr   latest    db081f4de15f   6 days ago   766MB

 

3、通过检查 /dev 确定 RCP 设备的串行端口名称, 出现 ttyACM0 表示 RCP 正确连接。

 

$ ls /dev/tty*
...
/dev/ttyACM0
... 

 

4、第一次运行 OTBR Docker, 并引用RCP的串行端口(ttyACM0),此后若要继续使用该 OTBR Docker,请使用命令 docker start otbr。

 

$ docker run --name "otbr" --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" -p 8080:80 --dns=127.0.0.1 -it --volume /dev/ttyACM0:/dev/ttyACM0 --privileged openthread/otbr --radio-url spinel+hdlc+uart:///dev/ttyACM0

 

5、新开一个 SSH 终端窗口,测试树莓派和 RCP 的连通性,并建立 Thread 网络。

 

$ docker exec -ti otbr sh -c "sudo ot-ctl"
> state 
disabled
Done
> panid 0x1022 
Done
> ifconfig up
Done
> thread start 
Done
> state 
detached
Done
> state 
leader
Done

 

可选用的 Docker 命令:

 

  • 获取正在运行的 Docker 容器信息:

 

$ docker ps -aq

 

  • 停止 OTBR Docker:

 

$ docker stop otbr

 

  • 移除 OTBR Docker:

 

$ docker rm otbr

 

  • 重新加载 OTBR Docker:

 

$ docker restart otbr

 

网络协处理器(NCP)

 

 

 

关闭树莓派,拔掉 RCP。将NCP连接到树莓派的 USB 端口上,再重新启动树莓派。连接方式如下图。

 

图片

 

 

 

安装 Pyspinel

 

 

 

在树莓派上打开一个新的SSH终端窗口。

 

1、安装依赖项:

 

$ sudo apt install python3-pip
$ pip3 install --user pyserial ipaddress

 

2、下载 pyspinel 的源码到本地:

 

$ git clone https://github.com/openthread/pyspinel

 

3、安装 Pyspinel:

 

$ cd pyspinel
$ sudo python3 setup.py install

 

验证 NCP 功能

 

 

 

1、配置 NCP 连接。

 

$ sudo chmod a+rw /dev/ttyACM0

 

2、运行 Pyspinel CLI。

 

$ spinel-cli.py -u /dev/ttyACM0 -n 1
spinel-cli >

 

3、查询 NCP 版本。

 

spinel-cli > version
OPENTHREAD/aabbee49c; Zephyr; Aug 10 2023 14:02:37
Done

 

4、建立 Thread 网络。

 

spinel-cli > ifconfig up
Done
spinel-cli > thread start
Done
spinel-cli > state
detached
Done
spinel-cli > state
leader
Done

 

可以看到 NCP 已成为 leader,Thread 网络被成功创建。

 

可选用的 spinel-cli 命令:

 

  • 查看帮助菜单获取可用命令。

 

spinel-cli > help

Available commands (type help <name> for more information):
============================================================
bufferinfo         extaddr       ncp-filter        releaserouterid
channel            extpanid      ncp-ll64          reset
child              h             ncp-ml64          rloc16
childmax           help          ncp-raw           route
childtimeout       history       ncp-tun           router
clear              ifconfig      netdata           routerdowngradethreshold
commissioner       ipaddr        networkidtimeout  routerselectionjitter
contextreusedelay  joiner        networkkey        routerupgradethreshold
counters           keysequence   networkname       scan
debug              leaderdata    panid             state
debug-mem          leaderweight  parent            thread
diag               mac           ping              txpower
discover           macfilter     prefix            v
eidcache           mfg           q                 vendor
exit               mode          quit              version

 

4

总结

 

您现在已经知道:

 

  • 如何搭建并使用 Telink Zephyr 开发环境。

  • 如何构建 ot-ncp-ftd 和 ot-rcp 两种二进制文件并将其烧录到B91开发板。

  • 如何使用Docker和RCP将Raspberry Pi 3B+ 或更高版本设置为OpenThread边界路由器(OTBR)。

  • 在Raspberry Pi 3B+或更高版本上,使用 Pyspinel 验证NCP功能。

 

由此可见,RCP 和 NCP 方案都可以实现 OTBR 的功能。不过,从目前的社区的支持力度看,RCP 更适合用于 OTBR 的开发。

 

5

深入阅读

 

查看openthread.io和GitHub,了解各种OpenThread资源,包括:

 

  • Supported Platforms

    https://openthread.io/platforms/

— discover all the platforms that support OpenThread

 

  • Build OpenThread

    https://openthread.io/guides

— further details on building and configuring OpenThread

 

  • Thread Primer

    https://openthread.io/guides/thread-primer

— covers all the Thread concepts featured in this codelab

 

参考文档:

 

OpenThread Co-Processor Designs:

https://openthread.io/platforms/co-processor

 

OpenThread Pyspinel:

https://openthread.io/guides/pyspinel

 

OpenThread Border Router:

https://openthread.io/guides/border-router

 

 

 

 

 

翻译

搜索

复制

标签:OpenThread,Telink,Thread,NCP,zephyr,RCP,ot
From: https://www.cnblogs.com/papering/p/17861217.html

相关文章

  • python threading线程数
    importthreadingimporttimename_list=[{"李四1":1234556},{"李四2":1234556},{"李四3":1234556},{"李四4":1234556},{"李四5":1234556},{"李四6":1234556},{"李四7"......
  • Fatal signal 11 (SIGSEGV) at 0x0000130f (code=1), thread xxx (Thread-xx)
    导致应用程序崩溃问题分析与解决:--复现--分析--解决最后先展示与问题相关的代码片:09-0413:26:32.826F/libc(572):Fatalsignal11(SIGSEGV)at0x0000130f(code=1),xxxx844(Thread-46)09-0413:26:32.936I/DEBUG(103):*************************......
  • 重量级消息,微软将ThreadX RTOS全家桶贡献给Eclipse基金会,免费供大家商用,宽松的MIT授权
     从明年第1季度开始,任何人,任何厂家的芯片都可以免费商用,MIT授权就这点好。 贡献出来后,多方可以一起努力开发,当前首批兴趣小组AMD,Cypherbridge,Microsoft,NXP,PX5,Renesas,STMicroelectronics,SiliconLabs,andWitekio(anAvnetcompany)都表达对这个系统支持......
  • Jmter - Concurrency Thread Group
    目录介绍参数介绍介绍特点:ConcurrencyThreadGroup提供了用于配置多个线程计划的简化方法该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程和StandardThreadGroup不同,它不会预先创建所有线程,因此不会使用额外的内容对于SteppingThr......
  • Jmeter - Stepping Thread Group
    目录安装参数详解结果分析安装1.下载Jmeter包管理工具:https://www.cnblogs.com/czzz/p/15932826.html2.使用插件参数详解Thisgroupwillstart:表示总共要启动的线程数,若设置为100,表示总共会加载到100个线程First,waitfor:从运行之后多长时间开始启动线程,若设置为0秒......
  • 线程-ThreadLocal篇
    ThreadLocal类(用于创建一个线程本地变量)在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值就是变量的副本。通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get方法之前要先set,否则就要重写initialValue()方法......
  • C++ Thread使用类成员函数
    C++Thread使用类成员函数1#include<thread>2#include<iostream>34usingstd::cout;5usingstd::endl;6usingstd::thread;78classJob{9public:10Job(intm):_m(m){}11voiddoSomeThing(inta,intb){12intc=a+b......
  • C++11 多线程(std::thread)实例
    C++11的std::thread在C中已经有一个叫做pthread的东西来进行多线程编程,但是并不好用(如果你认为句柄、回调式编程很实用,那请当我没说),所以c++11标准库中出现了一个叫作std::thread的东西。std::thread常用成员函数构造&析构函数举个栗子例一:thread的基本使用1//Compiler:......
  • ThreadPoolTaskExecutor类
    ThreadPoolTaskExecutor类可用来创建线程池并添加任务1TreadPoolTaskExecutortaskExecutor=newThreadPoolTaskExecutor();2taskExecutor.setCorePoolSize(5);//设置核心线程数3taskExecutor.setMaxPollSize(10);//设置最大线程数4taskExecutor.setQu......
  • std::thread方法join与detach
    1、std::joinstd::join是std::thread类的成员函数之一,用于等待线程的执行完成。#include<iostream>#include<utility>#include<thread>#include<chrono>#include<atomic>voidprocess(std::stringstr_info){for(inti=0;i<500;++i)......