MSP432P401R TI Drivers 库函数学习笔记(二)认识TI-RTOS (TI-POSIX)

目录

  • 简介
    • TI-RTOS
    • FreeRTOS
    • POSIX
    • 运行时对象查看器 (Runtime Object Viewer)
  • TI-POSIX 介绍
    • 在源代码中使用 POSIX
    • TI-POSIX支持的函数摘要
      • 线程函数调用的前后关系
        • 线程管理
        • 线程属性
        • 线程同步
        • 障碍属性
        • 条件变量
        • 条件变量属性
        • 互斥锁
        • 互斥属性
        • 读写锁定
        • 读写锁属性
      • 辅助函数调用的前后关系
        • 时钟
        • 消息队列
        • 信号量
        • 睡眠
        • 计时器
  • 注意事项
    • 线程默认堆栈大小和线程默认优先级
    • 线程调度策略
    • FreeRTOS上的TI-POSIX
    • 二进制信号量

平台:Code Composer Studio 10.4.0
MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件
(MSP-EXP432P401R)


本文内容机翻自
SimpleLink™ MCU SDKs: RTOS and POSIX 和 TI-POSIX User’s Guide

简介

       SimpleLinkTM 微控制器(MCU)平台的软件开发工具包(sdk)具有通用组件和特定于设备的中间件,加快了上市时间,并提供了有线和无线设备的 SimpleLink 整个 MCU 组合的统一开发经验。关于 SimpleLink SDK 的框图,请参阅下图。在本文中,我将更深入地探讨 SimpleLink SDK 中包含的组件如何使您能够使用实时操作系统(RTOS)创建确定的、高效的、可伸缩的应用程序。
在这里插入图片描述

TI-RTOS

       TI-RTOS SimpleLink SDK 集成了 TI-RTOS,一个功能齐全的实时操作系统。所有 TI SimpleLink sdk 都预先安装了 TI-rtos 内核,并且与 Portable Operating System Interface (POSIX)兼容。TI-RTOS 是一个您可以信任的健壮解决方案,已经部署在各种 TI 嵌入式解决方案的数千个应用程序中。内核是开放源码的(开源 BSD [ BSD ]许可证) ,与 TI 的硅组合同步开发,以实现非常低的延迟,高效的代码占用。TI-RTOS 帮助您优化您的应用程序的功耗,性能和代码大小,以满足您的独特需求。具体地说,TI-RTOS 的电源管理功能使您能够以最小的努力和直观的应用程序编程接口(api)为应用程序实现积极的功耗节省。
       TI-RTOS 内核的中心是调度程序,它确保最高优先级的线程正在运行。这提供了确定性和快速的运算。TI-RTOS 支持四种不同类型的线程: 硬件中断(Hwis)、软件中断(Swis)、任务和空闲,如下面的图2所示。TI-RTOS 提供了几种线程通信机制,如信号量、邮箱、队列、门和事件。此外,TI-RTOS 包括系统级的计时服务和内存管理器,以确保您的应用程序尽可能高效和精简。
在这里插入图片描述

FreeRTOS

       开发 SimpleLink SDK 是模块化的,允许您在 ti-RTOS 之外使用可选的 RTOS 内核。除了 TI-RTOS,MSP432™ 和 Wi-Fi ® CC3220软件开发包(sdk)还包括使用流行的 FreeRTOS 的能力。SimpleLink sdk 的模块性使您可以轻松插入首选的操作系统/内核,从而获得最大的灵活性。

POSIX

       POSIX The SimpleLink SDK 还提供了与 POSIX 兼容的 api。POSIX 是一个电气和电子工程师协会(IEEE)的操作系统兼容性 API 行业标准。POSIX 层抽象了应用程序使用的 RTOS 内核功能。在典型的应用程序中,POSIX 层只需要少于2KB 的代码,因此可以重用示例和用户应用程序,并将其移植到不同的内核。使用这个层是可选的,但是这意味着你可以使用任何你目前熟悉的或者将来想要移动到的操作系统。POSIX 兼容性还允许 TI 第三方合作伙伴与 SimpleLink SDK 设备进行接口,以增加对其内核的支持,从而为包括 FreeRTOS 在内的任何操作系统的设计提供完全自由。

