HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

腾讯物联网操作系统 TencentOS tiny 架构解析与实践

  • 2019-11-05
  • 本文字数:8384 字

    阅读完需:约 28 分钟

腾讯物联网操作系统 TencentOS tiny 架构解析与实践

7 月 27 日,云+社区技术沙龙第 24 期“物联网技术与应用”圆满落幕。本期沙龙特邀请腾讯云技术专家对腾讯云全栈物联网产品进行了深度揭秘,针对腾讯云 IoT 全栈产品中的 IoT 平台、边缘计算、物联网安全、物联网操作系统、AIoT 这五个产品进行全面的技术剖析和满满干货分享。下面是汪礼超老师关于腾讯物联网操作系统 TencentOS tiny 的相关技术及应用的分享。

项目背景

我们知道在 2009 年的时候,温家宝总理第一次在无锡提出物联网“感知中国”战略,那个时候起物联网开始蓬勃发展。特别是 2015-2016 年的时候,随着低功耗广域网技术的推出,比如说 NB-IoT、LoRa 这种新兴技术的提出来,物联网基本上成一个井喷式的发展。原来我们的物联网是短距的一些通信,像 WI-FI、蓝牙这种,但是随着广域网的发展,物联网真正能够铺开面,实现广域大范围的连接。


据权威数据的统计,仅 2018 年的时候国内的物联网市场就已经达到 1 万亿,到 2020 年预测数据可以达到 1.5 万亿。针对这么大的一个市场,我们腾讯也在整个 loT 领域有完整的生态链产品布局,前面我们的同事也介绍过,目前来说我们基本上能支持物联网在整个生态链条里面各种行业应用,包括生活物联、智慧城市、公共事业、智能制造、智慧能源等等。其实我们 TencentOS tiny 物联网操作系统在这个生态领域也扮演非常重要的角色,他是我们整个生态链底层最关键的一环。



我们知道云的发展非常迅速,云上有非常多的人工智能模型以及大数据的模型。如果这些模型缺少数据,也是没有用武之地的。那么我们端侧物联网操作系统,在底层担任一个非常重要的角色,他的一个主要作用是为云侧引流,把我们终端设备或者说哑终端通过操作系统这样一个终端软件做使能,把他变成一个智慧化的终端,把数据送到云端。这样云端的边缘计算也好,大数据分析也好,才能真正能结合业务场景做一些具体的分析,真正使终端设备智能化。我们的物联网操作系统就能够一定程度上促进整个物联网的生态、乃至我们腾讯主导的产业物联网的发展。

TencentOS tiny 简介

接下来我们详细了解一下我们 TencentOS tiny 到底是什么样的产品。TencentOS tiny 是腾讯面向物联网领域开发的一个实时操作系统,他具有低功耗、低资源占用、模块化以及安全可靠等特性。主要的目的是希望能够简化物联网终端的开发,让我们的终端厂家或者芯片模组厂家,真正在开发自己业务的时候,能比较简单的去实现自己的业务功能。那么基于我们这个 OS,我们提供了最精准的 RTOS 内核,以及在 RTOS 内核上提供了一个丰富的 IoT 组件,包括我们主流的物联网协议栈以及腾讯云 SDK 的支持,方便我们终端设备及业务快速的接入到我们腾讯云的物联网开发平台。


我们目前已经跟主流的芯片和模组厂商达成了合作,包括意法半导体以及我们国内的华大半导体,通过我们 OS 使能这些芯片或者是模组,从而让业务能快速接入到我们的平台,从而支持智慧城市以及多种物联网行业的应用。当然我们希望有更多的合作伙伴加入到我们这个行业来,跟我们一起来扩展物联网终端的生态,共同促进我们整个行业的发展。



接下来我简单介绍一下 TencentOS tiny 在 2019 年下半年短期规划。今天这个沙龙之后,我们会开启一个内测,也就是说 8 月初的时候我们正式会开启内测,等一下我会给大家提供一个报名方式,大家可以通过这个方式来报名参加我们的内测。预计 10 月份的时候,我们会正式把所有的 TencentOS tiny 源码放到 GitHub 上正式的开源,也欢迎大家跟我们一起贡献代码一起扩展生态。正式开源之后,我们会逐步寻求一些商业合作的机会,尽量有一些标杆项目真正商业落地。预计在年底的时候我们会树立几个比较好的标杆项目,有兴趣的朋友可以跟我们一起来合作,做一些比较好的商业案例。


