news 2026/9/16 10:28:11

基于RT-Thread的GD32H759点灯实战:从零搭建工控开发环境

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于RT-Thread的GD32H759点灯实战:从零搭建工控开发环境

1. 项目概述与整体设计思路

1.1 为什么选择GD32H759做工控

GD32H759这颗芯片在工控圈讨论度一直不低。它属于Cortex-M7内核的高性能MCU,最高主频能跑到600MHz,片内Flash最大2MB,SRAM有1MB,还带硬件数学加速、2D图形加速、JPEG硬件编解码、以太网MAC、双CAN-FD这类外设。对于做中高端工业控制器、人机交互面板、数据采集网关的开发团队来说,这个配置放在几年前几乎是MPU级别的资源,现在一颗MCU就能扛下来。

我在实际项目中选它有几个非常现实的理由。第一,性能和资源冗余够大,跑RT-Thread这样的操作系统不会捉襟见肘。工控设备里经常要同时跑逻辑控制、Modbus/CANopen协议栈、本地人机界面、远程通信,这些任务叠加起来对CPU算力和内存的要求不低,H759的1MB SRAM让我不用整天抠内存。第二,它内部带了硬件数学加速器,指令集里包含三角函数、除法等运算,做电机控制、运动控制里的坐标变换能省下大量CPU周期。第三,片内外设接口非常齐全,UART、SPI、I2C、CAN-FD、以太网、USB、SDIO等都是工控设备日常要用到的,不用再外挂一堆扩展芯片。

当然实际选型时也要权衡,这颗芯片的封装从LQFP100到BGA176都有,价格相比传统的F4系列会高一些,但对比同性能的Cortex-A系列方案仍然有优势,尤其是做实时控制任务时MCU的确定性响应是MPU很难替代的。

1.2 为什么选RT-Thread作为软件平台

工控项目做到后面,裸机开发的痛点会越来越明显。任务一多,中断优先级分配、延时管理、各模块之间数据耦合,全靠一个大循环加状态机硬扛,代码会迅速变得难以维护。RT-Thread作为一款实时操作系统,提供了线程管理、信号量、互斥锁、消息队列、事件集、软件定时器这些完整的RTOS组件,正好覆盖了工控开发中最常用的并发与同步需求。

用RT-Thread最大的感受是它的设备驱动框架设计得比较清爽,尤其是pin框架和serial框架。应用层只需要调用rt_pin_writert_device_read这类统一接口,底层寄存器操作都由驱动层封装好了。这样一来,如果后续项目因为供货、成本等原因换用其他芯片,应用层代码的移植工作量会小很多。配合RT-Thread Studio自带的软件包中心,需要什么功能组件直接勾选下载,不用自己去做繁琐的第三方库移植。

1.3 开发方案选型:Studio还是Keil MDK

搭建环境之前需要先把开发方案定下来。目前玩GD32H759 + RT-Thread的主流方式有两种。第一种是直接使用RT-Thread Studio,这是官方IDE,集成了源码管理、编译、下载、调试功能,芯片支持包在新建工程时自动拉取,用起来最省心,也是我个人推荐的方案,尤其适合刚接触RT-Thread的开发者。第二种是在Keil MDK下手工移植RT-Thread源码,适合有现成工程基础或者公司统一要求使用Keil的情况,但需要自己处理CMSIS配置、启动文件、链接脚本等细节,踩坑概率高不少。

这篇实战文章就是按照RT-Thread Studio这个方案展开的。目标很明确:从零开始,把编译环境跑通,下载程序到板子上,点亮一颗LED,为后面做CAN通信、以太网通信、电机控制等工控实战打好基础。

2. 开发环境搭建全流程

2.1 硬件准备与接线

做实验之前先确认手头的硬件。开发板选择GD32H759I-EVAL或者市面上常见的核心板都可以,我用的是GD32H759I-EVAL,板载了DAP-Link调试器、串口芯片、按键、LED、LCD接口等外设,调试起来比较方便。如果你用的是核心板,则需要自备一个CMSIS-DAP或者J-Link调试器。

