当前位置: 首页 > news >正文

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与中断的区别

**DMADirect 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控制器,DMA17个通道,DMA25个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求,还有一个仲裁器来协调各个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处理过程

  1. 配置DMA控制器
    • 源地址:设置数据传输的源地址(可以是外设寄存器地址或内存地址)。
    • 目标地址:设置数据传输的目标地址(可以是外设寄存器地址或内存地址)。
    • 传输方向:指定数据传输的方向,是从外设到内存,还是从内存到外设。
    • 数据长度:设置需要传输的数据长度(字节数)。
    • 传输模式:选择传输模式,可以是单次传输、块传输或连续传输模式。
  2. 启动DMA传输
    • 触发传输:在配置完成后,通过设置DMA控制器的启动位,开始数据传输。
    • 数据搬运:DMA控制器接管数据传输任务,将数据从源地址搬运到目标地址。这个过程中,DMA控制器直接与内存控制器和外设总线进行交互,不需要CPU干预。
  3. 中断通知
    • 传输完成中断:数据传输完成后,DMA控制器产生中断信号,通知CPU传输已经完成。CPU执行相应的中断服务程序(ISR)处理后续任务。
    • 错误处理:如果在传输过程中发生错误(如总线错误),DMA控制器也会产生中断,通知CPU进行错误处理。

3. DMA通道

DMA1通道与外设的对应关系
在这里插入图片描述

DMA2通道与外设的对应关系
在这里插入图片描述

4. DMA相关寄存器

寄存器名称作用
DMA_CCRxDMA通道x配置寄存器用于配置DMA(核心控制寄存器)
DMA_ISRDMA中断状态寄存器用于查询当前DMA传输状态
DMA_IFCRDMA中断标志清除寄存器用来清除DMA_ISR对应位
DMA_CNDTRxDMA通道x传输数量寄存器用于控制DMA通道x每次传输的数据量
DMA_CPARxDMA通道x外设地址寄存器用于存储STM32外设地址
DMA_CMARxDMA通道x存储器地址寄存器用于存放存储器的地址
USART_CR3USART控制寄存器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库驱动

  1. 使能DMA时钟

    __HAL_RCC_DMA1_CLK_ENABLE();
    
  2. 初始化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);
    
  3. 使能串口的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); /* 恢复 */
    
  4. 查询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);
    
  5. 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) 解释&#xff1a; 用户调用如accept、read等系统调用&#xff0c;向内核发起I/O请求后&#xff0c;应用程序…...

大米cms安装支付逻辑漏洞

1.安装 下载来源&#xff1a;https://www.cnblogs.com/xfbk/p/17910054.html 链接&#xff1a;https://pan.baidu.com/s/1b-Z6RaFBZ6CsSIErY46Pyg?pwdq8qq 提取码&#xff1a;q8qq 注意一下配置就可以了&#xff1a;php5.5apachemysql5.0&#xff0c;主要就是数据库版本要注…...

使用 zxing 生成二维码以及条形码

需求背景 前期在做项目的时候&#xff0c;有一个需求是说要生成一张条形码&#xff0c;并且呢将条形码插入到 excel 中去&#xff0c;但是之前一直没有搞过找个条形码或者是二维码&#xff0c;最后是做出来了&#xff0c;这里呢就先看看怎么生成&#xff0c;后面再抽时间来写写…...

发布 jar 包到 maven 中央仓库

目前开发基本都是以maven或者gradle的方式,直接引入依赖包即可,那么该咋那么发布我们自己的jar包到maven仓库,让别人使用呢?本文适用于2024.3之后的步骤 文章目录 账号准备第一步,注册账号第二步,新建命名空间第三步,验证命名空间第四步,创建 push 的账号和密码点击右…...

AI智能体研发之路-模型篇(四):一文入门pytorch开发

博客导读&#xff1a; 《AI—工程篇》 AI智能体研发之路-工程篇&#xff08;一&#xff09;&#xff1a;Docker助力AI智能体开发提效 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署 AI智能体研发之路-工程篇&#xff08;三&am…...

英语口语中though的用法(even though、as though)

文章目录 英语口语中 "though" 的用法详解1. "Though" 作为转折连词的用法1.1 基本用法示例句子&#xff1a; 1.2 位置灵活性示例句子&#xff1a; 2. "Though" 作为副词的用法2.1 表示对比或转折示例句子&#xff1a; 2.2 强调前述观点示例句子…...

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…...