TencentOS tiny 的软件架构

接下来我详细介绍一下 TencentOS tiny 的软件架构。下边这张图是我们 TencentOS tiny 架构全景。

1. OS 支持 CPU 和 MCU

我们先从这个架构图的最低往上看,首先我们是 OS 支持 CPU 和 MCU,目前来说主要是 ARM CORTEX 系列。我们知道 ARM CORTEX 系列在物联网领域基本上是占比 60%到 70%的市场份额。未来我们还会考虑支持更多的 IP 和架构。比如说 ESP8266 以及新的开源架构 RISC-V,也欢迎大家一起跟我们共建这个 CPU 生态。


2. 外设管理

往上我们会提供一些 CPU 外设的驱动管理以及板级驱动包的管理,还有我们基本外设的管理。像很多开发的朋友都遇到了一些硬件适配非常难,业务层调用底层的硬件非常复杂,我们会在 OS 上面提供统一的框架来帮大家减少我们硬件的差异。

3. 操作系统的内核

在这个驱动上面是我们的操作系统的内核,我们的内核相比业界更简洁,整个架构更清晰。我们减少了一些复杂的操作,支持 90%可能会用到的一些功能,其他功能支持都做了优先级。所以我们整个内核体积会非常轻量,代码非常清晰,开源之后大家可以看一下。虽然这个内核比较精简轻量,但是也会支持主流芯片的一些功能。比如说,任务管理、实时调度、时间管理、中断管理、内存管理、异常处理,还有 IPC 组件都是支持的。

4. OS 适配层

在内核的上层,我们也支持主流的 OS 适配层,比如说 CMSIS。使用这种 CMSIS 接口给用户业务层来调用,可能从其它平台迁移过来非常简单。我们的基础内核上层也构建了非常多的 IoT 组件以及连云的一些支持,比如说左侧是我们整个 IoT 协议上的支持,目前来说主要支持,像上层的应用层协议,也支持我们安全连接的一些协议。

5. 协议栈

往下层我们会支持很多链路层的一些协议,比如网络 WI-FI、BLE、LoRa、NB-IoT 等等。当然可能大家在平时的物联网场景中,使用最多是通信模组。大家都知道更多的是通过 AT 指令交互,在这个层面上我们为了简化用户的工作量,也提供了一个 AT 框架适配层。希望是屏蔽复杂的 AT 交互逻辑,把一些 AT 命令处理,比如异步收发的机制尽量简化,用我们的框架来管理。用户只需要调上层的 API 就可以了,从而简化下面的网络模组的适配工作量,也简化业务层次的调用逻辑。

6. 框架提供

除了这个协议栈,我们也提供了一些丰富的框架,主要有设备框架、文件系统、OTA 升级、KV 存储等,OTA、JS 引擎、KV 存储我们还在规划,其他的功能现在我们已经完成开发。往上我们也会提供一些标准的 API,我们希望这些 API 尽量简洁,能够支撑连云业务,不希望暴露复杂的接口给用户,复杂操作尽量屏蔽在下层。用户在使用这些 API 连云,基本上只需要初始化,可能填一个 IP、端口就初始化好了,接下来业务只要发数据,收数据就可以了,完成后再关闭连云的链接。大部分业务调用四个接口就能解决问题。我们后续会尽量让所有的联网方式往这个目标去靠。在 API 上层,我们会提供常用物联网的参考案例,比如说如何去连腾讯云的平台,我怎么去使用文件系统或者使用我的低功耗框架,这些都会提供一些基础案例给用户做参考,用户可以基于这些 demo 做一些扩展,更方便开发自己的物联网应用。