接线方面主要是三块:调试器连接到开发板的SWD接口(SWDIO、SWCLK、GND,可选RESET),串口线连接到开发板的USART引脚(通常板子已经通过CH340或类似芯片转好USB,直接插Type-C线就行),最后是给开发板供电。GD32H759核心电压是1.2V,板子一般会有稳压电路,直接通过USB供电即可,不要试图用杜邦线从外部灌入高于规格的电压。

有一个很容易被忽略的细节:如果使用的是独立调试器,SWD杜邦线尽量短,最好控制在10厘米以内。我以前用过20多厘米的杜邦线连接SWD,在高速下载时经常出现连接不稳定、下载失败的报错,换成短线后就没再出现过。另外很多开发板的SWD接口和LED、按键共用了部分引脚,需要查阅原理图确认,避免调试器和外设冲突。

2.2 软件安装清单

软件方面需要准备四样东西。

  • RT-Thread Studio:整个开发的核心IDE,从官网下载对应操作系统的安装包,安装过程一路Next即可。
  • 串口终端工具:用来查看RT-Thread的FinSH控制台输出,推荐MobaXterm、Xshell这类,直接用Windows自带的串口助手也行。
  • 调试器驱动:如果是板载DAP-Link,Windows一般会自动识别;如果使用J-Link,需要安装J-Link驱动。
  • 芯片支持包:RT-Thread Studio在新建工程的时候会自动下载GD32H7系列的芯片支持包,不需要单独准备。

RT-Thread Studio安装完成后,首次启动会自动检查在线资源,这个过程需要联网。如果网络状况不好,后面创建工程时会卡在拉取SDK那一步。我建议安装完IDE后先手动更新一下SDK仓库,把RT-Thread源码和芯片支持库都更新到最新版本,避免后续因为资源缺失报错。

2.3 新建RT-Thread Studio工程

打开RT-Thread Studio,点击菜单栏的“文件—新建—RT-Thread项目”,会弹出新建工程向导。在向导中选择“基于芯片”这一项,然后在芯片搜索框输入GD32H759,选择你的具体型号(比如GD32H759I系列,注意I代表100引脚封装,I-EVAL板对应的具体型号以板子丝印为准)。接着配置调试器和下载器类型,如果使用板载DAP-Link就选择CMSIS-DAP,如果使用J-Link就选择J-Link。最后填写项目名称和保存路径,点完成。

第一次创建工程时,IDE会自动下载对应的芯片支持包并初始化工程结构,这个过程可能需要几分钟。工程生成后,左侧资源管理器中可以看到几个关键文件:rtconfig.h是配置头文件,所有内核组件和外设驱动的开关都在这里;board.c是板级初始化文件,时钟配置、GPIO初始化都在这个文件里;main.c是应用入口,点灯代码放在这里;另外还有.ld链接脚本和SConstruct构建脚本。

我建议在编译之前先双击rtconfig.h快速浏览一下配置,确认RT_THREAD_PRIORITY_MAXRT_USING_HEAP这些宏是否已经默认打开。一般Studio生成的默认配置是可用的,但如果你发现点灯用的rt_pin相关API编译报错,大概率是RT_USING_PIN这个宏没有打开。

2.4 编译并烧录出厂示例

工程创建完成后先不急着写点灯代码,直接点击工具栏的构建按钮,编译一下出厂默认工程。RT-Thread Studio默认使用arm-none-eabi-gcc工具链,首次编译需要编译整个内核和驱动框架,时间会略微长一些,顺利的话最终会在Debug目录下生成.elf.bin.hex文件。

烧录方式很直接,点击IDE里的运行或调试按钮,Studio会自动调用OpenOCD或pyOCD完成下载。板载DAP-Link状态下,插上USB线,确认设备管理器里能识别到一个CMSIS-DAP设备,然后点击下载即可。如果提示找不到设备,检查一下USB线是否支持数据传输,有些手机充电线只能供电不能通数据,这个坑我已经踩过好几次。

下载完成后打开串口终端,连接对应的COM口,波特率设置为115200、数据位8、停止位1、无校验,复位开发板。如果一切正常,终端里会打印出RT-Thread的启动Logo,以及Build版本信息,这说明环境已经通了。看到这段打印信息,环境搭建就算成功了一大半。

