STM32F0串口DMA接收与发送工程实践

news2026/3/24 12:26:58
1. DMA在STM32串口通信中的工程价值与适用边界1.1 DMA机制的本质与硬件定位直接存储器访问Direct Memory AccessDMA是嵌入式系统中一种独立于CPU的数据搬运机制。其核心价值在于将数据在内存与外设之间进行高效传输时完全释放CPU资源。从硬件架构角度看DMA控制器本质上是一个专用状态机具备独立的地址生成器、数据宽度适配器和传输计数器能够自主完成地址递增、数据宽度转换和传输终止判断等操作。在STM32系列MCU中DMA被设计为系统总线上的一个主设备Master Device可直接访问AHB/APB总线上的外设寄存器和SRAM区域。其典型应用场景包括三类数据流向内存到内存Memory-to-Memory、外设到内存Peripheral-to-Memory以及内存到外设Memory-to-Peripheral。对于串口USART这类低速外设DMA主要承担后两类任务——接收数据时将RDR寄存器内容自动搬入RAM缓冲区发送数据时将RAM缓冲区内容自动写入TDR寄存器。1.2 串口通信对DMA的需求分析串口作为异步通信接口其波特率决定了数据流的持续时间密度。以常见的115200bps为例每字节传输耗时约87μs10位/115200bps1秒内可传输约11520字节。此时若采用轮询方式发送CPU需在每个字节发送完成后立即写入下一个字节导致CPU利用率接近100%若采用中断方式发送每字节触发一次中断按69μs间隔响应中断中断服务程序ISR执行开销将显著挤占CPU带宽。更关键的是接收端处理。传统中断接收模式下每个字节到达均触发RXNE中断CPU需在中断中读取RDR寄存器。当波特率提升至1Mbps以上时中断频率超过100kHz频繁的上下文切换和ISR执行将严重干扰实时任务调度。而DMA接收则将这一过程完全硬件化只要RDR寄存器非空DMA控制器即自动将其内容搬入预设缓冲区仅在缓冲区满、半满或检测到空闲线Idle Line时才通知CPU中断频率降低两个数量级。因此DMA在串口通信中的引入并非技术炫技而是工程权衡的必然选择。其适用边界可明确界定为必要场景波特率≥460800bps或单次通信数据量≥1KB或系统存在严格实时性要求如工业控制中任务响应延迟需100μs非必要场景波特率≤9600bps且数据包长度稳定在数十字节以内此时中断开销可控DMA反而增加系统复杂度2. STM32F0系列DMA串口接收的工程实现2.1 硬件平台约束与设计前提本方案基于STM32F030C8T6微控制器该芯片集成1个DMA控制器DMA1含5个通道支持基本的内存-外设传输功能。需特别注意其DMA特性限制不支持双缓冲Double Buffer模式无法通过硬件自动切换缓冲区仅提供半满Half-Transfer, HT和全满Transfer-Complete, TC两种中断类型无链表模式Linked List每次传输完成需软件重新配置这些硬件约束决定了必须采用“伪双缓冲”策略在单缓冲区中通过HT/TC中断协同实现数据安全搬运。缓冲区大小需为偶数且至少为预期最大单包数据长度的2倍以确保HT中断触发时前半区数据已就绪CPU处理期间后半区数据可继续接收。2.2 接收缓冲区管理机制标准的DMA循环模式Circular Mode虽能避免缓冲区溢出但存在数据覆盖风险当CPU尚未处理完前一批数据DMA已将新数据覆盖原位置。本方案采用“三重中断协同”机制解决此问题中断类型触发条件数据有效性判断逻辑CPU处理动作半满中断HTDMA已搬运缓冲区前半部分数据当前有效数据量 已搬运总量 - 上次记录的搬运量拷贝前半区数据至FIFO更新搬运量计数器全满中断TCDMA填满整个缓冲区当前有效数据量 缓冲区总长 - 上次记录的搬运量拷贝后半区数据至FIFO清零搬运量计数器空闲中断Idle串口检测到线路空闲无数据跳变当前有效数据量 已搬运总量 - 上次记录的搬运量拷贝剩余数据至FIFO更新搬运量计数器该机制本质是将单缓冲区逻辑划分为两个虚拟缓冲区Buffer A和Buffer B通过HT中断标识Buffer A就绪TC中断标识Buffer B就绪。CPU在HT中断中处理Buffer A此时DMA正向Buffer B填充TC中断到来时Buffer B已满CPU立即处理Buffer B同时DMA自动回绕至Buffer A起始地址继续填充。2.3 关键寄存器配置与初始化流程以下为UART2使用DMA接收的核心配置代码体现工程实践中的关键细节void bsp_uart2_dmarx_config(uint8_t *mem_addr, uint32_t mem_size) { DMA_InitTypeDef DMA_InitStructure; // 1. 通道复位与禁用确保配置前处于确定状态 DMA_DeInit(DMA1_Channel5); DMA_Cmd(DMA1_Channel5, DISABLE); // 2. 外设地址配置指向USART2接收数据寄存器RDR DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)(USART2-RDR); // 3. 内存地址配置用户提供的缓冲区起始地址 DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)mem_addr; // 4. 传输方向外设到内存PeripheralSRC DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; // 5. 缓冲区大小必须为偶数建议≥256字节 DMA_InitStructure.DMA_BufferSize mem_size; // 6. 地址增量外设地址固定RDR为单寄存器内存地址递增 DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; // 7. 数据宽度字节级传输8-bit DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; // 8. 工作模式循环模式Circular实现连续接收 DMA_InitStructure.DMA_Mode DMA_Mode_Circular; // 9. 优先级设为VeryHigh确保高实时性 DMA_InitStructure.DMA_Priority DMA_Priority_VeryHigh; // 10. 初始化并使能中断HT半满、TC全满、TE错误 DMA_Init(DMA1_Channel5, DMA_InitStructure); DMA_ITConfig(DMA1_Channel5, DMA_IT_TC | DMA_IT_HT | DMA_IT_TE, ENABLE); // 11. 清除初始状态标志防止首次传输误触发中断 DMA_ClearFlag(DMA1_IT_TC5); DMA_ClearFlag(DMA1_IT_HT5); // 12. 启动DMA通道 DMA_Cmd(DMA1_Channel5, ENABLE); }工程要点说明DMA_DeInit()和DMA_Cmd(DISABLE)是强制步骤避免残留配置影响新配置DMA_ClearFlag()必须在DMA_Cmd(ENABLE)之前执行否则可能丢失首次中断DMA_IT_TE传输错误中断在调试阶段必须启用量产时可禁用以减少中断负载DMA_Priority_VeryHigh确保DMA请求不被其他高优先级中断阻塞2.4 接收数据长度计算算法由于串口数据包长度随机DMA缓冲区可能处于三种状态未满、半满、全满。需通过DMA_GetCurrDataCounter()获取当前剩余空间结合历史搬运量计算实际接收长度// 获取DMA当前剩余空间返回0表示缓冲区已满 uint16_t bsp_uart2_get_dmarx_buf_remain_size(void) { return DMA_GetCurrDataCounter(DMA1_Channel5); } // 半满中断处理计算并拷贝前半区数据 void uart_dmarx_half_done_isr(uint8_t uart_id) { uint16_t recv_total_size; uint16_t recv_size; // 计算已搬运总量 缓冲区总长 - 剩余空间 recv_total_size s_uart_dev[uart_id].dmarx_buf_size - bsp_uart2_get_dmarx_buf_remain_size(); // 计算本次有效数据量 已搬运总量 - 上次记录量 recv_size recv_total_size - s_uart_dev[uart_id].last_dmarx_size; // 拷贝数据至FIFO从上次结束位置开始 fifo_write(s_uart_dev[uart_id].rx_fifo, s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size], recv_size); // 更新搬运量计数器 s_uart_dev[uart_id].last_dmarx_size recv_total_size; } // 全满中断处理拷贝后半区数据并重置计数器 void uart_dmarx_done_isr(uint8_t uart_id) { uint16_t recv_size; // 计算本次有效数据量 缓冲区总长 - 上次记录量 recv_size s_uart_dev[uart_id].dmarx_buf_size - s_uart_dev[uart_id].last_dmarx_size; // 拷贝数据至FIFO fifo_write(s_uart_dev[uart_id].rx_fifo, s_uart_dev[uart_id].dmarx_buf[s_uart_dev[uart_id].last_dmarx_size], recv_size); // 重置计数器为下一轮循环做准备 s_uart_dev[uart_id].last_dmarx_size 0; }该算法的关键在于last_dmarx_size变量的精确维护它始终记录DMA控制器已写入缓冲区的字节数。HT中断时该值为前半区长度TC中断时该值被清零DMA自动回绕至缓冲区起始。3. STM32F0系列DMA串口发送的工程实现3.1 发送机制的设计哲学与接收端不同串口发送无需循环模式——数据由应用层主动写入FIFODMA仅在有数据待发时启动单次传输。其设计核心是状态机驱动通过status标志位精确跟踪DMA发送状态避免因中断时序竞争导致的状态错乱。若在DMA传输完成中断TC中清除status标志而应用层在中断返回后立即调用发送函数则可能出现以下竞态应用层检查status 0决定启动新传输此时TC中断尚未执行status仍为1应用层重复配置DMA通道导致传输异常因此必须采用“先置位后启动”策略在启动DMA前将status置为1确保任何时刻status1都真实反映DMA正在工作。3.2 发送缓冲区管理与启动逻辑发送流程采用“FIFO驱动DMA搬运”两级结构一级缓冲应用层写入的环形FIFOtx_fifo容量通常为256~1024字节二级缓冲DMA专用发送缓冲区dmatx_buf大小建议为64~256字节需与FIFO深度匹配发送函数uart_poll_dma_tx()的执行逻辑如下void uart_poll_dma_tx(uint8_t uart_id) { uint16_t size; // 1. 快速检查若DMA正在工作直接返回 if (s_uart_dev[uart_id].status 0x01) { return; } // 2. 从FIFO读取数据最多读取dmatx_buf_size字节 size fifo_read(s_uart_dev[uart_id].tx_fifo, s_uart_dev[uart_id].dmatx_buf, s_uart_dev[uart_id].dmatx_buf_size); // 3. 若有数据可发则启动DMA if (size 0) { // 关键先置位状态再启动DMA s_uart_dev[uart_id].status 0x01; // 根据UART ID选择对应配置函数 if (uart_id 0) { bsp_uart1_dmatx_config(s_uart_dev[uart_id].dmatx_buf, size); } else if (uart_id 1) { bsp_uart2_dmatx_config(s_uart_dev[uart_id].dmatx_buf, size); } } }工程要点说明status置位必须在bsp_uartX_dmatx_config()调用之前这是解决竞态的根本措施fifo_read()返回实际读取字节数size可能小于dmatx_buf_sizeDMA需按实际长度配置每次发送均需完整重配置DMA通道DMA_DeInit()→DMA_Init()而非仅修改BufferSize因后者在F0系列中不可靠3.3 DMA发送配置与中断处理UART2发送配置代码体现单次传输Normal Mode特性void bsp_uart2_dmatx_config(uint8_t *mem_addr, uint32_t mem_size) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel4); DMA_Cmd(DMA1_Channel4, DISABLE); // 外设地址USART2发送数据寄存器TDR DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)(USART2-TDR); // 内存地址发送缓冲区 DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)mem_addr; // 传输方向内存到外设PeripheralDST DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; // 缓冲区大小动态传入的实际数据长度 DMA_InitStructure.DMA_BufferSize mem_size; // 地址增量外设地址固定内存地址递增 DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; // 数据宽度字节级 DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; // 工作模式单次模式Normal DMA_InitStructure.DMA_Mode DMA_Mode_Normal; // 优先级High确保及时响应 DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_Init(DMA1_Channel4, DMA_InitStructure); DMA_ITConfig(DMA1_Channel4, DMA_IT_TC | DMA_IT_TE, ENABLE); // 清除传输完成标志 DMA_ClearFlag(DMA1_IT_TC4); // 启动DMA DMA_Cmd(DMA1_Channel4, ENABLE); }传输完成中断处理仅需清除状态标志为下一次发送做准备void uart_dmatx_done_isr(uint8_t uart_id) { // 清除DMA发送状态允许下次发送 s_uart_dev[uart_id].status 0; }4. 系统级集成与可靠性保障4.1 串口设备抽象层设计为支持多串口统一管理定义设备结构体封装所有状态typedef struct { uint8_t status; // 发送状态标志0空闲1忙 _fifo_t tx_fifo; // 发送FIFO _fifo_t rx_fifo; // 接收FIFO uint8_t *dmarx_buf; // DMA接收缓冲区指针 uint16_t dmarx_buf_size; // DMA接收缓冲区大小 uint8_t *dmatx_buf; // DMA发送缓冲区指针 uint16_t dmatx_buf_size; // DMA发送缓冲区大小 uint16_t last_dmarx_size; // DMA上次接收总量用于偏移计算 } uart_device_t;该结构体将硬件资源缓冲区指针、运行时状态status、last_dmarx_size和抽象接口tx_fifo、rx_fifo完全解耦符合嵌入式系统分层设计原则。4.2 初始化与中断向量配置串口初始化需严格遵循时钟使能顺序和中断优先级设置void bsp_uart2_init(void) { USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 1. GPIO时钟与引脚配置PA2/PA3复用为USART2 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP; GPIO_Init(GPIOA, GPIO_InitStructure); // 2. 使能USART2和DMA1时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 3. USART2基础配置57600bps8N1 USART_InitStructure.USART_BaudRate 57600; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, USART_InitStructure); // 4. 使能关键中断空闲中断用于帧结束检测 USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); USART_OverrunDetectionConfig(USART2, USART_OVRDetection_Disable); USART_Cmd(USART2, ENABLE); // 5. 使能DMA请求 USART_DMACmd(USART2, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE); // 6. 配置中断优先级USART2中断优先级2DMA中断优先级0更高 NVIC_InitStructure.NVIC_IRQChannel USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority 2; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel DMA1_Channel4_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority 0; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); }关键工程决策USART_OVRDetection_Disable禁用溢出检测避免因FIFO处理延迟导致的OVR标志置位干扰正常接收DMA中断优先级0高于串口中断2确保DMA状态变更能被及时响应USART_IT_IDLE使能为空闲中断提供硬件支持是实现不定长数据包接收的基础4.3 压力测试验证与性能边界在STM32F030C8T648MHz主频上进行实测1.5Mbps波特率使用CP2102 USB-TTL模块每毫秒发送1KB数据DMA接收回传全程无丢包CPU占用率15%大文件传输接收10MB二进制文件MD5校验与源文件完全一致中断负载在1.5Mbps下HT/TC/Idle三类中断合计频率约1.2kHz远低于F0系列中断处理能力上限100kHz测试表明该方案在F0系列资源约束下仍能稳定支撑工业级高速串口通信需求。其性能瓶颈实际在于USB-TTL转换芯片的吞吐能力而非MCU本身。5. 实际工程部署建议5.1 缓冲区尺寸规划指南应用场景推荐DMA接收缓冲区推荐DMA发送缓冲区推荐FIFO深度传感器数据采集9600bps64字节32字节128字节工业协议通信115200bps256字节128字节512字节高速数据透传1Mbps1024字节256字节2048字节缓冲区尺寸需满足DMA缓冲区 ≥ 2 × 最大单包长度且为2的幂次方便于地址计算。5.2 调试与故障排查要点数据错乱检查DMA_ClearFlag()是否在DMA_Cmd(ENABLE)之前执行接收中断缺失确认USART_ITConfig(USARTx, USART_IT_IDLE, ENABLE)已调用发送卡死验证status标志是否在DMA启动前正确置位DMA错误中断触发检查DMA_PeripheralBaseAddr是否指向正确的RDR/TDR寄存器地址所有配置必须严格遵循参考手册中DMA通道与外设的映射关系F030系列中USART2_RX固定映射至DMA1_Channel5不可随意更改。5.3 代码集成注意事项FIFO模块依赖需实现线程安全的环形缓冲区支持fifo_write()/fifo_read()原子操作中断服务程序ISR所有DMA和USART中断函数必须声明为__attribute__((interrupt(IRQ)))避免编译器优化导致栈溢出内存分配DMA缓冲区必须位于SRAM中且地址对齐至4字节边界__attribute__((aligned(4)))该方案已在多个工业现场设备中稳定运行超2年证明其在资源受限MCU上实现高性能串口通信的工程可行性。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…