在物联网通信过程中,我们也会支持一些安全框架。比如说腾讯的 TID 安全的认证,在我们的端侧 OS 也会作为一个组件集成进来。以及我们 OS 自已有提供的一些白盒加密以及 TLS 认证和数据加密的支持。总体而言,我们的 TencentOS tiny 有以下几个优势:


  • 第一个,我们最小的内核可以达到 RAM0.6KB,ROM1.8KB,而且我们基于一个典型的 LORA 模组,测试了一个烟感应用的资源数据,大概 RAM 占 3.3KB,ROM 占 12KB 的样子,这个是包括所有的 OS 内核底层的驱动以及我们简单的测试业务,大概是这么一个体量。

  • 第二个,低功耗。这里我们实测最低的休眠功耗可以达到 2 个微安,这个基于我们 OS 内部的一个 Tickless 机制,也就是说你没有业务的时候,OS 会让芯片处于一个休眠的状态,另外我们对一些常用高耗电外设提供了外设功耗的管理方式。但是这个需要用户去配置,根据具体的业务去调整,我们只提供这个框架供内核层调用,而且要求用户外设在硬件上做一些支持。

  • 另外刚才讲到我们 OS 有丰富的 IoT 组件,这里主要是一些 IoT 协议栈,还有 AT 框架以及我们支持的 OTA 升级。目前来说我们 OTA 升级有支持分块压缩以及差分的方式,这个在后续会逐步的开源出来。

  • 另外还有一个可靠的安全框架。我会有一些多样化的安全分级方案,很多对安全不敏感的业务,他可能并不关心这个数据被泄露,你可能只需要认证就可以了,跟平台完成一个认证,你不需要在数据加密做很多,可能选择级别比较低的安全方案就可以了,这样你的成本可能就下来了。我们提供了大概有五个层次的安全分级方案,供用户选择。你可以根据自己的业务需求进行选择,均衡你的成本控制。

  • 良好的可移植性。我们所有的组件,包括内核以及上面的 IoT 组件框架,都做好了高度解耦,尽量把跟其他模块之间的连接都做成可适配的层次。我们 TencentOS tiny 会保持包容的心态,比如说大家在物联网开发中,原先业务使用了其他的操作系统,那么你不想切操作系统的内核,我们也欢迎大家使用 TencentOS tiny 的组件,我们认为组件也是我们 OS 的一部分。使用了我们组件,也就是使用了我们的 OS。所以说在很多组件的适配层上,我们都做了兼容性优化,欢迎大家去移植使用。

  • 另外一个方便的调试手段。目前来说我们是唯一提到这样的概念,因为很多物联网的终端设备是在一个荒郊野外或者很远的地方,他出现问题的时候,非常难定位。为了能够让我们去减少这个问题,当终端出现问题的时候,最后一次死机了,会把一些信息记录下来,他再重启的时候首先把错误数据上报云端,也就是说错误的一些信息,包括出现问题的状况,我们可能在云端就能查到,不需要开发人员到偏远的地区,到现场去定位,这也是增加一个调试手段,让大家的物联网业务问题定位更简单。

如何使用 TencentOS tiny

接下来我们看一下到底如何使用我们的 TencentOS tiny,这里有一个简单的开发引导。如图所示,是我们一个简单的入门流程。首先大家需要熟悉我们的源码结构,然后移植我们的基础内核,然后大家可以创建我们的 TencentOS tiny 的任务,再学习我们任务之间的 IPC 通信,以及学会怎么在我们的 OS 上进行内存管理。这个完成之后,接下来是网络上面的联网支持,比如说学会使用我们的 AT 框架,怎么使用腾讯云的(CSDK)上云。


1.TencentOS tiny 的源码目录

首先我们来看一下 TencentOS tiny 整体的源码目录,这个目录很长,我一个一个讲。第一个目录主要是放置我们 TencentOS tiny 支持的 IP 和架构,比如说我们支持 ARM 中断,调度汇编以及 tick 相关的代码就存放在这个目录。


BOARD 目录是我们支持的一些开发板或者说一些硬件列表,这里我只放了一个,是我们的定制开发板。Component 主要放置我们 OS 上面的组件,比如说 IOT 协议栈,比如说 COAP、MQTT 以及我们腾讯云的(C-SDK)。FS 主要放的是文件系统,Security 主要是放我们 TencentOS tiny 的安全协议代码,以及我们白盒加密的一些安全特性代码。Device 会放一些网络模组的驱动,比如说我们常用的一些网络模组 BC35、BC26,模组的一些驱动放在这下面。


DOC 开发文档的目录,到时候大家重点需要关注 DOC 目录,这里面有非常多的开发指南,以及 SDK 的说明,以及我们开发板的使用指南等等。kernel 主要分为基础内核和头文件,以及 PM 是我们低功耗框架的一些源码。



NET 目录这个部分主要是我们提供的网络适配框架、AT 框架以及我们封装的 API 适配框架。这个是设备通信层的适配框架,还有这个是腾讯定制模组的 AT 框架,前面我们同事也介绍过的,OS 也是支持定制模组接入的。