3. 点灯实验核心细节与实操

3.1 点灯实验的原理拆解

点灯实验本质上是在验证三件事:MCU时钟系统是否正常工作、GPIO控制器是否被正确初始化、程序下载链路是否可靠。

先从电路角度看,开发板上的LED一端通过限流电阻连到某个GPIO引脚,另一端接电源或地。常见的接法有两种:一种是LED阳极接VCC,阴极经过电阻接GPIO,此时GPIO输出低电平LED才会亮,称为灌电流驱动;另一种是LED阳极接GPIO,阴极经过电阻接地,此时GPIO输出高电平LED才会亮,称为拉电流驱动。GD32H759的GPIO输出能力足够驱动普通LED,但一定要注意极性,搞反的话代码逻辑看着没毛病,灯就是不亮。

从软件角度看,操作GPIO需要几步:第一步使能GPIO外设的时钟,GD32的GPIO时钟默认是关闭的,不打开时钟时写入配置寄存器无效;第二步配置引脚的模式,点灯需要配置为推挽输出;第三步配置输出速度、上下拉等电气特性;最后调用置位或清零函数改变引脚电平。这三步在GD32H759上既可以通过标准外设库完成,也可以通过RT-Thread的pin驱动框架完成。

3.2 查看板卡原理图确定LED引脚

写代码之前最重要的一件事是打开你的板卡原理图,找到LED对应的是哪个引脚。不同开发板的LED引脚完全不同,不能靠记忆或照搬别人的代码。以GD32H759I-EVAL为例,板载的LED通常在PC6、PC7等引脚上,但具体要看你手里的板子是否为这个型号,核心板与评估板的引脚定义可能完全不同。

查找原理图时重点关注LED的丝印编号,比如LED1、LED2,顺着网络标号找到MCU引脚号。同时观察LED的极性连接,确定高电平点亮还是低电平点亮。这一步看似简单,实际项目中很多人省了这一步,结果程序写完灯不亮,排查半天才发现引脚搞错了。

如果你的板卡没有原理图,也有一个笨办法:用万用表的通断蜂鸣档,一端接LED的非接地端,另一端依次扫MCU的引脚,蜂鸣器响的那根就是相连的GPIO。这个方法比较费时间,但总比盲写好。

3.3 最小点灯代码实现

打开Studio生成的main.c,清空默认代码,然后输入点灯逻辑。最简单的方式是直接在main函数里写GPIO操作:

#include <rtthread.h> #include <rtdevice.h> #define LED_PIN GET_PIN(C, 6) int main(void) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); } }

这段代码的核心有两个要点。GET_PIN(C, 6)宏用于把端口号和引脚号转换成引脚编号,它在rtdevice.h中有定义,展开后是一个整数,pin驱动框架通过这个整数操作具体的寄存器。rt_pin_modert_pin_write是pin框架的标准接口,在RT_USING_PIN宏开启后可用。延时采用rt_thread_mdelay而不是裸机上的HAL_Delay或自旋延时,因为在RTOS环境下,优先使用系统定时器提供的毫秒级延时,让出CPU给其他线程。

一个需要特别提醒的点是:上面代码直接写在main函数里,但RT-Thread标准版中main是作为一个线程被创建起来的,它的默认栈大小由MAIN_THREAD_STACK_SIZE配置决定。如果在main的while循环里做大量运算或使用大数组,可能会导致栈溢出,触发HardFault。点灯实验的代码很简单,不会出现这个问题,但换成大型工控应用时要注意这一点。

3.4 用MSH命令控制LED

点灯实验能跑起来之后,还有一个更实用的玩法:通过FinSH命令行控制LED。RT-Thread的FinSH组件支持在串口终端输入命令,我们可以注册一个自定义命令,执行开灯、关灯动作。这在后续调试硬件时非常有用,不用重新下载程序就能快速测试引脚。

