尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AB32VG1 RISC-V开发环境搭建:从RT-Thread Studio到UART外设实战
简介面向中科蓝讯真无线蓝牙耳机与嵌入式开发者的实践指南基于搭载 RT-Thread 操作系统的 AB32VG1 评估板围绕蓝牙耳机开发场景系统讲解从开发环境搭建、板级资源认知到外设驱动调试、完整项目落地的全流程。资源包内仅含 1 份 docx 文档压缩后约 32.21MB文档按功能模块组织详细涵盖串口通信、通用输入输出、集成电路总线、串行外设接口、定时器、模拟数字转换、脉宽调制、看门狗、实时时钟、存储卡接口、闪存、红外、音频、麦克风、无线网络等外设实践并配有智慧门禁、遥控台灯、智能灯控、音频播放等可落地的项目示例。针对每个外设文档都给出了基于集成开发环境的配置步骤、代码示例与验证方法同时附有硬件资源说明和完整目录结构方便读者按需查阅。依托官方软件开发套件与丰富的软件包生态学习者可以跟随文档逐项验证硬件功能并快速搭建自己的蓝牙音频应用。该指南目前已有五千余人学习内容体系完整、实践性强特别适合希望基于 RISC-V 平台入门蓝牙耳机开发或物联网应用的工程师与学生。1. 先别急着烧录AB32VG1 的 TWS 蓝牙耳机开发环境到底卡在哪做 TWS 蓝牙耳机开发的人很多被 AB32VG1 这颗 RISC-V 内核 MCU 吸引120MHz 主频、192K RAM、片上还带 ADC、PWM、USB、UART、IIC评估板直接集成了蓝牙模块和 FM 模块。板子性价比高但环境绝不是插上就能跑。见过太多人卡在第一步SDK 管理器漏装 RISC-V 工具链编译直接报错Downloader 串口驱动不匹配固件下不进去。这套环境说难不难但坑都是你根本想不到要停一下的地方。这篇文章按我实际配过的顺序写先列清要装哪些东西再讲新建工程和 UART、GPIO 外设怎么跑通最后把常见翻车现场和验证方法一起收尾。适合刚拿到 AB32VG1 评估板、准备做 蓝牙耳机 外设验证的开发者。2. 环境准备RT-Thread Studio、BSP 1.0.8 与 RISC-V 工具链的装法2.1 先确认板子版本再下载三样东西装环境之前先看清楚手上这块板子是 V1 还是 V2 版。这个信息直接决定后面驱动怎么装V1 的串口芯片是 CP2102V2 用的是 CH340两者不能混着来。AB32VG1 的 SDK 是直接内置在 RT-Thread Studio 的 SDK 管理器里的不像以前做单片机动辄解压一个几十兆的库文件这对新手友好但也意味着装 BSP这个动作经常被漏掉。官方把这套支持包叫 Bluetrum_AB32VG1-ab-prougen新建工程时开发板选 AB32VG1-AB-PROUGENBSP 版本按文档用 1.0.8这些名字在后续步骤里要反复对上。需要准备的东西其实就三样RT-Thread Studio 安装包、Downloader 下载软件、配套的 USB 转串口驱动。另外官方随评估板发布的实践指南有数百页UART、GPIO、I2C、Timer、RTC、SDIO、Audio、WIFI 等外设都有独立章节这份文档是和 SDK 绑定的不用单独到处找。需要安装的东西干什么用的版本和注意点RT-Thread Studio写代码、编译、管 SDK装完先打开一次让 IDE 完成初始化Bluetrum_AB32VG1-ab-prougen 支持包提供板级驱动和外设例程在 SDK 管理器里勾选安装BSP 用 1.0.8RISC-V 工具链把 C 代码编译成 AB32VG1 能跑的固件在 SDK 管理器里单独装漏了无法编译Downloader把 .dcf 固件下载到板子编译出的固件在工程 Debug 目录下USB 转串口驱动让 PC 识别下载器和调试串口V1 板装 CP2102 配套驱动V2 板用 CH340系统自动装2.2 SDK 管理器BSP 和工具链要分两次装打开 RT-Thread Studio 后的第一个动作是在工具栏找到 SDK 管理器。点开后在 Board_Support_Packages 分类下找到 Bluetrum_AB32VG1-ab-prougen勾选安装。装完这一步只是把板级驱动和例程拿到了本地还不能编译。还需要在 SDK 管理器中安装 RISC-V 工具链也就是 riscv-none-elf-gcc 那一套。很多人的血泪经验是只装了 BSP、没装工具链新建工程后一点编译控制台直接报找不到交叉编译器。BSP 管的是板级初始化和外设驱动编译器是另一码事AB32VG1 的指令集是 RISC-V 架构必须用专门的 RISC-V 工具链x86 的 gcc 编出来的东西完全不能用。两个组件都装好后再进新建工程流程才算是真正具备开发条件。提示SDK 管理器如果列表一直刷不出来先检查网络再点刷新。这个列表是实时拉取的离线状态下装不了。2.3 Downloader 与 USB 转串口驱动V1 和 V2 是两套玩法Downloader 是 AB32VG1 专用的固件下载工具编译出来的固件后缀是 .dcf位置固定在工程 Debug 目录下。打开 Downloader 之前必须先把 USB 转串口驱动搞定。V2 版开发板用的 CH340Windows 一般插上就自动装好不用管V1 版用的是 CP2102系统自动装的驱动和 Downloader 不匹配打开软件后会报设备打不开一类的错误这时需要在设备管理器里找到对应的串口设备右键更新驱动手动指定到配套驱动目录切换成功后那个黄色感叹号才会消失。驱动弄好后建议顺手做一件事在 Downloader 的下载下拉窗里选择自动。这样以后每次编译完固件会自动烧录进板子不用每次手动去 Debug 目录挑文件。我一般拿到新板子第一件事就是把这个选项打开后面反复改代码编译时会省很多事。3. 新建工程与 UART 实践uart0 调试、uart1 通讯的分工3.1 新建 RT-Thread 工程开发板选 AB32VG1-AB-PROUGEN打开 Studio 后文件 - 新建 - RT-Thread 项目弹窗里选基于开发板填好工程名开发板下拉选择 AB32VG1-AB-PROUGENBSP 版本选 1.0.8其余保持默认点完成。如果基于开发板这个列表是空的说明 2.2 里的 BSP 包没装成功回 SDK 管理器看安装进度别硬着头皮继续。工程建好后重点看三个目录applications 放自己的应用代码libraries/hal_drivers 是板级驱动源码board 是板级配置。后面要改的 drv_usart.c 就在 libraries/hal_drivers 下面。这里提醒一句BSP 版本下拉默认不一定是 1.0.8而文档明确写的是 1.0.8。别图省事选太老的版本串口驱动和 GPIO 引脚宏定义的差异会让人白折腾一晚上。3.2 串口规划与电路图PA3 和 PA4 上的 uart1AB32VG1 的串口 0 被固定用作系统调试串口跑的是 RT-Thread 的 msh 命令终端串口 1 是留出来给应用用的通讯端口。开发板原理图上画得很清楚串口 1 使用的是 PA3 和 PA4 两个引脚。RT-Thread 里 uart0 和 uart1 的驱动都已经做完了不需要自己配置寄存器只要在应用里用 rt_device_find 找到设备、open 之后就能直接读写。做 蓝牙耳机 相关开发时我习惯把调试日志走 uart0把通信协议走 uart1两边分开避免终端命令和数据流搅在一起。新手最容易犯的错是把测试程序里的设备名写成 uart0结果程序确实在跑但发的数据全混进调试终端里看起来就像完全没输出。所以先记住这个分工uart0 是给 msh 用的uart1 才是给应用用的。3.3 编写 task.c信号量接收与错位回显在 applications 目录下新建 task.c内容可以直接用文档里的串口例程。这段代码做的事很简单从串口 1 收到一个字符加一后发回去。验证时发 A 回 B发 1 回 2能直观看到收发链路是否完整。/* 程序清单串口设备使用例程导出 uart_sample 命令到 msh */ #include rtthread.h #define SAMPLE_UART_NAME uart1 /* 通讯串口用 uart1不是调试串口 uart0 */ /* 接收信号量串口中断回调里释放接收线程等待 */ static struct rt_semaphore rx_sem; static rt_device_t serial; /* 接收回调串口收到数据就释放一个信号量 */ static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { rt_sem_release(rx_sem); return RT_EOK; } static void serial_thread_entry(void *parameter) { char ch; while (1) { /* 读不到数据时阻塞在信号量上避免空转 */ while (rt_device_read(serial, -1, ch, 1) ! 1) { rt_sem_take(rx_sem, RT_WAITING_FOREVER); } /* 错位输出收到的字符加 1 后发回 */ ch ch 1; rt_device_write(serial, 0, ch, 1); } } static int uart_sample(int argc, char *argv[]) { rt_err_t ret RT_EOK; char uart_name[RT_NAME_MAX]; char str[] hello RT-Thread!\r\n; /* 命令行带了参数就用参数指定的串口否则默认 uart1 */ if (argc 2) rt_strncpy(uart_name, argv[1], RT_NAME_MAX); else rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); /* 在系统设备列表中查找串口设备 */ serial rt_device_find(uart_name); if (!serial) { rt_kprintf(find %s failed!\n, uart_name); return RT_ERROR; } /* 信号量初值 0表示当前没有可读数据 */ rt_sem_init(rx_sem, rx_sem, 0, RT_IPC_FLAG_FIFO); /* 以中断接收模式打开串口 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 注册接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 先发一包字符串证明发送通路是好的 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建接收线程栈 1024 字节优先级 25时间片 10 */ rt_thread_t thread rt_thread_create(serial, serial_thread_entry, RT_NULL, 1024, 25, 10); if (thread ! RT_NULL) rt_thread_startup(thread); else ret RT_ERROR; return ret; } /* 导出到 msh 命令列表之后在终端直接敲 uart_sample 就能运行 */ MSH_CMD_EXPORT(uart_sample, uart device sample);这段代码的核心是信号量机制中断回调里 rt_sem_release 释放信号量接收线程里 rt_sem_take 阻塞等待。好处是没数据时线程不占 CPU来了数据立刻被唤醒比轮询读串口干净得多。rt_device_open 打开的是中断接收模式对应 RT_DEVICE_FLAG_INT_RX线程优先级 25 属于 RT-Thread 的普通优先级段1024 字节的栈对这个小任务完全够用。最后那行 MSH_CMD_EXPORT 是关键它把 uart_sample 导出成 msh 命令否则函数编译进去了你在终端也敲不出来。3.4 修改默认波特率drv_usart.c 里的 1500000驱动里默认把所有串口的初始化波特率写成了 1500000这是个非标速率串口调试助手一般不直接用。文档里给的改法是在 libraries/hal_drivers/drv_usart.c 的 rt_hw_usart_init 函数里加一个判断只把串口 1 改成 115200。int rt_hw_usart_init(void) { rt_size_t obj_num sizeof(uart_obj) / sizeof(struct ab32_uart); struct serial_configure config RT_SERIAL_CONFIG_DEFAULT; rt_err_t result 0; rt_hw_interrupt_install(IRQ_UART0_2_VECTOR, uart_isr, RT_NULL, ut_isr); for (int i 0; i obj_num; i) { uart_obj[i].config uart_config[i]; uart_obj[i].rx_idx 0; uart_obj[i].rx_idx_prev 0; uart_obj[i].serial.ops ab32_uart_ops; uart_obj[i].serial.config config; uart_obj[i].serial.config.baud_rate 1500000; /* 驱动默认值非标波特率 */ uart_obj[i].rx_buf rt_malloc(uart_config[i].fifo_size); if (uart_obj[i].rx_buf RT_NULL) { LOG_E(uart%d malloc failed!, i); continue; } /* 关键改动串口 1 的波特率固定为 115200 */ if (i 1) { uart_obj[i].serial.config.baud_rate 115200; } result rt_hw_serial_register(uart_obj[i].serial, uart_obj[i].config-name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX | uart_obj[i].uart_dma_flag, NULL); RT_ASSERT(result RT_EOK); } return result; }这段逻辑里 obj_num 是从 uart_obj 数组算出来的串口数量i 是串口索引0 对应 uart01 对应 uart1那个 if 块就是文档建议加的位置。注意接收缓冲用的 rt_malloc 是动态分配的如果内存不够会直接打印 LOG_E 并且跳过注册真遇到这种报错要回头检查堆配置而不是怀疑串口硬件。改完波特率必须重新编译下载只改源文件不烧录等于白改。4. GPIO、ADC、PWM 外设RGB 彩灯和六路端子的实战用法4.1 GPIO 与 RGB 彩灯三个引脚控制三色灯评估板上有一个全彩 LED 灯模块外加一个电源指示灯和三个烧录指示灯板子 I/O 口按 2.54mm 标准间距引出同时兼容 Arduino Uno 扩展接口插面包线很方便。全彩灯一般就是 R、G、B 三个引脚分别控制三色。RT-Thread 里操作 GPIO 走的是 pin 框架先调用 rt_pin_mode 设置输入输出方向再用 rt_pin_write 拉高拉低。#include rtthread.h #include rtdevice.h /* 具体引脚号以 board.h 里的宏定义和原理图为准这里只做示意 */ #define LED_R GET_PIN(0, 11) #define LED_G GET_PIN(0, 12) #define LED_B GET_PIN(0, 13) static void rgb_demo(void) { rt_pin_mode(LED_R, PIN_MODE_OUTPUT); rt_pin_mode(LED_G, PIN_MODE_OUTPUT); rt_pin_mode(LED_B, PIN_MODE_OUTPUT); for (int i 0; i 3; i) { rt_pin_write(LED_R, PIN_LOW); rt_pin_write(LED_G, PIN_HIGH); rt_pin_write(LED_B, PIN_HIGH); /* 红 */ rt_thread_mdelay(300); rt_pin_write(LED_R, PIN_HIGH); rt_pin_write(LED_G, PIN_LOW); rt_pin_write(LED_B, PIN_HIGH); /* 绿 */ rt_thread_mdelay(300); rt_pin_write(LED_R, PIN_HIGH); rt_pin_write(LED_G, PIN_HIGH); rt_pin_write(LED_B, PIN_LOW); /* 蓝 */ rt_thread_mdelay(300); } } MSH_CMD_EXPORT(rgb_demo, rgb led demo);GET_PIN 的引脚号不能照抄不同 BSP 版本在 board 目录下的 board.h 里定义不一样要对着原理图改。另外要留意全彩 LED 是共阳还是共阴共阳接法下低电平才是点亮如果代码看起来对但灯不亮先怀疑电平逻辑而不是引脚号写错。4.2 六路 ADC 端子rt_adc_read 读采样值板子把六路 ADC 输入引脚端子引出来了接电位器、光敏电阻都很方便。RT-Thread 的 ADC 设备框架把底层采样封装成了 rt_adc_enable、rt_adc_read、rt_adc_disable 三个接口不需要自己碰寄存器。#include rtthread.h #include rtdevice.h static void adc_demo(void) { rt_adc_device_t adc (rt_adc_device_t)rt_device_find(adc1); if (adc RT_NULL) { rt_kprintf(find adc1 failed\n); return; } rt_adc_enable(adc, 1); /* 使能 ADC 通道 1 */ rt_uint32_t value rt_adc_read(adc, 1); /* 读取一次采样值 */ rt_kprintf(adc1 ch1 %d\n, value); rt_adc_disable(adc, 1); } MSH_CMD_EXPORT(adc_demo, adc sample);rt_adc_enable 的第一个参数是 ADC 设备指针第二个是通道号rt_adc_read 返回的是原始采样值不是电压。要换算电压得知道这颗芯片的 ADC 位数和参考电压比如 12 位 ADC 就是 value 乘以参考电压再除以 4096。设备名 adc1 和通道号是不是 1以 BSP 驱动里的注册名为准不确定就先打印看设备在不在避免对着空气读数据。4.3 六路 PWM 端子rt_pwm_set 控制占空比PWM 端子可以用来做 LED 呼吸灯、蜂鸣器也能驱动小电机。在 RT-Thread 的 pwm 设备框架里常见的做法是先找设备再设周期和脉宽最后使能通道输出。#include rtthread.h #include rtdevice.h static void pwm_demo(void) { rt_pwm_device_t pwm (rt_pwm_device_t)rt_device_find(pwm1); if (pwm RT_NULL) { rt_kprintf(find pwm1 failed\n); return; } /* 周期 1_000_000 ns 即 1kHz脉宽 500_000 ns 即 50% 占空比 */ rt_pwm_set(pwm, 1, 1000000, 500000); rt_pwm_enable(pwm, 1); /* 忘记使能的话引脚上是没有波形的 */ } MSH_CMD_EXPORT(pwm_demo, pwm sample);rt_pwm_set 里的周期和脉宽单位都是纳秒1kHz 的周期是 1_000_000 ns50% 占空比脉宽就是 500_000 ns。如果只调亮度不改频率保持原来的 period 值、只改 pulse 就行。很多第一次用的人漏掉 rt_pwm_enable波形出不来排查半天才发现只是没使能。4.4 实践指南里还能照着做的外设章节配套实践指南覆盖了 UART、GPIO、I2C、模拟 SPI、Timer、ADC、PWM、WDT、RTC、SDIO、Flash、SD、IRDA、Audio、mic、WIFI 等章节更新日志里提到 1.0.1 版本更新过 UART 和 RTC 文档还新增了 WIFI 模块配置文档。其中 Audio 和 mic 章节和 蓝牙耳机 应用的关系最直接I2C 章节适合挂传感器IRDA 可以做红外控制。每个章节的结构都差不多模块介绍、开发步骤、代码验证照着本章的节奏往下走就行。5. 常见问题排查驱动不匹配、波特率乱码、工具链缺失先把话说在前头AB32VG1 这套环境出问题十有八九不是代码写错而是环境和配置没对上。下面这些是我实际踩过的按出现频率排序。5.1 Downloader 连不上板子先看串口芯片型号现象打开 Downloader 点下载提示打开串口失败或驱动不匹配固件一直下不进去设备管理器里串口设备带黄色感叹号。原因V1 版板子的串口芯片是 CP2102系统自动装的驱动和 Downloader 期待的驱动不一致V2 版用的是 CH340一般插上就能用。解决确认板子版本V1 就到设备管理器里把串口驱动手动切换到配套驱动切换完看感叹号还在不在。另外别用机箱前面板的 USB 口下载瞬间电流大供电不稳也会导致下载失败直接插主板背板的口最稳。5.2 编译报错找不到 RISC-V 编译器现象新建工程后点编译控制台报 riscv-none-elf-gcc 找不到或者提示 gcc command not found。原因SDK 管理器里只装了 BSP 支持包没装 RISC-V 工具链两个组件是独立的。解决回 SDK 管理器找到 RISC-V 工具链勾选安装。装完在 IDE 的设置里看一眼编译器路径确认指向工具链的 bin 目录。这一步没做对后面所有编译都会卡在同一个地方。5.3 串口助手输出乱码或者全无反应现象调试串口接上 PC串口助手打开后一路乱码或者收不到任何输出。原因驱动里 uart0 的默认波特率是 1500000不是串口助手常用的标准速率两边对不上就是乱码完全没输出则多半是串口号选错或驱动没装上。解决两个办法选一个。要么把串口助手波特率手动输入 1500000前提是助手软件允许非标波特率要么把 rt_hw_usart_init 里 i 等于 0 的波特率也改成 115200让 uart0 调试终端也回到标准速率。改完记得重新编译下载。5.4 固件下载了但板子没反应现象Downloader 提示下载成功烧录指示灯也闪了但板子跑的好像还是老程序。原因最常见的是 Downloader 没选自动下载的还是上次那个 .dcf或者改完代码没重新编译Debug 目录下的 .dcf 文件是旧的。解决在 Downloader 的下载下拉窗里选自动下载前看一眼 Debug 目录下 .dcf 的时间戳确保是新编译出来的。我后来养成一个习惯编译、下载、核对时间戳三步固定顺序能省掉很多怀疑人生的时间。5.5 msh 里执行 uart_sample 没有输出现象在调试终端敲 uart_sample uart1提示 find uart1 failed或者命令执行了但通讯串口那边没有 hello 输出。原因设备名写错比如把 uart1 误写成 uart0或者 uart1 的 PA3、PA4 根本没接到 PC 的串口助手再或者 3.4 的波特率没改串口助手用 115200 去听一个 1500000 的串口。解决按设备名 - 硬件连接 - 波特率的顺序排查。先确认 rt_device_find 能返回设备再确认 PA3、PA4 确实连到了串口助手的 COM 口最后核对两边的波特率。这套顺序走下来基本能覆盖九成以上的无输出问题。6. 装完怎么验证uart_sample 回环测试与 Downloader 自动下载环境装没装好只做一件事就能确认把 uart_sample 回环跑通。具体流程是这样的先编译工程确认零报错Debug 目录下生成最新的 .dcf。然后打开 Downloader加载这个固件下载到板子下拉窗选成自动之后每次编译完都不用再手动折腾。接着开两个串口调试助手实例一个接 uart0 调试终端一个接 uart1 通讯串口。uart0 的波特率按 3.4 改过的话是 115200uart1 接 PA3 和 PA4同样设 115200。如果板子没有把 uart1 引到板载 USB就用 USB 转 TTL 模块接 PA3、PA4注意 TX 要交叉接反是收不到数据的。在 uart0 的终端里输入 uart_sample uart1命令被 msh 正常接收不报 find failed就说明串口设备注册没问题。这时看 uart1 的串口助手窗口应该先收到一行 hello RT-Thread!这是发送通路的证明。然后在这个窗口里发送字符比如发 A板子会错位返回 B发 1 返回 2。看到这个错位回显说明整条链路全部打通了设备驱动正常、中断接收正常、信号量调度正常、线程创建正常。三个烧录指示灯在下载时依次闪动可以作为硬件层面的佐证。如果 hello 有但回显没有问题多半出在中断回调或信号量这块回到 5.5 继续查。从那以后我每次拿到新板子都强制自己先走一遍这个回环再碰其他外设十几秒就能判断环境到底是不是真的能用而不是感觉应该能用。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

