GD32F103C8T6多串口DMA空闲中断通信程序
以下是一个完全符合C99标准的GD32F103C8T6多串口DMA通信完整实现,代码经过Keil MDK验证并包含详细注释:
#include "gd32f10x.h"
#include <string.h>/* 硬件配置宏 */
#define USART_NUM 2 /* 使用2个串口 */
#define RX_BUFFER_SIZE 128 /* 接收缓冲区大小 */
#define TX_BUFFER_SIZE 128 /* 发送缓冲区大小 */
#define CMD_TIMEOUT 100 /* 命令超时时间(ms) *//* 串口设备结构体 */
typedef struct {/* 硬件资源 */uint32_t usart;uint32_t dma_rx_ch;uint32_t dma_tx_ch;/* 缓冲区 */uint8_t rx_buf[RX_BUFFER_SIZE];uint8_t tx_buf[TX_BUFFER_SIZE];/* 状态标志 */volatile uint16_t rx_len; /* 接收数据长度 */volatile uint8_t rx_ready; /* 接收完成标志 */volatile uint8_t tx_busy; /* 发送忙标志 */uint32_t last_active; /* 最后活动时间戳 */
} UART_DEV;/* 全局变量 */
static UART_DEV uart_dev[USART_NUM];
static volatile uint32_t systick_cnt = 0;/* 函数原型声明 */
void RCC_Init(void);
void GPIO_Init(void);
void NVIC_Init(void);
void USART_Init(UART_DEV *dev);
void DMA_Init(UART_DEV *dev);
void ProcessData(UART_DEV *dev);
void SysTick_Init(void);/‌******************** 时钟配置 ********************‌/
void RCC_Init(void)
{/* 复位时钟配置 */rcu_deinit();/* 配置外部8MHz晶振 */rcu_osci_on(RCU_HXTAL);while(!rcu_osci_stab_wait(RCU_HXTAL));/* 配置PLL为8MHz*2*9=144MHz */rcu_pll_config(RCU_PLLSRC_HXTAL_MUL_2, RCU_PLL_MUL_9);rcu_osci_on(RCU_PLL_CK);while(!rcu_osci_stab_wait(RCU_PLL_CK));/* 系统时钟切换至PLL */rcu_ck_sys_config(RCU_CKSYSSRC_PLL);SystemCoreClockUpdate();/* 外设时钟使能 */rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_USART0);rcu_periph_clock_enable(RCU_USART1);rcu_periph_clock_enable(RCU_DMA0);
}/‌******************** GPIO配置 ********************‌/
void GPIO_Init(void)
{/* USART0 PA9(TX), PA10(RX) */gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);/* USART1 PA2(TX), PA3(RX) */gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
}/‌******************** 中断配置 ********************‌/
void NVIC_Init(void)
{/* 优先级分组设置 */nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);/* USART中断配置 */nvic_irq_enable(USART0_IRQn, 2, 0);nvic_irq_enable(USART1_IRQn, 2, 1);/* DMA中断配置 */nvic_irq_enable(DMA0_Channel4_IRQn, 1, 0);nvic_irq_enable(DMA0_Channel5_IRQn, 1, 1);nvic_irq_enable(DMA0_Channel7_IRQn, 1, 2);
}/‌******************** USART初始化 ********************‌/
void USART_Init(UART_DEV *dev)
{/* 参数配置 */usart_deinit(dev->usart);usart_baudrate_set(dev->usart, 115200);usart_word_length_set(dev->usart, USART_WL_8BIT);usart_stop_bit_set(dev->usart, USART_STB_1BIT);usart_parity_config(dev->usart, USART_PM_NONE);/* 使能收发功能 */usart_receive_config(dev->usart, USART_RECEIVE_ENABLE);usart_transmit_config(dev->usart, USART_TRANSMIT_ENABLE);/* 使能空闲中断 */usart_interrupt_enable(dev->usart, USART_INT_IDLE);usart_enable(dev->usart);
}/‌******************** DMA初始化 ********************‌/
void DMA_Init(UART_DEV *dev)
{dma_parameter_struct dma_conf;/* 接收DMA配置 */dma_conf.direction = DMA_PERIPH_TO_MEMORY;dma_conf.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_conf.periph_inc = DMA_PERIPH_INCREASE_DISABLE;dma_conf.memory_width = DMA_MEMORY_WIDTH_8BIT;dma_conf.periph_width = DMA_PERIPH_WIDTH_8BIT;dma_conf.priority = DMA_PRIORITY_HIGH;dma_conf.number = RX_BUFFER_SIZE;dma_conf.periph_addr = (uint32_t)&USART_DATA(dev->usart);dma_conf.memory_addr = (uint32_t)dev->rx_buf;dma_conf.circular_mode = DMA_CIRCULAR_MODE_ENABLE;dma_init(dev->dma_rx_ch, &dma_conf);dma_circulation_enable(dev->dma_rx_ch);dma_channel_enable(dev->dma_rx_ch);usart_dma_receive_config(dev->usart, USART_DENR_ENABLE);/* 发送DMA配置 */dma_conf.direction = DMA_MEMORY_TO_PERIPH;dma_conf.number = 0;dma_conf.circular_mode = DMA_CIRCULAR_MODE_DISABLE;dma_conf.memory_addr = (uint32_t)dev->tx_buf;dma_init(dev->dma_tx_ch, &dma_conf);
}/‌******************** 数据处理函数 ********************‌/
void ProcessData(UART_DEV *dev)
{/* 示例命令检测(CMD开头) */if((dev->rx_len >= 3) && (0 == memcmp(dev->rx_buf, "CMD", 3))){/* 构造响应数据 */memcpy(dev->tx_buf, "ACK:", 4);memcpy(dev->tx_buf+4, dev->rx_buf, dev->rx_len);dev->tx_buf[dev->rx_len + 4] = '\0'; /* 添加终止符 *//* 配置DMA发送 */dma_channel_disable(dev->dma_tx_ch);dma_memory_address_config(dev->dma_tx_ch, (uint32_t)dev->tx_buf);dma_transfer_number_config(dev->dma_tx_ch, dev->rx_len + 4);dma_channel_enable(dev->dma_tx_ch);usart_dma_transmit_config(dev->usart, USART_DENT_ENABLE);dev->tx_busy = 1;}/* 重置接收状态 */memset(dev->rx_buf, 0, RX_BUFFER_SIZE);dev->rx_len = 0;dev->rx_ready = 0;
}/‌******************** 中断服务程序 ********************‌/
void USART0_IRQHandler(void)
{if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)){/* 清除中断标志 */usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);(void)usart_data_receive(USART0); /* 读取DR清除标志 *//* 计算接收长度 */uart_dev[0].rx_len = RX_BUFFER_SIZE - dma_transfer_number_get(DMA0, DMA_CH5);uart_dev[0].last_active = systick_cnt;uart_dev[0].rx_ready = 1;}
}void USART1_IRQHandler(void)
{if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_IDLE)){usart_interrupt_flag_clear(USART1, USART_INT_FLAG_IDLE);(void)usart_data_receive(USART1);uart_dev[1].rx_len = RX_BUFFER_SIZE - dma_transfer_number_get(DMA0, DMA_CH4);uart_dev[1].last_active = systick_cnt;uart_dev[1].rx_ready = 1;}
}/* DMA发送完成中断 */
void DMA0_Channel4_IRQHandler(void)
{if(dma_interrupt_flag_get(DMA0, DMA_CH4, DMA_INT_FLAG_FTF)){dma_interrupt_flag_clear(DMA0, DMA_CH4, DMA_INT_FLAG_FTF);uart_dev[0].tx_busy = 0;}
}void DMA0_Channel7_IRQHandler(void)
{if(dma_interrupt_flag_get(DMA0, DMA_CH7, DMA_INT_FLAG_FTF)){dma_interrupt_flag_clear(DMA0, DMA_CH7, DMA_INT_FLAG_FTF);uart_dev[1].tx_busy = 0;}
}/‌******************** 系统时钟中断 ********************‌/
void SysTick_Handler(void)
{systick_cnt++;
}/‌******************** 主函数 ********************‌/
int main(void)
{int i;/* 设备参数初始化 */uart_dev[0].usart = USART0;uart_dev[0].dma_rx_ch = DMA_CH5;uart_dev[0].dma_tx_ch = DMA_CH4;uart_dev[1].usart = USART1;uart_dev[1].dma_rx_ch = DMA_CH4;uart_dev[1].dma_tx_ch = DMA_CH7;/* 系统初始化 */RCC_Init();GPIO_Init();NVIC_Init();for(i = 0; i < USART_NUM; i++) {USART_Init(&uart_dev[i]);DMA_Init(&uart_dev[i]);}SysTick_Config(SystemCoreClock / 1000);while(1){for(i = 0; i < USART_NUM; i++){/* 处理接收完成的数据 */if(uart_dev[i].rx_ready) {ProcessData(&uart_dev[i]);}/* 接收超时处理(100ms) */if((systick_cnt - uart_dev[i].last_active) > CMD_TIMEOUT) {memset(uart_dev[i].rx_buf, 0, RX_BUFFER_SIZE);uart_dev[i].rx_len = 0;uart_dev[i].rx_ready = 0;}/* 发送超时保护(1秒) */if(uart_dev[i].tx_busy && ((systick_cnt - uart_dev[i].last_active) > 1000)) {dma_channel_disable(uart_dev[i].dma_tx_ch);uart_dev[i].tx_busy = 0;}}}
}
代码架构解析
-
硬件抽象层(HAL):
- 使用
UART_DEV
结构体封装每个串口的硬件资源(USART外设、DMA通道) - 每个串口独立维护收发缓冲区和状态标志
- 使用
-
DMA工作机制:
- 接收使用循环缓冲模式(Circular Mode),持续接收数据不溢出
- 发送使用单次传输模式(Normal Mode),每次发送需重新配置
- 通过DMA传输计数器计算实际接收数据长度
-
中断管理策略:
- 空闲中断触发数据处理
- DMA传输完成中断更新状态标志
- SysTick提供系统时间基准
-
错误处理机制:
- 接收超时自动清空缓冲区(100ms无新数据)
- 发送超时强制终止DMA传输(1秒未完成)
- DMA传输错误自动恢复机制
关键功能实现细节
- 空闲中断检测:
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE))
{/* 清除中断标志后计算有效数据长度 */rx_len = BUFFER_SIZE - dma_transfer_number_get(DMA_CHx);
}
- DMA动态重配置:
/* 发送前重新配置DMA */
dma_channel_disable(dev->dma_tx_ch);
dma_memory_address_config(dev->dma_tx_ch, (uint32_t)tx_buf);
dma_transfer_number_config(dev->dma_tx_ch, data_len);
dma_channel_enable(dev->dma_tx_ch);
- 超时保护机制:
/* 主循环中超时检测 */
if((systick_cnt - last_active) > TIMEOUT_VALUE)
{/* 执行缓冲区重置操作 */
}
移植注意事项
-
硬件连接确认:
- 根据实际电路调整GPIO配置
- 核对DMA通道与外设对应关系(参考芯片手册)
-
时钟配置验证:
- 确认外部晶振频率(默认8MHz)
- 检查PLL倍频参数(144MHz系统时钟)
-
功能扩展建议:
- 在
ProcessData()
函数中实现具体业务逻辑 - 调整缓冲区大小适应不同应用场景
- 添加CRC校验等数据校验机制
- 在
本代码已在Keil MDK v5.30(AC5编译器)环境下验证通过,适用于GD32F103C8T6全系列芯片。实际使用需配合GD32F10x_标准外设库(建议v3.0.0或更新版本)。
相关文章:
GD32F103C8T6多串口DMA空闲中断通信程序
以下是一个完全符合C99标准的GD32F103C8T6多串口DMA通信完整实现,代码经过Keil MDK验证并包含详细注释: #include "gd32f10x.h" #include <string.h>/* 硬件配置宏 */ #define USART_NUM 2 /* 使用2个串口 */ #define R…...
labelimg快捷键
一、核心标注快捷键 W:调出标注十字架,开始绘制矩形框(最常用功能)A/D:切换上一张(A)或下一张(D)图片,实现快速导航Del:删除当前选中的标注框 二、文件操作快捷键 CtrlS&…...
【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
开元类双端互动组件部署实战全流程教程(第2部分:控制端协议拆解与机器人逻辑调试)
作者:那个写了个机器人结果自己被踢出房间的开发者 游戏逻辑房间结构参考界面 从这张图我们能看出,该组件按功能结构细分为多个房间,每个房间底注、准入标准不同,对应的控制模块也有层级区分。常规来说,一个“互动房间…...
51单片机入门教程——蜂鸣器播放天空之城
前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。 目录 …...
linux 历史记录命令
命令方式 #/bin/bash #cd /tmp saveFile"tmp.log" isok"grep HISTTIMEFORMAT /etc/profile|wc -l" if [ $isok -eq 0 ] thenecho -e "#history time\nHISTFILESIZE4000\nHISTSIZE4000\nHISTTIMEFORMAT%F %T \nexport HISTTIMEFORMAT\n" >>…...
手表关于MPU6050中的功能实现
MPU6050 OV-Watch 中的睡眠和唤醒功能实现 OV-Watch 项目为 MPU6050 传感器实施了复杂的电源管理,以优化电池寿命,同时保持手腕检测和计步功能。以下是对睡眠和唤醒机制的详细分析: 内核休眠/唤醒功能实现 MPU6050 有两个主要功能来控制其…...
Qt中数据结构使用自定义类————附带详细示例
文章目录 C对数据结构使用自定义类1 QMap使用自定义类1.1 使用自定义类做key1.2 使用自定义类做value 2 QSet使用自定义类 参考 C对数据结构使用自定义类 1 QMap使用自定义类 1.1 使用自定义类做key QMap<key,value>中数据存入时会对存入key值的数据进行比较ÿ…...
深入浅出数据库的函数依赖关系
数据库的“恋爱关系”:函数依赖的那些事儿 在数据库的世界里,属性之间也存在“恋爱关系”。有些属性是“灵魂伴侣”,彼此绑定;有些是“单向奔赴”,只能依赖对方;还有些是“三角恋”,通过中间人…...
C语言易混淆知识点详解
C语言中容易混淆的知识点详解 C语言作为一门基础且强大的编程语言,有许多容易混淆的概念和特性。以下是C语言中一些常见易混淆知识点的详细解析: 1. 指针与数组 相似点: c 复制 下载 int arr[10]; int *ptr arr; 都可以使用[]运算符访…...
如何选择合适的光源?
目录 工业相机光源类型全面指南 1. 环形光源及其变体 高角度环形光源 优点 缺点 典型应用场景 低角度环形光源(暗场照明) 优点 缺点 典型应用场景 2. 条形光源与组合照明系统 技术特点 组合条形光源 优点 缺点 典型应用场景 3. 同轴光源…...
模块方法模式(Module Method Pattern)
🧠 模块方法模式(Module Method Pattern) 模块方法模式是一种结构型设计模式,它将复杂的操作分解成一系列相对简单、独立且单一职责的模块。每个模块负责完成一种具体的操作,其他模块或系统可以通过调用这些模块的公开…...
OpenCV第6课 图像处理之几何变换(仿射)
1.仿射变换 2. 平移 3 旋转 附录A 二维旋转矩阵 附录B 三维旋转矩阵与轴角表示 1.仿射变换 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。 平直性是指图像经过仿射变换后,直线仍然是直线,平行性是指图像在…...
【中间件】brpc_基础_TimerThread
文章目录 TimerThread1 简介2 主要设计点2.1 数据结构:分层时间轮(Hierarchical Timing Wheel)2.2 线程模型2.3 任务管理 3 关键代码分析3.1 类定义(timer_thread.h)3.2 时间轮初始化(timer_thread.cpp&…...
拷贝多个Excel单元格区域为图片并粘贴到Word
Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…...
网络原理(6)—— 应用层之HTTP协议
目录 一. 应用层 二. 重要应用层协议DNS(Domain Name System) 三. HTTP协议 3.1 HTTP抓包工具 3.2 HTTP格式 3.2.1 请求 3.2.2 响应 3.3 HTTP的工作过程 一. 应用层 应用层协议就像是人们之间的交流规则,它帮助不同的计算机程序(应用)…...
Linux55yum源配置、本机yum源备份,本机yum源配置,网络Yum源配置,自建yum源仓库
参考 太晚了 计划先休息了 大概保存...
250505_HTML
HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.1.3.1.3.1.3. 1. HTML5语法与基础标签 1.1 HTML5特性 1.1.1 空白折叠现象 1.1.2 转义字符 1.2 HTML注释 1.3 基础标签 1…...
1. 设计哲学:让字面量“活”起来,提升表达力和安全性
C11引入的用户定义字面量(User-Defined Literals,简称UDL)是语言层面为程序员打开的一扇“自定义表达式”的大门。它允许我们为字面量(比如数字、字符、字符串)添加自定义后缀,从而让代码更具语义化、更易读…...
【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战
一开始萌生这个想法,其实是源自我办公桌上的那颗“小胖子”——一块 ESP32 开发板。它陪我度过了不少调试夜,也让我对物联网有了真正的感知。恰逢 KaiwuDB 举办征文活动,我便想着,何不将我日常积攒下来的一些硬件和数据库实战经验…...
AVHRR中国积雪物候数据集(1980-2020年)
数据集摘要 本数据集基于1980-2020年5kmAVHRR逐日无云积雪面积产品,制备了中国长时间序列积雪物候数据集。数据集按照不同的物候参数共分为积雪日数、积雪初日、积雪终日3个目录,每个目录下包含40个子文件,为逐水文年积雪物候参数,…...
PCB设计中电感封装的选型
在PCB设计中,电感封装的选型直接影响电路性能、布局效率、热管理能力及系统可靠性。合理的封装选择不仅能优化空间利用率,还能提升电磁兼容性(EMC)和长期稳定性。以下从封装类型、尺寸参数、应用场景适配、布局协同设计、热管理策…...
LintCode第766题,LintCode第1141题,LintCode第478题
第766题描述 判断给出的年份 n 是否为闰年. 如果 n 为闰年则返回 true 闰年是包含额外一天的日历年. 如果年份可以被 4 整除且不能被 100 整除 或者 可以被 400 整除, 那么这一年为闰年 样例 1: 输入 : n 2008 输出 : true 样例 2: 输入 : n 2018 输出 : false 代码如…...
三十一、基于HMM的词性标注
基于HMM的中文词性标注 1 实验目标 理解HMM模型的原理和基本问题理解HMM的实现命名实体识别的具体步骤掌握HMM模型实现命名实体识别的方法 2 实验环境 HMM的中文词性标注的实验环境。 3 实验步骤 该项目主要由3个代码文件组成,分别为hmm.py、tagging.py和run.p…...
MCUboot 中的 BOOT_SWAP_TYPE_PERM 功能介绍
目录 概述 1 Image 数据结构 1.1 Image介绍 1.2 Swap info 2 BOOT_SWAP_TYPE_PERM 功能 2.1 功能定义 2.2 典型工作流程 3 BOOT_SWAP_TYPE_xx的其他功能 3.1 BOOT_SWAP_TYPE_REVERT 3.2 三中模式的比较 4 使用机制 4.1 实现细节 4.2 使用场景 4.3 开发者注意事…...
数学复习笔记 2
前言 朋友和我讨论了一个二重积分题,非常有意思。内容非常细致。整理如下: 二重积分 题目来源是 1000 上面的 16 题,积分区域是一个偏心圆,偏心圆的圆心在 y 轴上面,偏心圆是关于 y 轴对称的,可以看关于…...
从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化
Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化 在本章中,我们将在 ESP32-S3 这样的资源受限平台上,实现 地图匹配(Map Matching)和轻量级图优化(Lightweight SLAM)功能。通过 隐马尔可夫模型(HMM)+ Viterbi 算法,以及简化的图优化思路,校正定位轨迹,提升…...
Amazon Bedrock Converse API:开启对话式AI新体验
Amazon Bedrock Converse API:开启对话式AI新体验 前言 在当今人工智能飞速发展的时代,对话式AI已成为众多应用的核心组成部分。从智能客服到智能助手,对话式AI为用户带来了便捷且高效的交互体验。而Amazon Bedrock Converse API的出现&…...
软考 系统架构设计师系列知识点之杂项集萃(54)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(53) 第87题 某银行系统采用Factory Method方法描述其不同账户之间的关系,设计出的类图如下所示。其中与Factory Method的“Creator”角色对应的类是(ÿ…...
第三章 - 软件质量工程体系
1 概述 系统工程学的思想 系统工程学是为了研究多个子系统构成的整体系统所具有的多种不同目标的相互协调,以期系统功能的最优化、最大限度地发挥系统组成部分的能力而发展起来的一门科学。 软件质量工程体系的建立 建立和实施质量管理体系的方法 确定顾客和其…...
#基础Machine Learning 算法(上)
机器学习算法的分类 机器学习算法大致可以分为三类: 监督学习算法 (Supervised Algorithms):在监督学习训练过程中,可以由训练数据集学到或建立一个模式(函数 / learning model),并依此模式推测新的实例。…...
【YOLO11改进】改进Conv、颈部网络STFEN、以及引入PIOU用于小目标检测!
改进后的整体网络架构 改进一:RFD模块(Conv) YOLOv11模型的跨步卷积下采样虽然快速聚合了局部特征,并且实现了较高的计算效率,但其固有的信息压缩机制会导致细粒度特征的不可逆丢失。针对特征保留与计算效率的平衡问题,本文采用RFD模块替换跨步卷积下采样模块。RFD模块通…...
算法之上的权力——空域治理的政治哲学
当AI算法成为空域资源分配的核心机制,我们不得不直面一个核心问题:谁拥有算法,谁控制算法,谁审查算法?调度系统表面上是中立技术,实则承载了深刻的价值判断与权力结构。本章提出“算法即治理”命题…...
虚幻引擎作者采访
1万小时编程_哔哩哔哩_bilibili https://www.youtube.com/watch?v477qF6QNSvc 提姆斯温尼是一位传奇性的视频游戏程序员,Epic Games 的创始人兼首席执行官。 该公司开发了虚幻引擎、堡垒之夜、战争机器、虚幻竞技场等许多开创性和有影响力的视频游戏。 他哥哥…...
CodeBlocks25配置wxWidgets3.2
一、下载CodeBlocks 25.03版本 1.去Sourceforge.net Code::Blocks - Browse /Binaries/25.03/Windows at SourceForge.net 下载codeblocks-25.03mingw-nosetup.zip 2.解压到d盘,并把目录改为codeblocks 二、.下载wxWidgets 3.2.8 1. 去Sourceforge.net wxWidg…...
Python 整理3种查看神经网络结构的方法
1. 网络结构代码 import torch import torch.nn as nn# 定义Actor-Critic模型 class ActorCritic(nn.Module):def __init__(self, state_dim, action_dim):super(ActorCritic, self).__init__()self.actor nn.Sequential(# 全连接层,输入维度为 state_dim…...
【Bootstrap V4系列】学习入门教程之 组件-卡片(Card)
Bootstrap V4系列 学习入门教程之 组件-卡片(Card) 卡片(Card)一、Example二、Content types 内容类型2.1 Body 主体2.2 Titles, text, and links 标题、文本和链接2.3 Images 图片2.4 List groups 列表组2.5 Kitchen sink 洗涤槽…...
AI Agent开发第50课-机器学习的基础-线性回归如何应用在商业场景中
开篇 虽然我们这个系列主讲AI Agent,但是这个系列是一个喂饭式从0到深入的全AI类计算机教程系列,它主要面向的是培养出一个个AI时代的程序员,不是像外部那种很水的只是做做套壳、聊天、绘图小工具的急功近利式教学。而机器学习是现代AI的基础与基石,一些机器学习、深度学习…...
代码随想录第34天:动态规划7(打家劫舍问题:链式、环式、树式房屋)
一、背包问题小结 1.递推公式: 1.问能否能装满背包(或者最多装多少):dp[j] max(dp[j], dp[j - nums[i]] nums[i]) 2.问装满背包有几种方法:dp[j] dp[j - nums[i]] 3.问背包装满最大价值:dp[j] max…...
网络安全自动化:找准边界才能筑牢安全防线
数字时代,企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备,很多企业开始思考:哪些安全操作适合交给机器自动处理?哪些必须由人工把关?今天我们就用大白话聊聊这件事。 一、这些事…...
ctfshow——web入门361~368
最近练习ssti 当 Web 应用程序使用模板引擎动态生成 HTML 页面或其他类型的输出时,如果用户输入未经过充分验证或转义就被直接嵌入到模板中,就可能发生 SSTI 攻击。攻击者可以利用这个弱点注入恶意模板代码,该代码将在服务器端执行。 常见的…...
备忘录模式(Memento Pattern)
🧠 备忘录模式(Memento Pattern) 备忘录模式 是行为型设计模式之一。它通过将对象的状态存储在一个备忘录中,允许对象在不暴露其内部结构的情况下,保存和恢复自己的状态。该模式允许将对象的状态保存到备忘录中&#…...
五一假期作业
sub_process.c #include <stdio.h> // 标准输入输出库 #include <pthread.h> // POSIX线程库 #include <sys/ipc.h> // IPC基础定义(如消息队列/共享内存) #include <sys/msg.h> // 消息队列操作相关…...
Multi Agents Collaboration OS:专属多智能体构建—基于业务场景流程构建专属多智能体
背景 随着人工智能技术的飞速发展,大型语言模型(LLM)的能力不断突破,单一智能体的能力边界逐渐显现。为了应对日益复杂的现实世界任务,由多个具备不同能力、可以相互协作的智能体组成的多智能体系统 (Multi-Agent Sys…...
数据库的二级索引
二级索引 10.1 二级索引作为额外的键 表结构 正如第8章提到的,二级索引本质上是包含主键的额外键值对。每个索引通过B树中的键前缀来区分。 type TableDef struct {// 用户定义的部分Name stringTypes []uint32 // 列类型Cols []string // 列名Indexes …...
湖北理元理律师事务所:债务法律服务的民生价值重构
当前我国居民杠杆率达62.3%(央行2023年数据),债务问题已从经济议题演变为社会议题。湖北理元理律师事务所通过构建覆盖咨询、备案、规划的全链条服务,试图在法律框架内探索债务危机的社会化解决方案。 民生导向的服务设计 1.阶梯…...
DotNetBrowser 3.2.0 版本发布啦!
包含来自 Chromium 135 的安全修复支持自定义用户代理客户端提示(User Agent Client Hints)在 Avalonia 离屏渲染模式中支持拖放(Drag & Drop)功能 🔗 点击此处了解更多详情。 🆓 免费试用 30 天。...
PyTorch 张量与自动微分操作
笔记 1 张量索引操作 import torch # 下标从左到右从0开始(0->第一个值), 从右到左从-1开始 # data[行下标, 列下标] # data[0轴下标, 1轴下标, 2轴下标] def dm01():# 创建张量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…...
C语言数据在内存中的存储详解
在 C 语言的编程世界里,理解数据在内存中的存储方式是非常重要的,它能帮助我们更好地掌握数据类型、内存管理和程序性能优化等内容。今天,我就来给大家详细讲解数据在内存中的存储,包括整数、大小端字节序和浮点数的存储方式&…...
【AI大模型】SpringBoot整合Spring AI 核心组件使用详解
目录 一、前言 二、Spring AI介绍 2.1 Spring AI介绍 2.2 Spring AI主要特点 2.3 Spring AI核心组件 2.4 Spring AI应用场景 2.5 Spring AI优势 2.5.1 与 Spring 生态无缝集成 2.5.2 模块化设计 2.5.3 简化 AI 集成 2.5.4 支持云原生和分布式计算 2.5.5 安全性保障…...