全局挂载的函数与注销——重复调用函数

本文探讨了在Vue组件中使用window.resize事件监听器时遇到的问题,即每次打开组件都会增加一个事件监听器。作者解释了原因,即组件mounted时添加的事件监听器不会自动移除,导致重复挂载。为了解决这个问题,提出了在beforeUnmount生命周期钩子中手动移除事件监听器的方法,确保资源的正确释放和避免内存泄漏。

场景:

window.resize( ) 了一个函数,然后第一次打开页面调用一次,第二次打开页面调用两次。。。。

原因:

1、window.addEventListener 全局挂载,只有当全局生命周期结束时候,函数会自动回收

2、这个组件mounted一次,就挂在一个 ‘resize’ 在 window.addEventListener 上

所以要手动注销

const instanceResize = ()=>{}
// 定义
onMounted(() => {
    nextTick(() => {
	window.addEventListener('resize', instanceResize);
	});
});


// 注销
onBeforeUnmount(() => {
	window.removeEventListener('resize', instanceResize);
});


		// window(全局)挂载了一个 resize 函数,该函数在 window 生命周期是结束后会消失
		// 但是我们每打开这个组件一次,就会多挂一个 resize 函数,这样我们多次打开该组件后会有 n个 resize 函数
		// 所以需要手动*提前*的结束 resize 函数

<think>嗯,用户想了解FATFS中的f_mount()函数的功能、作用和使用说明。首先,我需要回忆一下FATFS这个库的基本知识。FATFS是一个用于嵌入式系统的文件系统模块,支持FAT12、FAT16、FAT32等格式。f_mount()函数在这个库中应该是用来挂载和卸载磁盘卷的。 首先,我得确认f_mount()的具体功能。根据之前的引用资料,用户提到f_mount(&fs, "1:", 1)这样的代码,挂载失败的情况。这说明f_mount()的第一个参数是文件系统对象指针,第二个是逻辑驱动器号,第三个是是否立即挂载。可能的功能是将一个物理存储设备(如SD卡)文件系统对象关联,这样后续的文件操作才能进行。 然后,用户的问题中还提到了挂载失败的可能原因,比如逻辑驱动器号配置错误或者硬件初始化问题。需要详细说明函数的作用,包括注册/注销卷、初始化文件系统对象、逻辑驱动器物理设备的绑定等。可能还要区分同步和异步挂载的情况,比如第三个参数为1时立即挂载,而0时延迟挂载。 接下来,用户可能需要知道如何正确使用这个函数,包括参数的含义、使用示例以及常见问题。比如逻辑驱动器号的格式应该是"0:","1:"这样的字符串,需要和配置中的FF_VOLUMES数量匹配。还要注意挂载前必须初始化底层磁盘IO,否则会失败。 另外,引用中提到的挂载成功但f_open失败的情况,可能涉及到硬件问题,比如SD卡的初始化不完全或者SPI配置错误。这时候可能需要检查底层驱动,比如SD卡的初始化函数是否正确,或者是否存在DMA配置冲突。例如,引用2中提到代码卡死在HAL库的某个函数里,这可能是因为SD卡初始化未正确完成,或者时钟配置有问题。 需要提醒用户注意,挂载成功并不代表后续文件操作一定没问题,可能还需要检查文件路径是否正确,文件是否存在等。此外,配置FF_FS_READONLY等选项也可能影响f_open的行为。 最后,应该总结f_mount()的主要功能,使用步骤,注意事项,并生成相关问题帮助用户深入理解可能遇到的问题,比如挂载失败的原因,如何调试,参数配置的影响等。</think>### FATFS中f_mount()函数的功能说明 #### 一、核心功能 $f_mount()$是FATFS文件系统库中用于**注册/注销逻辑驱动器**的关键函数,主要实现以下功能: 1. **卷挂载**:将物理存储设备(如SD卡、Flash)逻辑驱动器号(如"0:"、"1:")绑定 2. **文件系统对象初始化**:初始化`FATFS`结构体,包含文件系统属性、状态等关键信息 3. **缓存管理**:建立文件系统磁盘I/O层的数据缓冲区[^1] #### 二、函数原型 ```c FRESULT f_mount ( FATFS* fs, /* 文件系统对象指针 */ const TCHAR* path, /* 逻辑驱动器号(如"0:"、"1:") */ BYTE opt /* 挂载选项 */ ); ``` #### 三、参数详解 | 参数 | 类型 | 说明 | |------|------|------| | fs | FATFS* | 文件系统对象指针,需定义为全局变量 | | path | const TCHAR* | 逻辑驱动器号,格式必须为`"X:"`(X=0-9) | | opt | BYTE | 0: 卸载卷,1: 立即挂载,其他值保留 | #### 四、典型应用场景 ```c FATFS fs; // 文件系统对象 // 挂载SD卡到"0:"驱动器 f_mount(&fs, "0:", 1); // 文件操作... f_open(&file, "0:/data.txt", FA_READ); // 卸载卷 f_mount(0, "0:", 0); ``` #### 五、关键注意事项 1. **逻辑驱动器号必须`FF_VOLUMES`配置匹配**,若定义`FF_VOLUMES=2`则最大支持到"1:" 2. **挂载前必须完成底层磁盘初始化**,包括: - 实现`disk_initialize()`函数 - 配置正确的SPI/SDMMC时钟 - 确保物理介质已就绪[^2] 3. **异步挂载问题**:当opt=0时需手动调用`f_mountfs()`初始化文件系统 #### 六、故障排查指南 若出现挂载失败(返回FR_NOT_READY): 1. 检查逻辑驱动器号格式是否符合要求 2. 验证底层`disk_initialize()`返回值 3. 确认`FF_FS_READONLY`配置实际存储介质状态一致 4. 使用逻辑分析仪监测SD卡CMD0复位响应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值