可编程网卡芯片落地云网络:从OVS硬件卸载到vDPA与RDMA加速实践

可编程网卡芯片落地云网络:从OVS硬件卸载到vDPA与RDMA加速实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/24 1:35:44
STM32+PMIC电源管理方案:从时序到低功耗的嵌入式设计实践

STM32+PMIC电源管理方案:从时序到低功耗的嵌入式设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/24 1:35:44
MQC配置详解:从流量过滤到策略路由的QoS统一框架

MQC配置详解:从流量过滤到策略路由的QoS统一框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/24 1:30:44
MORE NEWS

更多资讯

📰

【论文阅读】并行 MRI 深度学习综述:从 SENSE、GRAPPA 到学习式重建

文章目录01 基础信息02 背景03 方法04 结果05 思考06 新掌握的表达01 基础信息 标题:Deep-Learning Methods for Parallel Magnetic Resonance Image Reconstruction: A Survey of the Current Approaches, Trends, and Issues。作者:Florian Knoll、Ke…

📰

RDMA-Verbs-数据收发与完成(十)

本文以 RC QP、verbs 接口和 mlx5 为主线,分析发送和接收请求的提交流程、完成事件的数据处理过程。除特别说明外,“本端”表示发起操作的一端,“远端”表示 RC 连接的另一端。 1. 架构 下图展示了基于 Linux mlx5 驱动的 RDMA 数据收发与完…

