STM32-15-DMA
STM32-01-认识单片机
STM32-02-基础知识
STM32-03-HAL库
STM32-04-时钟树
STM32-05-SYSTEM文件夹
STM32-06-GPIO
STM32-07-外部中断
STM32-08-串口
STM32-09-IWDG和WWDG
STM32-10-定时器
STM32-11-电容触摸按键
STM32-12-OLED模块
STM32-13-MPU
STM32-14-FSMC_LCD
文章目录
- STM32-15-DMA
- 1. DMA与中断的区别
- 1. DMA
- 2. 中断
- 2. DMA介绍
- 3. DMA结构框图
- 1. DMA框图
- 2. DMA处理过程
- 3. DMA通道
- 4. DMA相关寄存器
- 5. DMA相关HAL库驱动
- 6. 代码实现
STM32-15-DMA
1. DMA与中断的区别
**DMA
(Direct Memory Access
,直接内存访问)**和中断是两种不同的机制,用于管理计算机系统中外围设备与处理器之间的数据传输和处理。
1. DMA
工作原理:
- 独立传输:DMA允许外设直接与系统内存交换数据,而不需要通过处理器(CPU)。当需要大量数据传输时,DMA控制器接管传输任务,释放CPU去执行其他任务。
- 传输过程:DMA传输数据时,CPU启动DMA传输,然后DMA控制器接管整个传输过程。传输完成后,DMA控制器通过中断通知CPU传输完成。
作用:
- 提高效率:DMA减少了CPU在数据传输过程中的参与,使得CPU能够执行其他任务,从而提高系统的整体效率。
- 减少延迟:由于DMA可以独立进行传输,因此数据传输的延迟更低,特别是在处理大块数据时。
- 应用场景:DMA广泛应用于音频、视频数据流、网络数据包的传输、存储设备的数据读写等场景。
对程序的影响:
- 复杂度增加:引入DMA需要对DMA控制器进行配置,可能增加程序的复杂性。
- 同步问题:在DMA传输过程中,程序需要处理好数据同步问题,避免数据不一致性问题。
2. 中断
工作原理:
- 中断触发:中断是外设通过中断信号通知CPU某个事件发生,如输入设备有新数据可读取,定时器到期等。
- 中断处理:CPU响应中断后,暂停当前任务,跳转到相应的中断处理程序(ISR)执行。当中断处理程序执行完毕后,CPU恢复先前任务的执行。
作用:
- 实时响应:中断机制使CPU能够实时响应外设事件,保证系统对外部事件的快速反应。
- 事件驱动:中断使得程序可以基于事件驱动,而不是定期轮询外设状态,从而节省CPU资源。
- 应用场景:键盘输入、鼠标移动、网络数据包到达、定时器事件等。
对程序的影响:
- 中断处理程序设计:中断处理程序需要尽可能简短、快速,避免长时间占用CPU。
- 中断优先级管理:系统中可能有多个中断源,需要合理设计中断优先级,以确保关键中断能够及时响应。
- 上下文切换开销:中断会引起上下文切换,带来一定的性能开销。
总结
- DMA:适用于大量数据传输,降低CPU负载,提高系统效率。
- 中断:适用于实时事件响应,保证系统对外部事件的快速处理。
两者结合使用,可以构建高效、实时的嵌入式系统。例如,DMA用于大数据块的传输,而中断用于触发DMA传输和处理传输完成事件。
2. DMA介绍
- **DMA:**即直接存储器访问。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,能使CPU的效率大为提高。
- STM32F103内部有2个DMA控制器,
DMA1
有7
个通道,DMA2
有5
个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求,还有一个仲裁器来协调各个DMA请求的优先权。 - 特性:
- 每个通道都直接连接专用的硬件DMA请求,每个通道都支持软件触发。这些功能通过软件来配置。
- 在七个请求间的优先权可以通过软件编程设置,当软件相同时,由硬件决定。
- 独立的源和目标数据区的传输宽度,模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
- 支持循环的缓冲器管理。
- 每个通道都有3个事件标志,这3个事件标志逻辑或成为一个单独的中断请求。
- 存储器和存储器间的传输。
- 外设和存储器,存储器和外设的传输。
- 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
- 可编程的数据传输数目最大为65535。
3. DMA结构框图
1. DMA框图
-
①DMA请求
如果外设想要通过DMA来传输数据,必须先给DMA控制器发送DMA请求,DMA收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且DMA控制器收到应答信号之后,就会启动DMA的传输,直到传输完毕。
-
②DMA通道
DMA具有12个独立可编程的通道,其中DMA1有7个通道,DMA2有5个通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收多个。
-
③DMA优先级
当发生多个DMA通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器管理。仲裁器管理DMA通道请求分为两个阶段。第一阶段属于软件阶段,可以在
DMA_CCRx
寄存器中设置,有4个等级:非常高,高,中和低四个优先级。第二阶段属于硬件阶段,如果两个或以上的DMA通道请求设置的优先级一样,则他们优先级取决于通道编号,编号越低优先权越高,比如通道0高于通道1。在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。
2. DMA处理过程
DMA(Direct Memory Access,直接内存访问)是一种允许外设直接与系统内存进行数据传输的机制,不需要CPU的直接干预。以下是DMA处理过程的详细描述:
DMA处理过程
- 配置DMA控制器:
- 源地址:设置数据传输的源地址(可以是外设寄存器地址或内存地址)。
- 目标地址:设置数据传输的目标地址(可以是外设寄存器地址或内存地址)。
- 传输方向:指定数据传输的方向,是从外设到内存,还是从内存到外设。
- 数据长度:设置需要传输的数据长度(字节数)。
- 传输模式:选择传输模式,可以是单次传输、块传输或连续传输模式。
- 启动DMA传输:
- 触发传输:在配置完成后,通过设置DMA控制器的启动位,开始数据传输。
- 数据搬运:DMA控制器接管数据传输任务,将数据从源地址搬运到目标地址。这个过程中,DMA控制器直接与内存控制器和外设总线进行交互,不需要CPU干预。
- 中断通知:
- 传输完成中断:数据传输完成后,DMA控制器产生中断信号,通知CPU传输已经完成。CPU执行相应的中断服务程序(ISR)处理后续任务。
- 错误处理:如果在传输过程中发生错误(如总线错误),DMA控制器也会产生中断,通知CPU进行错误处理。
3. DMA通道
DMA1通道与外设的对应关系
DMA2通道与外设的对应关系
4. DMA相关寄存器
寄存器 | 名称 | 作用 |
---|---|---|
DMA_CCRx | DMA通道x配置寄存器 | 用于配置DMA(核心控制寄存器) |
DMA_ISR | DMA中断状态寄存器 | 用于查询当前DMA传输状态 |
DMA_IFCR | DMA中断标志清除寄存器 | 用来清除DMA_ISR对应位 |
DMA_CNDTRx | DMA通道x传输数量寄存器 | 用于控制DMA通道x每次传输的数据量 |
DMA_CPARx | DMA通道x外设地址寄存器 | 用于存储STM32外设地址 |
DMA_CMARx | DMA通道x存储器地址寄存器 | 用于存放存储器的地址 |
USART_CR3 | USART控制寄存器3 | 用于使能串口DMA发送 |
-
DMA通道x配置寄存器(DMA_CCRx)
-
DMA中断状态寄存器(DMA_ISR)
-
DMA 中断标志清除寄存器(DMA_IFCR)
-
DMA通道x传输数量寄存器(DMA_CNDTRx)
该寄存器控制着DMA通道x的每次传输所要传输的数据量。其设置范围为
0~65535
。并且该寄存器的值随着传输的进行而减少,当该寄存器的值为0
的时候就代表此次数据传输己经全部发送完成。可以通过这个寄存器的值来获取当前DMA传输的进度。 -
DMA通道x外设地址寄存器(DMA_CPARx)
用来存储 STM32 外设的地址。
-
DMA通道x存储器地址寄存器(DMA_CMARx)
用来存放存储器的地址。
5. DMA相关HAL库驱动
-
使能DMA时钟
__HAL_RCC_DMA1_CLK_ENABLE();
-
初始化DMA
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);typedef struct { uint32_t Direction; /* 传输方向,例如存储器到外设 DMA_MEMORY_TO_PERIPH */uint32_t PeriphInc; /* 外设(非)增量模式,非增量模式 DMA_PINC_DISABLE */ uint32_t MemInc; /* 存储器(非)增量模式,增量模式 DMA_MINC_ENABLE */ uint32_t PeriphDataAlignment; /* 外设数据大小:8/16/32 位 */uint32_t MemDataAlignment; /* 存储器数据大小:8/16/32 位 */uint32_t Mode; /* 模式:循环模式/普通模式 */ uint32_t Priority; /* DMA 优先级:低/中/高/非常高 */ }DMA_InitTypeDef;__HAL_LINKDMA(&g_uart1_handler, hdmatx, g_dma_handle);
-
使能串口的DMA发送,启动传输
HAL_UART_Transmit_DMA()HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart); /* 停止 */ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart); /* 暂停 */ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart); /* 恢复 */
-
查询DMA传输状态
//查询DMA传输通道的状态 __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4);//获取当前传输剩余数据量 __HAL_DMA_GET_COUNTER(&g_dma_handle);//设置对应的DMA数据流传输的数据量大小 __HAL_DMA_SET_COUNTER (&g_dma_handle, 1000);
-
DMA中断使用
//通用中断处理函数 void HAL_DMA_IRQHandler();//相关中断回调函数 //发送完成回调函数 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //发送一半回调函数 void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //接收完成回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //接收一半回调函数 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); //传输出错回调函数 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
6. 代码实现
-
功能
每按下按键KEY0,串口1就会以DMA方式发送数据,同时在LCD上面显示传送进度。打开串口调试助手,可以收到DMA发送的内容。LED0闪烁用于提示程序正在运行。
-
DMA初始化函数
void dma_init(DMA_Channel_TypeDef* DMAx_CHx) {if((uint32_t)DMAx_CHx > (uint32_t)DMA1_Channel7){__HAL_RCC_DMA2_CLK_ENABLE();}else{__HAL_RCC_DMA2_CLK_ENABLE();}//将DMA与USART1连接起来__HAL_LINKDMA(&g_uart1_handle, hdmatx, g_dma_handle); g_dma_handle.Instance = DMAx_CHx; //USART1_TX使用的DMA通道为DMA_Channel4g_dma_handle.Init.Direction = DMA_MEMORY_TO_PERIPH; //模式选择为从存储器到外设g_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE; //外设非增量模式g_dma_handle.Init.MemInc = DMA_MINC_ENABLE; //存储器增量模式g_dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; //外设数据长度为8位g_dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; //存储器数据长度为8位g_dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM; //中等优先级HAL_DMA_Init(&g_dma_handle); }
-
主函数
int main(void) {uint16_t i, k;uint16_t len;uint8_t mask = 0;float pro = 0; /* 进度 */HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */usart_init(115200); /* 串口初始化为115200 */led_init(); /* 初始化LED */lcd_init(); /* 初始化LCD */key_init(); /* 初始化按键 */dma_init(DMA1_Channel4); /* 初始化串口1 TX DMA */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "DMA TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:Start", RED);len = sizeof(TEXT_TO_SEND);k = 0;for (i = 0; i < SEND_BUF_SIZE; i++) /* 填充ASCII字符集数据 */{if (k >= len) /* 入换行符 */{if (mask){g_sendbuf[i] = 0x0a;k = 0;}else{g_sendbuf[i] = 0x0d;mask++;}}else /* 复制TEXT_TO_SEND语句 */{mask = 0;g_sendbuf[i] = TEXT_TO_SEND[k];k++;}}i = 0;while (1){if (key_scan(0) == 1) /* KEY0按下 */{printf("\r\nDMA DATA:\r\n");lcd_show_string(30, 130, 200, 16, 16, "Start Transimit....", BLUE);lcd_show_string(30, 150, 200, 16, 16, " %", BLUE); /* 显示百分号 */HAL_UART_Transmit_DMA(&g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);/* 等待DMA传输完成,此时我们来做另外一些事情,比如点灯 * 实际应用中,传输数据期间,可以执行另外的任务 */while (1){if ( __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4)) /* 等待 DMA1_Channel4 传输完成 */{__HAL_DMA_CLEAR_FLAG(&g_dma_handle, DMA_FLAG_TC4);HAL_UART_DMAStop(&g_uart1_handle); /* 传输完成以后关闭串口DMA */break;}pro = DMA1_Channel4->CNDTR; /* 得到当前还剩余多少个数据 */len = SEND_BUF_SIZE; /* 总长度 */pro = 1 - (pro / len); /* 得到百分比 */pro *= 100; /* 扩大100倍 */lcd_show_num(30, 150, pro, 3, 16, BLUE);} lcd_show_num(30, 150, 100, 3, 16, BLUE); /* 显示100% */lcd_show_string(30, 130, 200, 16, 16, "Transimit Finished!", BLUE); /* 提示传送完成 */}i++;delay_ms(10);if (i == 20){LED0_TOGGLE(); /* LED0闪烁,提示系统正在运行 */i = 0;}} }
-
实验结果
相关文章:

STM32-15-DMA
STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD 文章目录 STM…...

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比
【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释: 用户调用如accept、read等系统调用,向内核发起I/O请求后,应用程序…...

大米cms安装支付逻辑漏洞
1.安装 下载来源:https://www.cnblogs.com/xfbk/p/17910054.html 链接:https://pan.baidu.com/s/1b-Z6RaFBZ6CsSIErY46Pyg?pwdq8qq 提取码:q8qq 注意一下配置就可以了:php5.5apachemysql5.0,主要就是数据库版本要注…...

使用 zxing 生成二维码以及条形码
需求背景 前期在做项目的时候,有一个需求是说要生成一张条形码,并且呢将条形码插入到 excel 中去,但是之前一直没有搞过找个条形码或者是二维码,最后是做出来了,这里呢就先看看怎么生成,后面再抽时间来写写…...
发布 jar 包到 maven 中央仓库
目前开发基本都是以maven或者gradle的方式,直接引入依赖包即可,那么该咋那么发布我们自己的jar包到maven仓库,让别人使用呢?本文适用于2024.3之后的步骤 文章目录 账号准备第一步,注册账号第二步,新建命名空间第三步,验证命名空间第四步,创建 push 的账号和密码点击右…...

AI智能体研发之路-模型篇(四):一文入门pytorch开发
博客导读: 《AI—工程篇》 AI智能体研发之路-工程篇(一):Docker助力AI智能体开发提效 AI智能体研发之路-工程篇(二):Dify智能体开发平台一键部署 AI智能体研发之路-工程篇(三&am…...
英语口语中though的用法(even though、as though)
文章目录 英语口语中 "though" 的用法详解1. "Though" 作为转折连词的用法1.1 基本用法示例句子: 1.2 位置灵活性示例句子: 2. "Though" 作为副词的用法2.1 表示对比或转折示例句子: 2.2 强调前述观点示例句子…...

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知
1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…...
前端 JS 经典:判断数组的准确方法
前言:判断数组的方法有很多,但是最完美的只有一个。 1. Object.prototype.toString.call 通过 toString.call 方法来判断是否数组。 function isArray(obj) {return Object.prototype.toString.call(obj) "[object Array]"; } 缺点&#…...
【仓库设置问题】
问题: 某公司在高速公路一些服务站内开设了百货超市,为了能及时给这些百货超市提供足够的商品,他们需要在一些百货超市旁修建仓库。一个仓库可以同时为多家百货超市提供服务,以满足各个超市对商品的需求。现已知这些百货超市在高…...

深度学习知识与心得
目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络(BP网络) 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN(计算机视觉) 自然语言处理NLP Wo…...
Qt for Android
文章 USB Qt for android 获取USB设备列表(一)Java方式 获取 Qt for android 获取USB设备列表(二)JNI方式 获取 Qt for android 串口库使用 Qt for android : libusb在android中使用 Qt for Android : 使用libusb做CH340x串口传…...
HTTP 的三次握手
HTTP 的三次握手是指在建立 TCP 连接时,客户端和服务器之间进行的三步握手过程。这个过程确保了双方都能够互相通信,并且同步了彼此的序列号和确认号。 概念: 第一次握手:客户端发送一个 SYN(同步…...

【Text2SQL 论文】T5-SR:使用 T5 生成中间表示来得到 SQL
论文:T5-SR: A Unified Seq-to-Seq Decoding Strategy for Semantic Parsing ⭐⭐⭐ 北大 & 中科大,arXiv:2306.08368 文章目录 一、论文速读二、中间表示:SSQL三、Score Re-estimator四、总结 一、论文速读 本文设计了一个 NL 和 SQL 的…...
【HarmonyOS】应用屏蔽截屏和录屏
【HarmonyOS】应用屏蔽截屏和录屏 一、问题背景: 金融类或者高密性质的应用APP,对于截屏和录屏场景,某些业务下是禁止不允许。 目前这种场景的需求也是非常有必要的,很多电诈都是通过远程录屏软件,获取到账户密码或者…...
[BUG历险记] ERROR: [SIM 211-100] CSim failed with errors
问题重现 在开发HLS过程中,我碰到一个奇怪的现象,同样的工程,在我重装完系统后,不能进行C仿真了,但是综合实现都是可以正常运作的。 vitis的报错也非常奇怪,单单一行: ERROR: [SIM 211-100] C…...

Redis中大Key与热Key的解决方案
原文地址:https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库,但是在实际的使用过程中,我们常常会遇到两个常见的问题,也就是文章标题所说的大 key与热 key。 一、定义 1.1…...
MySQL 视图(2)
上一篇:MySQL视图(1) 基于其他视图 案例对 WITH [CASCADED | LOCAL] CHECK OPTION 进行释义 创建视图时,可以基于表 / 多个表,也可以使用 其他视图表 / 其他视图 其他视图 的方式进行组合。 总结 更新视图&#x…...

Leecode---技巧---颜色分类、下一个排列、寻找重复数
思路: 遍历一遍记录0,1,2的个数,然后再遍历一次,按照0,1,2的个数修改nums即可。 class Solution { public:void sortColors(vector<int>& nums){int n0 0, n1 0, n2 0;for(int x: nums){if(x0) n0;else if(x1) n1;else n2;}for…...
ERC-7401:嵌套 NFT 标准的全新篇章
在数字资产和区块链技术迅速发展的今天,非同质化代币(NFT)已经成为了一种重要的资产形式,广泛应用于艺术、游戏、收藏品等多个领域。随着市场需求的多样化,传统的 NFT 标准如 ERC-721 和 ERC-1155 已经不能完全满足用户…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...