前端 JS 经典:判断数组的准确方法

前言&#xff1a;判断数组的方法有很多&#xff0c;但是最完美的只有一个。 1. Object.prototype.toString.call 通过 toString.call 方法来判断是否数组。 function isArray(obj) {return Object.prototype.toString.call(obj) "[object Array]"; } 缺点&#…...

【仓库设置问题】

问题&#xff1a; 某公司在高速公路一些服务站内开设了百货超市&#xff0c;为了能及时给这些百货超市提供足够的商品&#xff0c;他们需要在一些百货超市旁修建仓库。一个仓库可以同时为多家百货超市提供服务&#xff0c;以满足各个超市对商品的需求。现已知这些百货超市在高…...

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…...

Qt for Android

文章 USB Qt for android 获取USB设备列表&#xff08;一&#xff09;Java方式 获取 Qt for android 获取USB设备列表&#xff08;二&#xff09;JNI方式 获取 Qt for android 串口库使用 Qt for android : libusb在android中使用 Qt for Android : 使用libusb做CH340x串口传…...

HTTP 的三次握手

​​​​​ HTTP 的三次握手是指在建立 TCP 连接时&#xff0c;客户端和服务器之间进行的三步握手过程。这个过程确保了双方都能够互相通信&#xff0c;并且同步了彼此的序列号和确认号。 概念&#xff1a; 第一次握手&#xff1a;客户端发送一个 SYN&#xff08;同步…...

【Text2SQL 论文】T5-SR:使用 T5 生成中间表示来得到 SQL

论文&#xff1a;T5-SR: A Unified Seq-to-Seq Decoding Strategy for Semantic Parsing ⭐⭐⭐ 北大 & 中科大&#xff0c;arXiv:2306.08368 文章目录 一、论文速读二、中间表示&#xff1a;SSQL三、Score Re-estimator四、总结 一、论文速读 本文设计了一个 NL 和 SQL 的…...

【HarmonyOS】应用屏蔽截屏和录屏

【HarmonyOS】应用屏蔽截屏和录屏 一、问题背景&#xff1a; 金融类或者高密性质的应用APP&#xff0c;对于截屏和录屏场景&#xff0c;某些业务下是禁止不允许。 目前这种场景的需求也是非常有必要的&#xff0c;很多电诈都是通过远程录屏软件&#xff0c;获取到账户密码或者…...

[BUG历险记] ERROR: [SIM 211-100] CSim failed with errors

问题重现 在开发HLS过程中&#xff0c;我碰到一个奇怪的现象&#xff0c;同样的工程&#xff0c;在我重装完系统后&#xff0c;不能进行C仿真了&#xff0c;但是综合实现都是可以正常运作的。 vitis的报错也非常奇怪&#xff0c;单单一行&#xff1a; ERROR: [SIM 211-100] C…...

Redis中大Key与热Key的解决方案

原文地址&#xff1a;https://mp.weixin.qq.com/s/13p2VCmqC4oc85h37YoBcg 在工作中Redis已经成为必备的一款高性能的缓存数据库&#xff0c;但是在实际的使用过程中&#xff0c;我们常常会遇到两个常见的问题&#xff0c;也就是文章标题所说的大 key与热 key。 一、定义 1.1…...

MySQL 视图(2)

上一篇&#xff1a;MySQL视图&#xff08;1&#xff09; 基于其他视图 案例对 WITH [CASCADED | LOCAL] CHECK OPTION 进行释义 创建视图时&#xff0c;可以基于表 / 多个表&#xff0c;也可以使用 其他视图表 / 其他视图 其他视图 的方式进行组合。 总结 更新视图&#x…...

Leecode---技巧---颜色分类、下一个排列、寻找重复数

思路&#xff1a; 遍历一遍记录0,1,2的个数&#xff0c;然后再遍历一次&#xff0c;按照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 标准的全新篇章

在数字资产和区块链技术迅速发展的今天&#xff0c;非同质化代币&#xff08;NFT&#xff09;已经成为了一种重要的资产形式&#xff0c;广泛应用于艺术、游戏、收藏品等多个领域。随着市场需求的多样化&#xff0c;传统的 NFT 标准如 ERC-721 和 ERC-1155 已经不能完全满足用户…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...