Osal 目录是 OS 基础内核抽象层 API,主要是兼容业界的 ARM CMSIS OS 标准。PLATFORM 主要是我们支持的一些芯片板级的驱动。这个 HAL 是内核头文件定义的针对具体某个芯片的驱动实现,如串口、GPIO 的实现,会分不同的芯片厂商放在这个上面,基本上替大家做好了移植,大家不需要自己去适配,或者说大家可以参考这个模版,按自己需要实现的平台实现就可以了。


Test 的目录主要是放我们整个 TencentOS tiny 测试框架及测试用例,目前来说我们整个 OS 的内核包括我们所有组件,都有非常多的测试用例。Test 会做稳定性的测试或者是极端性的测试,保证我们内核的稳定性。Tools 主要存放的是我们 TencentOS tiny 提供的一些工具,比如说有一些自动化脚本,包括一些配置文件的生成,会放一些工具在上面。

2. TencentOS tiny 的移植

介绍完源码之后,我们看一下到底去怎么移植,我们移植的时候一般只需要关注这四个目录就可以了。


这个是我们 TencentOS 通用的移植步骤,我这里会把移植步骤做一个简单的描述。我不会展开,因为具体的移植流程会在我们的文档里面会有详细的体现。首先第一步我们需要准备目标硬件,如果你选用的是我们官方支持的模版硬件,不需要做移植。如果你使用自己的 MCU,你可能需要做一下移植。移植的基本步骤,我们先介绍一下定制开发板,刚才我们在外面也展示了,主要是联合合作伙伴做的一个开发板,方便大家来体验 TencentOS tiny 内核以及一些功能。目前来说,这个板他有一个好处是左侧可以去扩展不同的传感器,右侧支持非常多不同的联网方式,比如说 WI-FI、蓝牙这些都是支持的,大家可以根据情况选择不同的方式。



准备好硬件之后,再选择一个编译环境,当前我们 TencentOS 支持三个编译器,KEIL、IAR、GCC。大家需要准备一个芯片对应的裸机工程,能运行基本功能,比如说串口 printf 打印,STM32 系列芯片都可以用 CubeMX 自动生成。在这个基础上,把内核的源码和头文件加到工程里面来,去配置好 tick 中断,我们的系统是需要 tick 中断去支持的。另外修改系统的配置项,这里面可以对我们整个内核的模块进行配置,包括你要不要使用信号量,你要不要使用队列等。最后一个是编写一些测试任务进行移植验证就可以了。

3. OS 内核里面的一些使用方式

接下来我展开讲一下 OS 内核里面的一些使用方式。首先我们了解一下我们 TencentOS 的启动流程。在芯片上电之后,我们首先会做一个板级初始化,主要做什么事情?主要是初始化一些比如说时钟、串口、GPIO 等基本的外设。接下来就可以进行内核初始化,初始化内核之后,你再去创建自己想创建的任务,调用 TOS START 就可以启动这个内核,进行任务调度。目前来说主要常见的任务创建流程主要是自己写这个业务函数入口,配置好任务优先级,调用这个创建就可以了,这边有一个简单的事例,整个 OS 的任务创建流程都有的。右边是我们任务模块提供的 API,都是非常精简,常用的。



接下来要学会怎么去用 IPC 通信模块。我们目前基础内核 IPC 通信模块主要包括互斥量、信号量、事件、队列。互斥量主要是用于共享资源的互斥排他性访问保护。这个说白了是一个锁,我要用这个资源先锁了,用完了之后再释放,让其他有机会去使用这个资源。信号量也是我们任务间同步的一个机制,主要解决生产者和消费者的问题。比如说我们在消费需要调用 PEND 去等待这样一个资源,他会调用一个 POST 去释放,然后通知刚才 PEND 的任务去使用。同样还有事件,但事件不同于信号量,他可能释放一个事件触发多个任务去响应这个事件。队列可能会提供一些任务之间的数据传递,不单单是同步,可能更多在任务中间传递整个的数据。右边我们 IPC 所有的接口都在这里,大家都可以参考这个接口 API 去使用。



OS 内存管理。我们当前主要有两个内存管理模块,一个是支持动态内存的堆内存管理,还有一个是静态内存的块内存管理,其实基本的使用流程都差不多。刚开始我们需要在配置文件里面把这个功能模块使能了,我们需要调用函数去创建一个内存池。同样块内存的使用方式也非常类似的,我们申请一个内存池然后去分配释放。另外我们的基础内核也还包括系统管理、时间管理、软件定时器、功耗管理等模块。这个我不展开,详细的使用办法可以参考我们的开发指南。