#include <rtthread.h> #include <rtdevice.h> #define LED_PIN GET_PIN(C, 6) static void led_on(int argc, char **argv) { rt_pin_write(LED_PIN, PIN_LOW); rt_kprintf("led on\n"); } MSH_CMD_EXPORT(led_on, turn on led); static void led_off(int argc, char **argv) { rt_pin_write(LED_PIN, PIN_HIGH); rt_kprintf("led off\n"); } MSH_CMD_EXPORT(led_off, turn off led); static void led_init(void) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); rt_pin_write(LED_PIN, PIN_HIGH); } INIT_APP_EXPORT(led_init);

这里使用了两个RT-Thread自动初始化宏。INIT_APP_EXPORT会把led_init放到应用级初始化表中,系统启动过程中调用,相当于自动注册。MSH_CMD_EXPORT会把命令导出到命令表,FinSH组件启动后,在终端输入help就能看到led_onled_off这两个命令。

编译下载后,打开串口终端,输入led_on回车,LED亮起;输入led_off回车,LED熄灭。这个看似简单的功能在实际项目里非常实用。我调试硬件电路时经常用这种方式快速验证GPIO连接是否正确,比重新编译烧录整个工程节省很多时间。当你积累了多个自定义命令后,甚至可以写成一套简易的硬件自检工具。

3.5 创建一个独立的LED闪烁线程

工控项目里很少会在main函数里做全部事情,更常见的做法是为每个独立功能创建一个线程。这里也按这个思路,写一个独立线程控制LED闪烁,同时观察RT-Thread线程调度的效果。

#include <rtthread.h> #include <rtdevice.h> #define LED_PIN GET_PIN(C, 6) static void led_thread_entry(void *parameter) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while (1) { rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(200); rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(200); } } static int led_thread_init(void) { rt_thread_t thread = RT_NULL; thread = rt_thread_create("led", led_thread_entry, RT_NULL, 512, 20, 10); if (thread != RT_NULL) { rt_thread_startup(thread); } return 0; } INIT_APP_EXPORT(led_thread_init);

rt_thread_create的参数依次是线程名、入口函数、入口参数、栈大小、优先级、时间片。栈大小给到512字节对于点灯任务绰绰有余,但工控项目中涉及浮点运算、协议处理时,栈大小通常要扩大到1024或2048。优先级数字越小优先级越高,RT-Thread默认的优先级范围是0到31,给LED线程分配20属于较低优先级,让其他高优先级任务能优先执行。

INIT_APP_EXPORT保证了线程在系统引导阶段被创建并启动,不需要手动调用。系统启动后会打印led线程的信息,在FinSH终端输入ps命令,可以看到当前系统中有多少个线程在运行,各自的优先级、状态、栈使用情况。点灯实验跑通后,强烈建议敲一下ps命令,观察一下线程列表,这能帮助你直观理解RT-Thread的线程调度机制,对后续开发帮助很大。

4. 常见问题与排查技巧实录

4.1 编译报错:找不到头文件或未定义rt_pin_write

这是一个非常典型的问题,几乎每个新手都会碰到。如果你在编写代码时使用了rt_pin_writert_pin_mode等API,编译却报“未声明”或者链接不到函数,说明pin驱动框架没有被启用。

解决方案是检查rtconfig.h文件中是否定义了RT_USING_PIN这个宏。在RT-Thread Studio中,可以右键工程名,选择“打开配置”或者直接查找构建配置界面,找到“设备驱动”选项,勾选“PIN设备驱动”,保存后重新构建,代码就会自动加上相关定义。这个机制是RT-Thread的组件配置方式,用户态代码看不到宏开关时,要通过配置向导来修改。

另外一个相关的问题是main.c没有包含rtdevice.h头文件。rt_pin_write的原型声明在rtdevice.h中,只包含rtthread.h是不够的。初学者经常漏掉这个头文件,导致编译器报隐式声明错误。

4.2 下载程序失败

下载失败的原因通常有三个。第一个是驱动没有正常安装,在设备管理器里看不到CMSIS-DAP设备,处理方法是重新安装调试器驱动,或者在设备管理器中右键手动更新驱动。第二个是SWD引脚被禁用或复用。如果之前往板子里烧录过程序,把SWDIO或SWCLK引脚复用成了普通GPIO,调试器就再也连不上芯片了。