运行时对象查看器 (Runtime Object Viewer)

       运行时对象查看器为了帮助您优化启用 rtos 的应用程序,TI 提供了强大的工具来帮助您调试和监视代码。具体来说,Runtime Object Viewer (ROV2)提供了一个强大的可视化和检测界面,可以帮助您监视线程状态、堆使用情况和中央处理器(CPU)负载。下面的图3显示了一些可用的仪表板,以帮助您进行调试。尽管 ROV2可以为您支持 RTOS 的应用程序提供有用的洞察力,但 ROV2工具具有足够的灵活性,可以在应用程序中显示与任何库、 RTOS 或其他相关的高级信息。
在这里插入图片描述

TI-POSIX 介绍

在源代码中使用 POSIX

在源代码中使用 Open Group Specification 定义的文件名包含 POSIX 头文件。例如,使用以下命令创建一个 POSIX 线程:

#include <pthread.h>void *start_fxn(void *arg);
pthread_t thread;
int arg = 1;pthread_create(&thread, NULL, start_fxn, (void *)&arg);

在 SYS/BIOS 的以前版本中,POSIX 头文件使用包限定的路径名包含在内。这已经不再受支持了。不要使用下列包括语句:

#include <ti/sysbios/posix/pthread.h>       INCORRECT
#include <ti/sysbios/posix/sys/types.h>     INCORRECT

使用以下包括语句:

#include <pthread.h>
#include <sys/types.h>

TI-POSIX支持的函数摘要

在实时操作系统前后关系中,有三种前后关系:
main
在main()函数中,在调用RTOS调度器之前
task
在本地RTOS线程中(即不是从pthread中)
interrupt
在中断服务程序中

线程函数调用的前后关系

线程管理

函数名用途maintask
pthread_cancel向线程发送取消请求NoYes
pthread_cleanup_pop弹出线程取消清理处理程序NoYes
pthread_cleanup_push推取消线程清理处理程序NoNo
pthread_create创建一个新线程YesYes
pthread_detach分离一个线程NoYes
pthread_equal比较线程 idYesYes
pthread_exit终止调用线程NoNo
pthread_getconcurrency不支持
pthread_getcpuclockid不支持
pthread_getschedparam用于获取 pthread 的优先级NoYes
pthread_getspecific获取调用线程的线程特定数据NoNo
pthread_join用终止线程连接NoYes
pthread_key_create创建特定于线程的数据键NoNo
pthread_key_delete删除线程特定的数据键NoNo
pthread_once运行一次初始化例程NoYes
pthread_self获取调用线程的 IDNoNo
pthread_setcancelstate设置取消能力状态和类型NoNo
pthread_setcanceltype不支持。只支持异步取消
pthread_setconcurrency不支持
pthread_setschedparam用于设置线程的优先级NoNo
pthread_setschedprio不支持。使用 pthread_setschedparam 来设置优先级
pthread_setspecific设置调用线程的线程特定数据NoNo
pthread_testcancel不支持

线程属性

函数名用途maintask
pthread_attr_destroy销毁线程属性对象YesYes
pthread_attr_getdetachstate获取属性对象中的分离状态YesYes
pthread_attr_getguardsize获取属性对象中的保护大小YesYes
pthread_attr_getinheritsched不支持的内核调度策略是固定的
pthread_attr_getschedparam获取属性对象中的调度参数YesYes
pthread_attr_getschedpolicy不支持的内核调度策略是固定的
pthread_attr_getscope不支持的内核没有进程的概念
pthread_attr_getstack获取堆栈大小和地址属性YesYes
pthread_attr_getstacksize获取属性对象中的堆栈大小YesYes
pthread_attr_init初始化线程属性YesYes
pthread_attr_setdetachstate在属性对象中设置分离状态YesYes
pthread_attr_setguardsize在属性对象中设置保护大小YesYes
pthread_attr_setinheritsched不支持的内核调度策略是固定的
pthread_attr_setschedparam在属性对象中设置调度参数YesYes
pthread_attr_setschedpolicy不支持的内核调度策略是固定的
pthread_attr_setscope不支持的内核没有进程的概念
pthread_attr_setstack设置堆栈大小和地址YesYes
pthread_attr_setstacksize设置堆栈大小YesYes

线程同步

函数名用途maintask
pthread_barrier_destroy摧毁一个障碍物YesYes
pthread_barrier_init初始化一个障碍物体YesYes
pthread_barrier_wait在屏障处同步NoYes

障碍属性

函数名用途maintask
pthread_barrierattr_destroy破坏 barrier 属性对象YesYes
pthread_barrierattr_getpshared不支持的内核没有进程的概念
pthread_barrierattr_init初始化 barrier 属性对象YesYes
pthread_barrierattr_setpshared不支持的内核没有进程的概念