下面我重点介绍一下 TencentOS tiny AT 通信模组适配框架,模组的适配框架。我们知道在平时的物联网产品中使用了非常多的通信模组,而且不同厂家的模组 AT 指令都不太一样。那么业务在使用的时候也不一样。假如说我由于一些特殊的原因,需要更换模组,那么这个去适配起来非常麻烦,或者说你需要做很多的一些变更,从而带来非常大的开发工作量。这里我们希望提供这样一个 AT 框架能帮忙去屏蔽通信模组复杂的数据流处理逻辑,去简化我们上层业务调用的逻辑,从而减少一些开发的工作量。这里我们主要针对几类的模组进行处理:


  • 第一个是通用的空口 TCP/IP 模组。比如说我们一些 WI-FI、NBIoT、2G 模组他支持普通的 TCI/IP 通道,我们基于这些模组去做一层 SAL 层的框架。

  • 另外比如说 LORAWAN 模组,因为 LORA WAN 所有的操作,其实都差不多,我们会归一类做一个适配 API。另外我们同事提到的腾讯定制模组,我们也会针对定制模组提供一 API。那么这样上层用户他所有调用 API 的形式都是一样的,不会变化。



那所有的差异在哪解决?差异在我们的框架及我们通信模组库里解决,也就是说我们会在串口硬件下面,通信模组库里面建立一个庞大的生态库,不说 100%,希望越来越多增加模组驱动,支持市面上 60-70%的通信模组,把市场上主流的都覆盖进来。对于厂家或者是物联网产品开发者,需要选择这个模组的时候,他可以到我们库这个里面来选择,他免去了封装,不需要做移植。因为我们整套都是可以跑通的,直接调上层的 API 就能完成。比如说选择了 ESP8266,他也不用适配,直接调用上层 API,使用我们腾讯云 CSDK 直接上云去了。基本上对模组的适配工作量等于零,对于其他的,比如腾讯定制模组也是一样的。


这里需要讲一个区别是什么呢?腾讯定制的模组,包括 LORA WAN 和 SAL 的一个区别,SAL 因为只提供了基本的 TCP IP 通道,所以你在上面还需要做应用层的协议,比如说 C-SDK。但是腾讯定制模组把 C-SDK 直接植入到模组里面去,也就是说他的 AT 模组集成了应用层协议直接对接到云。所以说这个是有一个区别的。我们同一个框架上能把这几种不同的情况都支持起来,尽量减少用户处理这个 AT 指令包括数据的收发复杂的问题。


当然有人问到你的模组费假如没有支持怎么办?不用担心,我们也提供了非常多的参考例子,实际上是 AT 指令不同,你可以自己根据我们这个框架,把你的模组 AT 指令填进去就可以了。比如说我们可能需要适配的是初始化连接 SEND 这样 AT 的一个实现。这里举了一个简单的例子,ESP8266 的一个操作,他对外 API 这个参数其实是一定,说具体里面的 AT 实现可能每家模组都不一样,你做一下修改就可以了,整个框架不会做太大的变更。

基于 TencentOS tiny 的腾讯云 C-SDK 组件

如何基于 TencentOS tiny 及腾讯 C-SDK 来实现我们的上云。图的左侧是基于 TencentOS 内核的腾讯 C-SDK,也就是说我们把腾讯云的 C-SDK 也纳入到我们 TencentOS tiny 的一部分,也是一个核心的上云组件。我们集成过来跟嵌入式是有一些区别的,我们会在这个基础上做一些优化。首先,我们把 C-SDK 植入到我们的 OS 里面之后,大家可能不需要自己去做,这个东西在我们的 OS 里面,不会让你直接操作。



第二个我们 TencentOS tiny 会向下去建立多种的联网方式,我刚才也讲了,会支持不同的通信模组的接入,你选择其中一个就可以了,向上的业务也简化了。另外我们刚才说了对于资源受限的情况,对于腾讯云的 C-SDK 也做了一些优化和裁剪,尽量降低我们终端使用 C-SDK 的成本。在我们的文档里面也会详细介绍,告诉大家怎么使用腾讯的 C-SDK 上云,这里我不会展开讲。到时候申请内测之后拿到源码以后,我们会有详细的介绍。