对于SWD被禁用的情况,GD32有一个常用的恢复手段:把BOOT0引脚拉高,让芯片从系统存储区启动,再尝试连接调试器擦除Flash。如果开发板上有BOOT拨码开关或跳线,直接切换BOOT0到高电平,上电后重新连接即可。

第三个原因是连接线接触不良。SWD接口的杜邦线松动或者线序接错,也会导致下载失败。排查时可以先断开MCU电源,用万用表通断档确认每一根线两端是否连通,再上电重试。

4.3 串口输出乱码或者没有输出

串口问题分为两类。没有输出时,先确认串口终端选择的COM口号是否正确,可以在设备管理器中查看实际串口号;然后确认开发板的串口转USB芯片是否正常,按复位按钮时终端界面有没有短暂的DTR信号变化。

乱码问题通常是波特率不匹配,RT-Thread默认的FinSH串口波特率是115200,如果终端软件设成了9600或57600,就会看到一堆乱码。还要注意数据位、停止位、校验位的配置,统一为8-N-1。

如果所有设置都正确,还是有乱码或者输出内容残缺,问题可能出在MCU主频配置上。FinSH控制台的串口波特率是从系统主频分频得到的,如果board.c或系统时钟配置中的外部晶振频率与板卡实际晶振不一致,计算出来的实际波特率就会偏离标称值,导致通信不稳定。详情可以查阅你板卡原理图上标注的晶振频率,并在board.c的时钟初始化函数中正确配置。

4.4 程序烧录成功但LED不亮

程序下载成功、串口打印正常、但LED就是不亮,这个问题可以从以下几个方向排查。首先检查代码中GET_PIN的端口和引脚号与原理图是否一致,这是最常见的原因。然后判断LED极性,通过查看原理图确认是高电平亮还是低电平亮,如果只是极性问题,把PIN_LOWPIN_HIGH对调一下就好。

其次检查引脚复用配置。如果该引脚在上电初始化时被配置为了复用功能或者输入模式,而你的点灯代码又是在后续才执行rt_pin_mode,那就有可能在初始化瞬间被其他驱动覆盖。排查方法是在rt_pin_mode之后加一个短暂延时,再写入电平,观察现象是否有变化。

最后用万用表直接量引脚电平。如果代码运行时引脚电压确实发生了变化,但LED不亮,说明问题出在LED电路本身,可能是限流电阻虚焊、LED方向焊反或者LED损坏。这时候不要怀疑代码,直接查电路板。

4.5 程序运行卡死或者HardFault

如果在main函数中使用了较大的局部数组,或者在中断回调中执行了耗时操作,很容易触发HardFault。可以在RT-Thread的board.c中打开硬件异常处理钩子,或者在FinSH终端输入list_threadlist_memheap命令观察内存使用情况。

点灯实验如果涉及独立线程,最需要关注的是线程栈大小设置。给线程分配512字节栈空间时,如果线程内部调用了rt_kprintf这类函数,打印信息会比较多,栈空间很容易不够,导致栈溢出。遇到HardFault问题时,先把线程栈扩大到2048字节,排除这个嫌疑。另外一个常见原因是优先级设置过高或过低导致调度异常,建议先使用普通优先级20左右测试。

4.6 常见问题速查表

现象可能原因解决方案
编译报错找不到rt_pin_write未启用PIN驱动框架在配置向导中勾选PIN设备驱动
下载时提示No target connected驱动未装、SWD引脚被复用、接线松动安装驱动,BOOT0拉高擦除Flash
串口没有内容串口号不对、接线错误在设备管理器中确认COM口
串口乱码波特率不匹配、主频配置错误确认为115200,核对晶振频率配置
LED不亮引脚号不对、LED极性弄反查看原理图,确认电平逻辑
运行后HardFault栈溢出、资源访问越界增大线程栈,检查数组下标

5. 工控场景实战前的几个建议

5.1 做好工程目录规划和代码分层

环境跑通后,我建议不要急着往main.c里堆业务代码,先在RT-Thread Studio里把工程目录结构规划好。按照常见的工控项目模式,可以把代码分为应用层、驱动层、中间层三个目录。应用层存放业务逻辑线程,比如按键扫描线程、显示刷新线程、通信处理线程;驱动层存放外设驱动适配代码;中间层存放协议栈、算法库等模块。