条件变量

函数名用途maintask
pthread_cond_broadcast取消阻止条件变量上阻塞的所有线程NoYes
pthread_cond_destroy为条件变量分配的可用资源YesYes
pthread_cond_init分配和初始化条件变量YesYes
pthread_cond_signal取消阻止等待条件变量的线程NoYes
pthread_cond_timedwait使用超时等待条件变量NoYes
pthread_cond_wait等待条件变量NoYes

条件变量属性

函数名用途maintask
pthread_condattr_destroy销毁条件变量属性对象YesYes
pthread_condattr_getclock不支持
pthread_condattr_getpshared不支持
pthread_condattr_init初始化条件变量属性对象YesYes
pthread_condattr_setclock不支持
pthread_condattr_setpshared不支持

互斥锁

函数名用途maintask
pthread_mutex_destroy为互斥对象分配的自由资源YesYes
pthread_mutex_getprioceiling获取互斥锁的优先级上限YesYes
pthread_mutex_init分配和初始化互斥对象YesYes
pthread_mutex_lock锁定互斥锁NoNo
pthread_mutex_setprioceiling设置互斥锁的优先级上限NoYes
pthread_mutex_timedlock等待带超时的互斥对象NoNo
pthread_mutex_trylock锁定一个互斥锁,如果它是可用的,不阻塞返回NoNo
pthread_mutex_unlock解锁调用线程拥有的互斥对象NoNo

互斥属性

函数名用途maintask
pthread_mutexattr_destroy销毁互斥属性对象YesYes
pthread_mutexattr_getprioceiling获取互斥锁属性对象的优先级上限YesYes
pthread_mutexattr_getprotocol获取互斥锁属性对象的协议YesYes
pthread_mutexattr_getpshared不支持
pthread_mutexattr_gettype获取互斥类型属性YesYes
pthread_mutexattr_init初始化互斥属性对象YesYes
pthread_mutexattr_setprioceiling设置互斥对象的优先级上限YesYes
pthread_mutexattr_setprotocol设置互斥锁属性对象的协议YesYes
pthread_mutexattr_setpshared不支持
pthread_mutexattr_settype设置互斥类型属性YesYes

读写锁定

函数名用途maintask
pthread_rwlock_destroy销毁一个读写锁对象YesYes
pthread_rwlock_init初始化一个读写锁对象YesYes
pthread_rwlock_rdlock锁定读写锁对象进行读取NoNo
pthread_rwlock_timedrdlock锁定一个读写锁对象,用于超时读取NoNo
pthread_rwlock_timedwrlock使用超时锁定写入的读写锁定NoNo
pthread_rwlock_tryrdlock尝试读写锁以进行读取(非阻塞)NoNo
pthread_rwlock_trywrlock尝试使用读写锁进行写入(非阻塞)NoNo
pthread_rwlock_unlock解锁一个读写锁对象NoNo
pthread_rwlock_wrlock锁定一个读写锁对象进行写入NoNo

读写锁属性

函数名用途maintask
pthread_rwlockattr_destroy销毁读写锁属性对象YesYes
pthread_rwlockattr_getpshared不支持
pthread_rwlockattr_init初始化读写锁属性对象YesYes
pthread_rwlockattr_setpshared不支持

辅助函数调用的前后关系

时钟

函数名用途maintask
clock_gettime获取当前时间YesYes
clock_nanosleep高分辨率睡眠,可指定时钟NoYes
clock_settime为CLOCK REALTIME时钟设置当前时间YesYes

消息队列

函数名用途maintask
mq_close关闭消息队列YesYes
mq_getattr获取消息队列属性YesYes
mq_open打开一个消息队列YesYes
mq_receive从消息队列接收消息NoYes
mq_send向消息队列发送消息NoYes
mq_setattr设置消息队列属性YesYes
mq_timedreceive接收来自消息队列的消息,带有超时NoYes
mq_timedsend使用超时向消息队列发送消息NoYes
mq_unlink删除消息队列YesYes

信号量

函数名用途maintask
sem_destroy销毁一个信号量YesYes
sem_getvalue获取信号量计数YesYes
sem_init初始化信号量YesYes
sem_post解锁一个信号量(即增加信号量计数)YesYes
sem_timedwait带超时锁定信号量NoYes
sem_trywait尝试锁定信号量(非阻塞)NoYes
sem_wait锁定信号量NoYes

睡眠

函数名用途maintask
nanosleep高分辨率睡眠NoYes

