【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA
本篇,将使用CubeMX+Keil,创建一个SD卡的 FatFS+SDIO+DMA 文件系统读写工程。
目录
一、简述
二、CubeMX 配置 FatFS+SDIO + DMA
三、Keil 编辑代码
四、实验效果
实现效果,如下图:
一、简述
上两篇,已循序渐进讲解了SD、SDIO、基础读写、DMA读写。
这里不再啰嗦,有兴趣的可翻看之前的篇章:
1、CubeMX_STM32_SD卡_基础读写
2、CubeMX_STM32_SD卡_DMA读写
本篇,再向前一步,展示CubeMX添加 FatFs 文件系统,对SD卡进行文件方式的读写。
对于FatFs,这里只示范操作、使用,不详述背后细节原理。
SD卡的接线原画图,使用通用的接线:
二、CubeMX 配置 SDIO + DMA + FatFS
新建工程部分,略过。
- 参考1:【STM32+CubeMX】 新建一个工程(STM32F407)_stm32f407 cubemx-CSDN博客
- 参考2:【STM32+CubeMX】USART1 DMA收发、printf
- 参考3: STM32串口通信 -- bsp_UART.c 文件的移植和函数使用-CSDN博客
1、使能SDIO、DMA
- Mode : 选择 SD 4 bits Wide bus ;
- 其它参数 :F4系列不用修改配置,默认即可。F103系列,需把时钟分频系数修改为 6,即SDIOCLK Clock divide factor这一项,默认0,修改为6, 不然会通信失败。
- DMA Settings : 添加SDIO_RX、SDIO_TX这两项; 本页其它参数默认;
2、开启SDIO全局中断,修改中断优先级
3、FatFs 使能、参数配置
- Mode: 打勾 SD Card
- 参数 CODE_PAGE:简体中文
- 参数 USE_LFN:长文件名称(缓存放在STACK,因此STACK得设置大一些,如>0x1000)
- 参数 FS_EXFAT:ENABLE (挂载、格式化时,会自动选择合适的FAT16、FAT32、exFAT)
4、FatFS 使用DMA
5、FatFS 是否使用检测引脚
让我们先回看一下原理图:
SD卡座的第9脚,用于检测是否已插入SD卡,如果已插入SD卡,CD脚会输出低电平。
不建议使用这个功能!因为:SD卡与U盘不同,没有完善的保护电路,不应该进行热插拔!而且,做SD卡项目调试时,默认状态应该是一直插着SD卡的。如果项目有需要,也可以自己写几行引脚电平检测,当引脚电平为低时,再对SD卡进行操作,这样更灵活。
回到FatFs配置界面 ,下方配置里,可以设置是否使用检测引脚:
- 如果你的SD卡已连接检测引脚,想使用CubeMX生成管理,可以在这里指定引脚。
- 如果不需要这个检测功能,就让它默认空着即可。不管是否已连接此引脚,都可空着。
CubeMX生成时注意:
当不指定检测引脚,在最后生成工程时,会有弹窗警告,不用管它,到时点击Yes即可,将会正常生成工程,代码上不会有任何影响。
如果不想有弹窗,可以随便指定一个空闲的引脚,这样在生成时就不会弹警告了,但是需要在生成的工程代码里,注释掉引脚检测功能,这里不详述,可自行搜索方法。操作有点烦人,不建议此方法。
6、时钟设置
进入时钟树配置页面。
如果之前没配置过SDIO、USB,这时就会弹窗:是否自动配置所需时钟?
选择:NO ,手动修改即可。
不推荐 Yes,因为它将针对已使能的SDIO、USB进行必须值的配置,而已设置好的系统时钟,将会被修改成其它值。
F4系列,如果板子用25M晶振,使用下图配置即可;如果是8M晶振,修改晶振、分频两处为8即可。
重点:箭头所指的Q值,它用于控制USB 、SDIO和随机数生成器的时钟,这个时钟配置成 48M ! 因此,箭头的Q值设置为 7;
好了,SD卡文件系统通信所需的 SDIO + FatFS + DMA 已完成配置。
重新生成工程,这时,会有弹窗提示,因为我们没有指定SD卡的检测引脚。
点击 Yes 确认,继续生成即可!
三、Keil 编辑代码
1、打开keil 工程,先重新编译一次。
- 正常情况,编译是0 Error的。
- 如果有Error, 应该是新建工程时,路径、名称有中文了,重新开建工程,改为英文即可。
2、重要修改:SD卡的初始化,使用 1-bit 模式
CubeMX生成的SDIO初始化代码,有一个bug,需要手动修改,操作如下:
- 右击 main.c 文件中函数 MX_SDIO_SD_Init(),
- 在弹出菜单中:Go To Ddfinition Of ...; 将跳转到SD卡初始化函数内部;
跳转到 sdio.c文件的 MX_SDIO_SD_Init() 初始化函数内部后,
把下图位置中的 4B,改为 1B ;
因为初始化时,需要低速率,1线通信即可。如果不修改,初始化过程会导致程序卡死。
重要!CubeMX每次重新生成后,都要手动修改一次。
3、常用函数
我们上两篇介绍SD卡的读写时,共用过6个函数,如下表。
这6个函数,在本工程中,还是可用的。但本篇暂时用不上,这里就进行不示范了。
1、获取SD卡信息
HAL_SD_CardInfoTypeDef pCardInfo = {0}; // SD卡信息结构体
HAL_SD_GetCardInfo(&hsd, &pCardInfo); // 获取 SD 卡的信息2、读数据
HAL_SD_ReadBlocks(&hsd, aOldData, 7, 2, 3000); // SD卡的句柄、数据、块地址、块数量、超时ms3、写数据
HAL_SD_WriteBlocks(&hsd, aTestData, 7, 2, 3000) // SD卡的句柄、数据、块地址、块数量、超时ms4、读数据_DMA
HAL_SD_ReadBlocks_DMA(&hsd, aOldData, 7, 2); // 读取SD卡指定块的数据; 参数:SD句柄、数据地址、块起始地址、需要读取的块数量;5、写数据_DMA
HAL_SD_WriteBlocks_DMA(&hsd, aTestData, 7, 2); // 向指定块写入数据; 参数:SD句柄、数据地址、块起始地址、需要写入的块数量;6、擦除数据
HAL_SD_Erase(&hsd, 7, 8) // SD卡的句柄、块起始地址、块结束地址
而FatFS常用的几个操作函数,如下表:
函数参数的具体作用,可以通过 Kimi 进行查询。
FRESULT f_res;1、挂载文件系统
f_res = f_mount(&myFatFs, "0:", 1); // 在SD卡上挂载文件系统; 参数:文件系统对象、驱动器路径、读写模式(0只读、1读写)2、格式化
static uint8_t aMountBuffer[4096]; // 格式化时所需的临时缓存; 块大小512的倍数; 值越大格式化越快, 如果内存不够,可改为512或者1024; 当需要在函数内定义这种大缓存时,要用static修饰,令缓存存放在全局数据区内,不然,可能会导致stack溢出。
f_res = f_mkfs("0:", 0, 0, aMountBuffer, sizeof(aMountBuffer)); // 格式化SD卡; 参数:驱动器路径、文件系统(0自动\1FAT12\2FAT16\)、簇大小(0为自动选择)、格式化临时缓冲区、缓冲区大小3、打开文件
f_res = f_open(&myFile, "0:Test.txt", FA_CREATE_ALWAYS | FA_WRITE); // 打开文件; 参数:要操作的文件对象、路径和文件名称、打开模式;4、关闭文件
f_close(&myFile); // 不再读写,关闭文件5、文件写入数据
f_res = f_write(&myFile, aWriteBuf, sizeof(aWriteBuf), &num); // 向文件内写入数据; 参数:文件对象、数据缓存、申请写入的字节数、实际写入的字节数6、文件读取数据
f_res = f_read(&myFile, aReadData, sizeof(aReadData), &num); // 从文件中读取数据; 参数:文件对象、数据缓冲区、请求读取的最大字节数、实际读取的字节数
4、具体操作示例代码
第一步:编写FatFs的示范函数
在main()的上方,/* USER CODE BEGIN 0 */ 下面,编写以下代码(建议直接复制):
这个函数的作用是:判断是否需要格式化、挂载文件系统、创建文件、写入数据、读出数据。
// SD卡的FatFS文件系统挂载、格式化、读写测试
void FatFsTest(void)
{static FATFS myFatFs; // FatFs 文件系统对象; 这个结构体占用598字节,有点大,需用static修饰(存放在全局数据区), 避免stack溢出static FIL myFile; // 文件对象; 这个结构体占用570字节,有点大,需用static修饰(存放在全局数据区), 避免stack溢出static FRESULT f_res; // 文件操作结果static uint32_t num; // 文件实际成功读写的字节数static uint8_t aReadData[1024] = {0}; // 读取缓冲区; 这个数组占用1024字节,需用static修饰(存放在全局数据区), 避免stack溢出static uint8_t aWriteBuf[] = "测试; This is FatFs Test ! \r\n"; // 要写入的数据// 重要的延时:避免烧录期间的复位导致文件读写、格式化等错误HAL_Delay(1000); // 重要:稍作延时再开始读写测试; 避免有些仿真器烧录期间的多次复位,短暂运行了程序,导致下列读写数据不完整。// 1、挂载测试:在SD卡挂载文件系统printf("\r\n\r\n");printf("1、挂载 FatFs 测试 ****** \r\n");f_res = f_mount(&myFatFs, "0:", 1); // 在SD卡上挂载文件系统; 参数:文件系统对象、驱动器路径、读写模式(0只读、1读写)if (f_res == FR_NO_FILESYSTEM) // 检查是否已有文件系统,如果没有,就格式化创建创建文件系统{printf("SD卡没有文件系统,开始格式化…...\r\n");static uint8_t aMountBuffer[4096]; // 格式化时所需的临时缓存; 块大小512的倍数; 值越大格式化越快, 如果内存不够,可改为512或者1024; 当需要在函数内定义这种大缓存时,要用static修饰,令缓存存放在全局数据区内,不然,可能会导致stack溢出。f_res = f_mkfs("0:", 0, 0, aMountBuffer, sizeof(aMountBuffer)); // 格式化SD卡; 参数:驱动器、文件系统(0-自动\1-FAT12\2-FAT16\3-FAT32\4-exFat)、簇大小(0为自动选择)、格式化临时缓冲区、缓冲区大小; 格式化前必须先f_mount(x,x,1)挂载,即必须用读写方式挂载; 如果SD卡已格式化,f_mkfs()的第2个参数,不能用0自动,必须指定某个文件系统。if (f_res == FR_OK) // 格式化 成功{printf("SD卡格式化:成功 \r\n");f_res = f_mount(NULL, "0:", 1); // 格式化后,先取消挂载f_res = f_mount(&myFatFs, "0:", 1); // 重新挂载if (f_res == FR_OK)printf("FatFs 挂载成功 \r\n"); // 挂载成功elsereturn; // 挂载失败,退出函数}else{printf("SD卡格式化:失败 \r\n"); // 格式化 失败return;}}else if (f_res != FR_OK) // 挂载异常{printf("FatFs 挂载异常: %d; 检查MX_SDIO_SD_Init()是否已修改1B\r", f_res);return;}else // 挂载成功{if (myFatFs.fs_type == 0x03) // FAT32; 1-FAT12、2-FAT16、3-FAT32、4-exFatprintf("SD卡已有文件系统:FAT32\n");if (myFatFs.fs_type == 0x04) // exFAT; 1-FAT12、2-FAT16、3-FAT32、4-exFatprintf("SD卡已有文件系统:exFAT\n"); printf("FatFs 挂载成功 \r\n"); // 挂载成功}// 2、写入测试:打开或创建文件,并写入数据printf("\r\n");printf("2、写入测试:打开或创建文件,并写入数据 ****** \r\n");f_res = f_open(&myFile, "0:text.txt", FA_CREATE_ALWAYS | FA_WRITE); // 打开文件; 参数:要操作的文件对象、路径和文件名称、打开模式;if (f_res == FR_OK){printf("打开文件 成功 \r\n");printf("写入测试:");f_res = f_write(&myFile, aWriteBuf, sizeof(aWriteBuf), &num); // 向文件内写入数据; 参数:文件对象、数据缓存、申请写入的字节数、实际写入的字节数if (f_res == FR_OK){printf("写入成功 \r\n");printf("已写入字节数:%d \r\n", num); // printf 写入的字节数printf("已写入的数据:%s \r\n", aWriteBuf); // printf 写入的数据; 注意,这里以字符串方式显示,如果数据是非ASCII可显示范围,则无法显示}else{printf("写入失败 \r\n"); // 写入失败printf("错误编号: %d\r\n", f_res); // printf 错误编号}f_close(&myFile); // 不再读写,关闭文件}else{printf("打开文件 失败: %d\r\n", f_res);}// 3、读取测试:打开已有文件,读取其数据printf("3、读取测试:打开刚才的文件,读取其数据 ****** \r\n");f_res = f_open(&myFile, "0:text.txt", FA_OPEN_EXISTING | FA_READ); // 打开文件; 参数:文件对象、路径和名称、操作模式; FA_OPEN_EXISTING:只打开已存在的文件; FA_READ: 以只读的方式打开文件if (f_res == FR_OK){printf("打开文件 成功 \r\n");f_res = f_read(&myFile, aReadData, sizeof(aReadData), &num); // 从文件中读取数据; 参数:文件对象、数据缓冲区、请求读取的最大字节数、实际读取的字节数if (f_res == FR_OK){printf("读取数据 成功 \r\n");printf("已读取字节数:%d \r\n", num); // printf 实际读取的字节数printf("读取到的数据:%s\r\n", aReadData); // printf 实际数据; 注意,这里以字符串方式显示,如果数据是非ASCII可显示范围,则无法显示}else{printf("读取 失败 \r\n"); // printf 读取失败printf("错误编号:%d \r\n", f_res); // printf 错误编号}}else{printf("打开文件 失败 \r\n"); // printf 打开文件 失败printf("错误编号:%d\r\n", f_res); // printf 错误编号}f_close(&myFile); // 不再读写,关闭文件f_mount(NULL, "0:", 1); // 不再使用文件系统,取消挂载文件系统
}
编写完成后,位置如下图:
第二步:编写SD卡信息获取函数
在刚才函数的下方,再编写一个SD卡信息获取函数(建议直接复制)。
这个函数的作用是:获取SD卡的基础信息、块数量 、块大小、卡容量。
// 获取SD卡信息
// 注意: 本函数需要在f_mount()执行后再调用,因为CubeMX生成的FatFs代码, 会在f_mount()函数内对SD卡进行初始化
void SDCardInfo(void)
{HAL_SD_CardInfoTypeDef pCardInfo = {0}; // SD卡信息结构体uint8_t status = HAL_SD_GetCardState(&hsd); // SD卡状态标志值if (status == HAL_SD_CARD_TRANSFER){HAL_SD_GetCardInfo(&hsd, &pCardInfo); // 获取 SD 卡的信息printf("\r\n");printf("*** 获取SD卡信息 *** \r\n");printf("卡类型:%d \r\n", pCardInfo.CardType); // 类型返回:0-SDSC、1-SDHC/SDXC、3-SECUREDprintf("卡版本:%d \r\n", pCardInfo.CardVersion); // 版本返回:0-CARD_V1、1-CARD_V2printf("块数量:%d \r\n", pCardInfo.BlockNbr); // 可用的块数量printf("块大小:%d \r\n", pCardInfo.BlockSize); // 每个块的大小; 单位:字节printf("卡容量:%lluG \r\n", ((uint64_t)pCardInfo.BlockSize * pCardInfo.BlockNbr) / 1024 / 1024 / 1024); // 计算卡的容量; 单位:GB}
}
第三步:在 main()函数内,调用刚才那两个函数
调用位置,如下图:
至此,代码编写完成,可以编译、烧录了。
四、实验效果
程序运行后,串口助手输出如下:
如有错漏 ,望指正~~~!
相关文章:
【CubeMX+STM32】SD卡 文件系统读写 FatFs+SDIO+DMA
本篇,将使用CubeMXKeil,创建一个SD卡的 FatFSSDIODMA 文件系统读写工程。 目录 一、简述 二、CubeMX 配置 FatFSSDIO DMA 三、Keil 编辑代码 四、实验效果 实现效果,如下图: 一、简述 上两篇,已循序渐进讲解了SD、…...
GenAI + 电商:从单张图片生成可动态模拟的3D服装
在当今数字化时代,电子商务和虚拟现实技术的结合正在改变人们的购物体验。特别是在服装行业,消费者越来越期待能够通过虚拟试衣来预览衣服的效果,而无需实际穿戴。Dress-1-to-3 技术框架正是为此而生,它利用生成式AI模型(GenAI)和物理模拟技术,将一张普通的穿衣照片转化…...
1.1 Spring Security 概述
Spring Security 概述 1. 什么是 Spring Security? Spring Security 是 Spring 生态中专注于应用安全的核心框架,为 Java 企业应用提供认证(Authentication)、授权(Authorization)以及安全攻击防护&#x…...
新站如何快速被搜索引擎收录?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/106.html 新站快速被搜索引擎收录是一个综合性的任务,涉及多个方面的优化工作。以下是一些关键步骤和策略,有助于新站快速被搜索引擎收录: 一、提交网站…...
<论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)
一、摘要 本文跟大家来一起阅读DeepSeek团队发表于2025年1月的一篇论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning | Papers With Code》,新鲜的DeepSeek-R1推理模型,作者规模属实庞大。如果你正在使用Deep…...
DatePicker 实现:日期范围截止时间为23:59:59
文章目录 需求描述实现逻辑 需求描述 在使用 Element Plus 的 el-date-picker 组件进行日期范围选择时,如果你希望选择的日期范围截止时间为所选时间的23:59:59,你可以通过设置 type 属性为 daterange,并结合使用 value-format 属性来控制时间…...
登录功能login.html
文章目录 前言一、login.html二、getVerify()controllerlogin() 登录功能encodePwd(pwd,key)login.do验证是否异地登录找回账号verifySubmit() 前言 登录login.html,验证码获取verifycode,登陆函数login() 一、login.html <!DOCTYPE html> <h…...
将 AMD Zynq™ RFSoC 扩展到毫米波领域
目录 将 AMD Zynq™ RFSoC 扩展到毫米波领域Avnet XRF RFSoC 系统级模块适用于 MATLAB 的 Avnet RFSoC Explorer 工具箱5G mmWave PAAM 开发平台突破性的宽带毫米波波束成形特征:OTBF103 Mathworks Simulink 模型优化毫米波应用中的射频信号路径 用于宽带毫米波上/下…...
2.10..
#include "widget.h" #include "ui_widget.h" #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QColorDialog> #include <QColor> // #include <QFileDialog> //文件对话框…...
Struts2 命令执行漏洞 S2-045 复现:深入剖析与实战演练
前言 在当今网络安全形势日益严峻的大环境下,Web 应用框架的安全问题始终是信息安全领域关注的焦点。Struts2 作为一款广泛应用于 Java Web 开发的开源框架,其安全性直接关系到众多 Web 应用的稳定运行。今天,我们将深入探讨并实战复现 Stru…...
Spark 源码 | 脚本分析总结
前言 最初是想学习一下Spark提交流程的源码,比如 Spark On Yarn 、Standalone。之前只是通过网上总结的文章大概了解整体的提交流程,但是每个文章描述的又不太一样,弄不清楚到底哪个说的准确,比如Client 和 CLuster 模式的区别&a…...
2025.2.9 每日学习记录2:技术报告写了一半+一点点读后感
0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右,一次性备考笔试的三个科目 1.实习申请技术准备:微调、Agent、RAG 1.今日完成任务 1.电子斗蛐蛐(文本书写领域&am…...
6、使用one-api管理统一管理大模型,并开始使用本地大模型
文章目录 本节内容介绍集中接入:将大模型统一管理起来当使用了大模型代理大模型代理示例 开源模型:如何使用Hugging Face上的模型modelscope使用 pipeline 调用模型用底层实现调用模型流式输出 如何在项目中使用开源模型使用 LangChain使用集中接入开始使…...
DFS+回溯+剪枝(深度优先搜索)——搜索算法
DFS也就是深度优先搜索,比如二叉树的前,中,后序遍历都属于DFS。其本质是递归,要学好DFS首先需要掌握递归。接下来咱们就一起来学习DFS涉及的算法。 一、递归 1.什么是递归? 递归可以这样理解把它拆分出来࿰…...
【数据结构】_堆的实现
目录 1. 堆的实现 1.1 Heap.h 1.2 Heap.c 1.3 Test_Heap.c 专栏前文中,已经介绍了入堆及向上调整算法,出堆及向下调整算法,详情见下文: 【数据结构】_堆的结构及向上、向下调整算法-CSDN博客文章浏览阅读352次,点…...
读书笔记《左耳听风》
读书笔记《左耳听风》 从今年开始,打算给自己定一下在看完书后整理成博客的计划。以往很多看完的书仅仅停留在看完,再回顾的时候总感觉已经不甚清晰了,希望能坚持下去。 《左耳听风》是今年我看完的第一本书,内容针对的是程序员…...
Axure原型图怎么通过链接共享
一、进入Axure 二、点击共享 三、弹出下面弹框,点击发布就可以了 发布成功后,会展示链接,复制即可共享给他人 四、发布失败可能的原因 Axure未更新,首页菜单栏点击帮助选择Axure更新,完成更新重复以上步骤即可...
本地部署DeepSeek,并使用UI界面进行快速交互
一.需要本地部署的原因 1.我们在deepseek的官网界面进行交互时,经常会出现如下问题,不能正常交互,很是困扰: 2.本地部署的好处 就是能够很流畅的与deepseek进行交互;也有缺点,现在官网交互的版本更高一点…...
ESP32S3读取数字麦克风INMP441的音频数据
ESP32S3 与 INMP441 麦克风模块的集成通常涉及使用 I2S 接口进行数字音频数据的传输。INMP441 是一款高性能的数字麦克风,它通过 I2S 接口输出音频数据。在 Arduino 环境中,ESP32S3 的开发通常使用 ESP-IDF(Espressif IoT Development Framew…...
移动(新)魔百盒刷机教程[M301A_YS]
刚刚成功刷了一个坏的魔百盒,简单记录一下。 刷电视盒子有两种:卡刷和线刷。 线刷 一、线刷准备 1.刷机工具 Amlogic USB Burning Tool 晶晨线刷烧录工具 2.固件 根据盒子的型号、代工等找到对应的固件 二、线刷步骤 电脑打开下好的 Amlogic US…...
15 大 AWS 服务
在不断发展的云计算世界中,Amazon Web Services (AWS) 已成为一股主导力量,提供许多服务以满足各种应用程序开发、部署和管理方面的需求。本文将探讨 15 项 AWS 服务。这些服务对于构建可扩展、可靠且高效的系统至关重要。 1.Amazon EC2(弹性…...
【C++】命名空间
🌟 Hello,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 目录 背景知识 命名空间(namespace) 为何引入namespace namespace的定义 namespace的使用 背景知识 C的起源要追溯到1979年࿰…...
项目实战(11)-双通道气体压力计V1.0
一. 产品简介: 1、项目背景是在实际应用中需要监控通道内气体的压力,压力计分为两个通道;通道一时实时监控;通道二是保压,设定保压值得上下限后通道内得气体压力值会一直保持在这个范围内。 二. 应用场景:…...
python+unity落地方案实现AI 换脸融合
先上效果再说技术结论,使用的是自行搭建的AI人脸融合库,可以离线不受限制无限次生成,有需要的可以后台私信python ai换脸融合。 TODO 未来的方向:3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface,openvc…...
开启对话式智能分析新纪元——Wyn商业智能 BI 携手Deepseek 驱动数据分析变革
2月18号,Wyn 商业智能 V8.0Update1 版本将重磅推出对话式智能分析,集成Deepseek R1大模型,通过AI技术的深度融合,致力于打造"会思考的BI系统",让数据价值触手可及,助力企业实现从数据洞察到决策执…...
数据结构——【二叉树模版】
#思路 1、二叉树不同于数的构建,在树节点类中,有数据,左子结点,右子节点三个属性,在树类的构造函数中,添加了变量maxNodes,用于后续列表索引的判断 2.GetTreeNode()函数是常用方法,…...
DeepSeek之于心理学的一点思考
模型和硬件参数对应关系参考 模型参数规模 典型用途 CPU建议 GPU建议 最小内存建议 磁盘空间建议 适用场景 1.5b(15亿) 小型推理、轻量级任务 4核以上(Intel i5/AMD Ryzen5) 可选,入门级GPU(如NVIDIA GTX1650 4GB显存) 8GB 10GB以上SSD 小型NLP任务、文…...
mysql 存储过程和自定义函数 详解
首先创建存储过程或者自定义函数时,都要使用use database 切换到目标数据库,因为存储过程和自定义函数都是属于某个数据库的。 存储过程是一种预编译的 SQL 代码集合,封装在数据库对象中。以下是一些常见的存储过程的关键字: 存…...
数据结构:单链表
1.概念: 单链表(Singly Linked List)是一种常见的数据结构,它由一系列节点(Node)组成,每个节点包含两个部分: 数据域(Data):存储节点的值或数据。…...
部署项目(ubantu服务器,配置jdk,启动项目,及测试)
目录 1、ubantu安装jdk 2、部署项目 解决 java -jar 报错:xxx.jar 中没有主清单属性 3、测试 4、查看系统部署的应用 1、ubantu安装jdk #压缩文件jdk文件:tar -czvf jdk17.tar.gz jdk17 #解压jdk文件:tar -xzvf jdk17.tar.gz 参…...
deepseek本地部署教程
第一步:进入Ollama官网 (Download Ollama on macOS),下载ollama(注意需要Window10或更高的版本),安装(OllamaSetup.exe),默认在c盘 第二步:点击Models,再点击…...
MySQL主从同步+binlog
一、简介 MySQL内建的复制功能是构建大型,高性能应用程序的基础 通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而…...
防火墙术语大全( Firewalld Glossary of Terms)
防火墙术语大全 防火墙作为网络安全中不可或缺的设备,在各种网络架构中扮演着至关重要的角色。无论是企业级防火墙、云防火墙还是家用路由器内置的防火墙,它们的工作原理和配置策略都离不开一系列专业术语的支撑。对于网络工程师来说,掌握这…...
LeetCode刷题---数组---697
数组的度 697. 数组的度 - 力扣(LeetCode) 题目: 给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&am…...
C语言基础08:运算符+流程控制总结
运算符 算术运算符 结果:数值 、-、*、\、%、(正)、-(负)、、-- i和i 相同点:i自身都会增1 不同点:它们运算的最终结果是不同的。i:先使用,后计算;i&am…...
[安装FlashAttention] CUDA版本 和 Nvidia驱动版本
nvidia-smi 查看driver api 的CUDA版本 听说这个是本机能装到的最高版本 那这样看来我最高能装到12.4。 nvcc -V 查看当前runtime api的CUDA版本 还是古老的11.5版本,没办法啊,FlashAttention老是说不支持? 安装Torch时选择的CUDA版本 p…...
Android图片加载框架Coil,Kotlin
Android图片加载框架Coil,Kotlin implementation("io.coil-kt:coil:1.4.0") import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import coil.Coil i…...
Win11下搭建Kafka环境
目录 一、环境准备 二、安装JDK 1、下载JDK 2、配置环境变量 3、验证 三、安装zookeeper 1、下载Zookeeper安装包 2、配置环境变量 3、修改配置文件zoo.cfg 4、启动Zookeeper服务 4.1 启动Zookeeper客户端验证 4.2 启动客户端 四、安装Kafka 1、下载Kafka安装包…...
从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓
作者:羿莉(萧羿) 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型,以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1,而且在推理模型的成本优化上实现了突破…...
模拟(典型算法思想)—— OJ例题算法解析思路
目录 一、1576. 替换所有的问号 - 力扣(LeetCode) 运行代码: 1. 输入和输出 2. 变量初始化 3. 遍历字符串 4. 替换逻辑 5. 返回结果 整体分析 1. 思路总结 2. 为什么要这样设计 3. 时间复杂度与空间复杂度 4. 边界情况 二、495. 提莫攻击 - 力扣(LeetCode) …...
pgsql最快的数据导入BeginBinaryImport
PostgreSQL 的 BeginBinaryImport 是 libpq(PostgreSQL 的 C 语言客户端库) 中的一个函数,用于高效实现二进制数据的大批量导入。以下是详细介绍及适用语言说明: BeginBinaryImport 的作用 功能 它是 PostgreSQL C 接口库…...
【进程与线程】如何编写一个守护进程
如何编写一个守护进程。我们首先需要理解守护进程是什么。守护进程是在后台运行的进程,通常没有控制终端,用于执行系统任务,比如服务器或者定时任务。 用户可能想创建一个长期运行的服务,比如Web服务器或者日志监控程序。 首先&a…...
Docker容器访问外网:启动时的网络参数配置指南
在启动Docker镜像时,可以通过设置网络参数来确保容器能够访问外网。以下是几种常见的方法: 1. 使用默认的bridge网络 Docker的默认网络模式是bridge,它会创建一个虚拟网桥,将容器连接到宿主机的网络上。在大多数情况下,使用默认的bridge网络配置即可使容器访问外网。 启动…...
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop࿰…...
DeepSeek神经网络:技术架构与实现原理探析
以下是一篇关于DeepSeek神经网络的研究及实现原理的综述性文章,结合其技术架构、训练范式及创新点展开分析: 1. 核心架构设计 DeepSeek的神经网络架构以**混合专家模型(Mixture of Experts, MOE)**为基础,结合轻量化…...
KTOR:高效的Linux横向移动与无文件落地HTTP服务扫描工具
地址:https://github.com/MartinxMax/KTOR 简介 KTOR 是一款专为 Linux 横向渗透设计的工具。通过该工具,您可以快速扫描内部 HTTP 服务,以便进一步进行网络渗透,且实现无文件落地扫描。 在CTF中通常需要利用本地其他端口HTTP服务或其他主…...
C++ Primer 类型转换
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
2025新的一年网络营销推广该怎么干?
2025年,全球网民数量预计突破60亿,但流量红利消退、用户注意力稀缺、技术迭代加速……企业网络营销正面临前所未有的“生存战”。如何在竞争中突围?小马识途营销机构基于十五年实战经验,总结出2025年企业必须抢占的五大核心战场&a…...
java实现Http请求方式的几种常见方式
背景 在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。若是普通java工程推荐使用OkHt…...
安卓开发,底部导航栏
1、创建导航栏图标 使用系统自带的矢量图库文件,鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖,并点击Sync Now …...