RT-Thread Studio的工程通过SConstruct脚本管理源码文件,添加目录或源文件时,可以直接右键工程选择“新建文件夹”,然后通过构建配置把对应目录加入构建路径。这个步骤不像在Makefile里手动写VPATH那么繁琐,但一定要养成在工程里清晰分组的习惯,因为后续加入CAN、以太网、文件系统这些模块后,如果没有清晰的结构,工程会迅速变成一锅粥。

5.2 调试接口保留与日志分级

工控设备现场调试往往没有IDE环境,更多是靠串口和指示灯。点灯实验这个“第0篇”其实已经为后续调试打下了基础:LED可以作为设备运行状态的指示灯,MSH命令可以作为现场诊断工具。我常用做法是:设备启动后LED快速闪烁表示启动中,慢速闪烁表示正常运行,常亮表示故障,不同状态一眼就能区分。

日志输出方面,RT-Thread的rt_kprintf在调试期很好用,但进入正式项目时要区分调试日志和运行日志。可以将运行日志通过串口输出到人机接口,把调试日志交给FinSH,或者通过DBG_TAGDBG_LVL控制不同模块的日志等级。这样现场排查问题时不会看到大量无意义信息,主控面板也能干净一些。

5.3 点灯后续还能扩展什么

点灯实验是整个实战系列的第0篇,它的意义在于确认环境可用、掌握基本开发流程、理解RT-Thread线程机制。接下来可以沿着这个主线继续深入:先用PWM驱动实现LED呼吸灯效果,练习定时器配置;再通过按键中断控制LED开关,理解中断与线程间通信;再往后就可以进入CAN通信实战,用RT-Thread的CAN设备驱动实现双板通信,那才是真正进入工控设备的核心场景。

我在实际做工控项目时,几乎每个新平台都是从往常一样的最小系统验证开始:点灯、串口、定时器、中断,这四个基础功能验证完毕后,心里就有底了。后面的复杂功能即使出现问题,也容易定位是硬件、驱动还是应用层的问题。这套方法论在GD32H759上同样适用。

最后再分享一个小技巧

如果你同时买了多个不同型号的GD32开发板,建议把所有板卡的LED引脚、串口引脚、按键引脚整理成一个备忘录。不要过度相信记忆,也不要完全照搬网上别人的代码,因为开发板厂商随时可能调整引脚分配。我在做这个实验时,最开始也是直接照搬了某篇文档里的PC6,结果自己手里的板子LED实际接在PC7上,折腾了十几分钟才发现。后来学乖了,每次拿到新板子第一件事就是整理引脚表格,标注好极性、电气参数,后续开发会顺畅很多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 10:25:38

AIGC动态注意力算法在电商与教育场景的应用突破

1. 赛事背景与获奖意义解析昆山兵贵神速智能科技有限公司在2025年算网杯AIGC开发者大赛中获得的"AI黑马奖"&#xff0c;标志着国内AIGC领域又一家技术驱动型企业实现关键突破。这个由中国人工智能学会主办的赛事&#xff0c;近年来已成为检验企业生成式AI技术落地能力…

作者头像 李华
网站建设 2026/9/16 10:23:38

WebUploader分片上传与目录管理在工程日志系统的实践

1. 项目背景与需求解析在建筑工程管理领域&#xff0c;施工日志作为项目全周期的重要记录载体&#xff0c;其数字化管理一直存在三个典型痛点&#xff1a;首先是大型项目产生的日志文件体积庞大&#xff0c;单次上传经常因网络波动失败&#xff1b;其次是不同专业&#xff08;土…

作者头像 李华
网站建设 2026/9/16 10:21:39

微软BitNet:1-bit量化大模型CPU部署实践

1. BitNet&#xff1a;微软推出的轻量化大模型方案BitNet是微软研究院最新推出的一种轻量化大语言模型架构&#xff0c;它的核心创新在于通过1-bit量化技术大幅降低模型计算和存储需求。与传统的32位浮点模型相比&#xff0c;BitNet能在保持相当性能的同时&#xff0c;将模型体…

作者头像 李华