计时器

函数名用途maintask
timer_create创建一个计时器YesYes
timer_delete删除计时器YesYes
timer_gettime获取计时器到期之前的时间YesYes
timer_settime设置计时器下一次到期的时间YesYes

注意事项

线程默认堆栈大小和线程默认优先级

int pthread_attr_init(pthread_attr_t *attr)

pthread_attr_init()使用默认值初始化所指向的对象,其中包括堆栈大小和线程优先级。pthread_attr_t、attr
在 TI-RTOS 上,默认堆栈大小在配置脚本中定义。

var Task = xdc.useModule('ti.sysbios.knl.Task');
Task.defaultStackSize = 0x800;

在 FreeRTOS 上,使用 FreeRTOS.config.h 和 portmacro.h 头文件中定义的值计算默认堆栈大小如下。

configPOSIX_STACK_SIZE * sizeof(portSTACK_TYPE)

注意,这是一个自定义符号,定义在SDK中的FreeRTOSConfig.h头文件中。h头文件是在FreeRTOS发行版中附带的。configPOSIX_STACK_SIZE
优先级设置为1,这是Idle任务之外允许的最低优先级,Idle任务的优先级为0。

线程调度策略

int pthread_getschedparam(pthread_t pthread, int *policy, struct sched_param *param)
int pthread_setschedparam(pthread_t pthread, int policy, const struct sched_param *param)

RTOS 内核使用了一个基于优先级的调度程序

FreeRTOS上的TI-POSIX

我们已经尽最大努力在TI-RTOS和FreeRTOS之间提供同样的支持。然而,这里也有一些例外。
没有办法将堆栈传递给xTaskCreate()。

pthread_attr_setstack() // - not supported on FreeRTOS

互斥锁的优先级继承由 FreeRTOS 处理。如果优先级较高的任务试图获取互斥锁,则拥有互斥的任务的优先级会暂时提高。因此,FreeRTOS 不支持互斥协议。

pthread_mutexattr_getprotocol() //- not supported for FreeRTOS
pthread_mutexattr_setprotocol() //- not supported for FreeRTOS
pthread_mutexattr_getprioceiling() //- not supported for FreeRTOS
pthread_mutexattr_setprioceiling() //- not supported for FreeRTOS

只有CLOCK_REALTIME被clock_settime()支持
timer_settime() 这是一个阻塞调用,与 TI-RTOS 不同
任务清理由 FreeRTOS 中的 Idle 任务完成。如果 pthreads 被删除,请确保 Idle 任务有机会运行到已删除线程的空闲分配内存中。

二进制信号量

. POSIX不支持二进制信号量。也就是说,一个信号量可以被传递多次,但计数不能大于1。下一个等待将计数减少到0
幸运的是,使用互斥量和条件变量很容易构建二进制信号量。下面是一个伪代码示例。

struct binary_semaphore {pthread_mutex_t mutex;pthread_cond_t cvar;int v;
};void mysem_post(struct binary_semaphore *p)
{pthread_mutex_lock(&p->mutex);p->v = 1;pthread_cond_signal(&p->cvar);pthread_mutex_unlock(&p->mutex);
}void mysem_pend(struct binar_semaphore *p)
{pthread_mutex_lock(&p->mutex);while (!p->v) {pthread_cond_wait(&p->cvar, &p->mutex);}p->v = 0;pthread_mutex_unlock(&p->mutex);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcgis创建postgre企业级数据库

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

[floyd+路径输出]HDU1385 Minimum Transport Cost

题目链接 题目翻译: 有N个城市&#xff0c;然后直接给出这些城市之间的邻接矩阵&#xff0c;矩阵中-1代表那两个城市无道路相连&#xff0c;其他值代表路径长度。 如果一辆汽车经过某个城市&#xff0c;必须要交一定的钱(可能是过路费)。 现在要从a城到b城&#xff0c;花费为路…

MSP432P401R TI Drivers 库函数学习笔记(三)认识任务的创建及图形化配置

目录任务的简单创建图形化配置上手简简单单点个灯配置引脚建立任务实验结果整体代码main.cmyTask.cmyTask.h平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) 任务的简单创建 根据上篇机翻的函数作用…

JavaScript实现自适应宽度的瀑布流

摘要: 主要介绍瀑布流的一种实现方法&#xff1a;绝对定位(css)javascriptajaxjson。简单一点如果不做滚动加载的话就是绝对定位(css)javascript了&#xff0c;ajax和json是滚动加载更多内容的时候用到的。 这样的布局并不陌生&#xff0c;从2011年Pinterest创立以来&#xff0…