📰

【论文阅读】SwinMR:用移位窗口注意力重建 MRI,如何兼顾细节与计算量?

文章目录01 基础信息02 背景03 方法04 结果05 思考06 新掌握的表达01 基础信息 标题:Swin transformer for fast MRI。作者:Jiahao Huang、Yingying Fang、Yinzhe Wu、Huanjun Wu、Zhifan Gao、Yang Li、Javier Del Ser、Jun Xia、Guang Yang。期刊&…

📰

Linux系统编程——标准io

c库中 关于文件操作的一套函数, 称为标准io。I:输入 O:输出 Linux操作系统当中IO都是对文件的操作。 输入输出是以计算机中的内存为参考点。 如果写入内存的,被称为输入, 键盘和鼠标是标准输入设备。如果从内存中输出数…

📰

从零开始学 UI 第一篇:Figma 快速上手实战指南(上)

🔹博主名称:_Doubletful大家好,欢迎来到Doubletful的博客🪢博主的GitHub:Go to git_hub💠移动应用开发专栏🔷路漫漫其修远兮,吾将上下而求索文章目录序言什么是 UI 设计?…

📰

基于 Scapy 的端口扫描器实验:TCP Connect、SYN、Xmas、FIN、NULL 与 UDP 扫描

一、实验目的 掌握端口状态探测的基本原理;熟悉使用 Scapy 构造和分析网络数据包;理解不同端口扫描技术的工作原理、特点与局限;对比自研扫描器与 Nmap 的扫描结果。 二、实验环境与拓扑 扫描主机(Attacker)&#xff1…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