Q:您好,我想问一下如果通信不好,比如我这个东西采集一些数据,如果通信不好会不会有些数据有缓存或者有些存储的数据?


A:这个看是在端侧还是在云侧,如果在端侧,你的通信模组在发送的时候他会有一个缓存区的。包括输入数据也是一样的,你发过来也是这样做处理的。你没有发送完成,没有收到一个 ACK 的话,不会去发下一个的。接收的数据会一直往一个里面去放,不会说把他丢掉。而且协议上会保障在通信的时候,比如说 MQTT 通信,你一定要确认 QoS 设置选项,你要确定他收到 ACK 之后,你才能认为发送出去了,没有成功的话只能重发。


Q:您好,我问一下他这个怎么跟安卓 studio 结合,去开发 APP。


A:首先我们 TencentOS tiny 主要是在端侧,在端侧他不会有应用 APP 的开发,当然我们在后续也会想办法在端侧去开发这种端侧应用。但是在嵌入式的方面一般不会直接开发,安卓的应用包括小程序都是在平台,你可以理解为平台的右侧去开发小程序。也就是说我们的数据送到云端之后,你调用腾讯云的一些 API 去开发应用程序,获取到云,通过云端下发命令到平台,平台再下发到我们 OS 这一级。


作者介绍:


汪礼超,腾讯云高级工程师。曾先后在大疆、华为从事嵌入式软件及物联网操作系统相关研发工作。加入腾讯后,主要负责腾讯物联网操作系统 TencentOS tiny 软件架构设计和研发,有丰富的嵌入式软硬件开发及物联网项目经验。


本文转载自公众号云加社区(ID:QcloudCommunity)。


原文链接:


https://mp.weixin.qq.com/s/-KA-_KYSH2n5q6ZtSwcXmg


2019-11-05 10:0920509

评论

发布
暂无评论
发现更多内容

二叉树遍历和分治

泽睿

算法 遍历 分治

阿里云-云开发平台计算篇——加强应用本身的计算能力

若尘

阿里云 云开发 8月日更

架构实战营第四周作业——考试试卷存储

发酵的死神

架构实战营

架构实战营 - 模块 4 - 设计千万级学生管理系统的考试试卷存储方案

雪中亮

架构实战营 #架构实战营

电商秒杀系统设计方案

Lane

毕业设计

青鸟飞鱼

架构实战营-模块4

Cingk

架构实战营-毕业设计

笑春风

写作 7 堂课——【3. 碎片式写作】

LeifChen

时间管理 写作技巧 8月日更 碎片化 心流

毕业总结

梦寐凯旋

#架构实战营

架构实战营模块4作业

子豪sirius

架构实战营

模块四作业

king

架构实战营总结

Lane

FastApi-08-路径参数校验

Python研究所

FastApi 8月日更

网络攻防学习笔记 Day99

穿过生命散发芬芳

态势感知 网络攻防 8月日更

读尽天下源码,心中自然无码

程序员阿杜

8月日更

模块四作业:千万级试卷结构设计

buoge

软件测试基础面试常问问题

程序员阿沐

面试 软件测试 自动化测试 经验分享 测试工程师

iOS官方瘦身方案ODR(二):换肤系统改造|践行 On-Demand Resources

LabLawliet

ios 独立开发者 apple 优化技巧 8月日更

千万级学生管理系统试卷存储场景

张文龙

#架构实战营

架构实战营基于redis哨兵模式的考试数据存储设计

慕溶枫

#架构实战营

prometheus介绍与安装

Rubble

Prometheus 8月日更

番外3. Python OpenCV 中如何绘制各种图形?

梦想橡皮擦

8月日更

架构实战营-毕业总结

笑春风

🏆【Git 实战专题】你知道git rebase如何让代码提交变得清晰明白吗?

洛神灬殇

git Rebase git rebase 8月日更

python--语句的多样性

加里都好

printf函数的常用格式化输出

Changing Lin

8月日更

从0开始的TypeScriptの一:启航

空城机

typescript 大前端 8月日更

架构实战训练营模块四作业

NewBranSTONE

架构实战营

毕业设计:设计电商秒杀系统

Johnny

架构实战营

模块四

Winston

腾讯物联网操作系统 TencentOS tiny 架构解析与实践_文化 & 方法_戴国超_InfoQ精选文章