.net web 开发平台- 表单设计器 一(web版)

如今为了适应需求的不断变化&#xff0c;动态表单设计器应运而生。它主要是为了满足界面的不断变化和提高开发速度。比如&#xff1a;一些页面客户可能也无法确定页面的终于布局&#xff0c;控件的位置&#xff0c;在哪种情况下显示或不显示等可能须要随时改动。为了应对这些需…

.NET程序配置文件操作(ini,cfg,config)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP432P401R TI Drivers 库函数学习笔记(四)GPIO

目录API头文件函数 (机翻)宏GPIO驱动程序api返回的通用状态代码GPIO_PinConfig输出引脚配置宏GPIO_PinConfig输入引脚配置宏GPIO_PinConfig中断配置宏特殊的GPIO_PinConfig配置宏类型别名示例配置引脚示例配置外部中断示例上机实战配置引脚main.cmyTask.cmyTask.h实验结果平台&…

# Vue3 toRef 和 toRefs 函数

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

二分检索函数lower_bound()和upper_bound()

二分检索函数lower_bound()和upper_bound() 一、说明 头文件&#xff1a;<algorithm> 二分检索函数lower_bound()和upper_bound() lower_bound()&#xff1a;找到大于等于某值的第一次出现upper_bound()&#xff1a;找到大于某值的第一次出现必须从小到大排序后才能用 内…

MSP432P401R TI Drivers 库函数学习笔记(五)PWM

目录API (机翻)函数上机实战配置引脚PWM初始化&#xff0c;实现简易呼吸灯的效果实验结果完整代码myPWM.cmyPWM.hmyTask.cmyTask.hmain.cmain.h平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) API …

防火墙配置十大任务之十,构建虚拟防火墙

防火墙配置任务十构建虚拟防火墙任务拓扑图10.11.inside区域的交换机的基本配置&#xff0c;在交换机上开启vlan2&#xff0c;vlan3&#xff0c;vlan4.三个vlan。图10.22.outside区域的Internet基本配置。图10.33.交换机上连接防火墙接口的配置。图10.44.inside区域各个PC的主机…

使用纯 CSS 实现超酷炫的粘性气泡效果

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP432P401R TI Drivers 库函数学习笔记(六)UART 串口

目录API (机翻)上机实战配置初始化和实验实验结果整体代码myUart.cmyUart.hmyTask.cmyTask.hmain.cmain.h平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) API (机翻) 官方UART API 手册 void UA…

Linux 批量杀死进程(详细版本)

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP432 库函数实现 PID 电机调角度、调速

目录引脚配置PWM引脚外部中断测量编码器引脚配置代码部分初始化编码器解读Encoder.cEncoder.h测速和控制部分卡尔曼滤波器&#xff0c;用于对所测速度进行滤波kalman.ckalman.h实验效果速度滤波效果控速效果控角效果平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R …

20.网页卷去的距离与偏移量

我们先来看看下面的图&#xff1a; scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 &#xff0c;即左边灰色的内容。 scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 &#xff0c;即上边灰色的内容。 offsetLeft:获取…

【电赛】一阶卡尔曼滤波器 滤波效果良好

目录代码kalman.ckalman.h滤波效果很久以前抄的&#xff0c;忘了是从哪弄的了 我把它改成了这种结构体指针传参的形式&#xff0c;方便在比赛中应用。应用举例见MSP432 PID 电机调角度、调速。 它曾助力笔者获2020年电赛省一等奖。 代码 Q:过程噪声协方差 Q参数调滤波后的曲线…

计算机是如何启动的?

从打开电源到开始操作&#xff0c;计算机的启动是一个非常复杂的过程。 我一直搞不清楚&#xff0c;这个过程到底是怎么回事&#xff0c;只看见屏幕快速滚动各种提示......这几天&#xff0c;我查了一些资料&#xff0c;试图搞懂它。下面就是我整理的笔记。 零、boot的含义 先问…

hdu 1536(博弈)

传送门&#xff1a;S-Nim 题意&#xff1a;给n个数的集合s&#xff0c; 再给m 组数据&#xff0c;每组表示 k 堆石子&#xff0c;每次可以取的个数只能是集合s中的数量。问先手胜还是输&#xff1f; 分析&#xff1a;sg函数的经典运用&#xff0c;先预处理出所有数量为0~10000的…

写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…