#stm32整理(一)flash读写
以这篇未开始我将进行stm32学习整理为期一个月左右完成stm32知识学习整理内容顺序没有一定之规写到哪想到哪想到哪写到哪,主要是扫除自己知识上的盲区完成一些基本外设操作。
以stm32f07为例子进行flash读写操作
stm32flash简介
参考资料正点原子和野火开发手册 stm32f4中文参考手册和datasheet
Flash 接口可管理 CPU 通过 **AHB I-Code(指令指令总线) 和 D-Code (数据总线)**对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编程操作,并实施读写保护机制。Flash 接口通过指令预取和缓存机制加速
代码执行。
关于这两条总线先不细说参考链接 AHB I-Code(指令指令总线) 和 D-Code (数据总线)请参考 Cortex-M3 I-Code,D-Code,系统总线及其他总线接口
主要特性
● Flash 读操作
● Flash 编程/擦除操作
● 读/写保护
● I-Code 上的预取操作
● I-Code 上的 64 个缓存(128 位宽)
● D-Code 上的 8 个缓存(128 位宽)
结构框图
Flash 具有以下主要特性:
● 对于 STM32F40x 和 STM32F41x,容量高达 1 MB;对于 STM32F42x 和 STM32F43x,
容量高达 2 MB
● 128 位宽数据读取
● 字节、半字、字和双字数据写入
● 扇区擦除与全部擦除
● 存储器组织结构
Flash 结构如下:
— 主存储器块,分为 4 个 16 KB 扇区、1 个 64 KB 扇区和 7 个 128 KB 扇区
— 系统存储器,器件在系统存储器自举模式下从该存储器启动
— 512 字节 OTP(一次性可编程),用于存储用户数据
OTP 区域还有 16 个额外字节,用于锁定对应的 OTP 数据块。
— 选项字节,用于配置读写保护、BOR 级别、软件/硬件看门狗以及器件处于待机或
停止模式下的复位。
● 低功耗模式(有关详细信息,请参见参考手册的“电源控制 (PWR)”部分)
主存储器
一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应
用程序的空间,芯片型号说明中的 256K FLASH、512K FLASH 都是指这个区域的大
小。
系统存储区
系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB 以及 CAN 等 ISP 烧录功能 ISP烧录就是,芯片通过某些方式进入芯片内部预置的ISP升级程序,开启升级功能,然后与外部通信,然后通过相关的协议,完成程序区的擦除,写入,校验和相关的配置等一些列操作的过程.。
选项字节
选项字节用于配置 FLASH 的读写保护、待机/停机复位、软件/硬件看门狗等功能,这
部分共 16 字节。可以通过修改 FLASH 的选项控制寄存器修改。
OTP介绍
OTP:one-time programmable,只允许一次编程,也就是只能从1写0,不能从0写1。这里可能有人要问,这不是flash的特性么?需要注意的是,flash是允许擦除的,是允许从0写1的。而OTP不允许擦除,就算在ICP烧录代码时,也不会丢。
3接口
4读写操作
执行任何 Flash 编程操作(擦除或编程)时,CPU 时钟频率 (HCLK) 不能低于 1 MHz。如果
在 Flash 操作期间发生器件复位,无法保证 Flash 中的内容。
在对 STM32F4xx 的 Flash 执行写入或擦除操作期间,任何读取 Flash 的尝试都会导致总线
阻塞。只有在完成编程操作后,才能正确处理读操作。这意味着,写/擦除操作进行期间不能
从 Flash 中执行代码或数据获取操作。也就是说读写之间不能操作
4.1解锁
复位后你先解锁才能操作
复位后,Flash 控制寄存器 (FLASH_CR) 不允许执行写操作,以防因电气干扰等原因出现对
Flash 的意外操作。此寄存器的解锁顺序如下:
- 在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY1 = 0x45670123
- 在 Flash 密钥寄存器 (FLASH_KEYR) 中写入 KEY2 = 0xCDEF89AB
- 如果顺序出现错误,将返回总线错误并锁定 FLASH_CR 寄存器,直到下一次复位。
也可通过软件将 FLASH_CR 寄存器中的 LOCK 位置为 1 来锁定 FLASH_CR 寄存器。
当 FLASH_SR 寄存器中的 BSY 位为 1 时,将不能在写模式下访问 FLASH_CR 寄存器。
BSY 位为 1 时,对该寄存器的任何写操作尝试都会导致 AHB 总线阻塞,直到 BSY 位清零。
4.2擦除/编程位数
通过 FLASH_CR 寄存器中的 PSIZE 字段配置并行位数。并行位数表示每次对 Flash 进行写
操作时将编程的字节数。PSIZE 受限于电源电压以及是否使用外部 VPP 电源。因此,在进行
任何编程/擦除操作前,必须在 FLASH_CR 寄存器中对其进行正确配置。
编程就是读写 擦除受外部电压影响
Flash 擦除操作只能针对扇区或整个 Flash(批量擦除)执行。擦除时间取决于 PSIZE 编程
值。有关擦除时间的详细信息,请参见器件数据手册的电气特性部分。
DW:64 W:32 HW:16 Byte:8位
写到这我想先写一个关于stm32程序存在了哪这涉及到了程序编译过程我先写这个但是排在第二篇吧!
#stm32整理(二)关于MDK的编译过程及文件类型全解
4.3擦除
Flash 擦除操作可针对扇区或整个 Flash(批量擦除)执行。执行批量擦除时,不会影响 OTP 扇区或配置扇区。
扇区擦除
扇区擦除的具体步骤如下:
- 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作
- 在 FLASH_CR 寄存器中,将 SER 位置 1,并从主存储块的 12 个 (STM32F405xx/07xx
和 STM32F415xx/17xx) 或 24 个 (STM32F42xxx 和 STM32F43xxx) 扇区中选择要擦除
的扇区 (SNB) - 将 FLASH_CR 寄存器中的 STRT 位置 1
- 等待 BSY 位清零
批量擦除
要执行批量擦除,建议采用以下步骤: - 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作
- 将 FLASH_CR 寄存器中的 MER 位置 1(STM32F405xx/07xx 和 STM32F415xx/17xx
器件) - 将 FLASH_CR 寄存器中的 MER 和 MER1 位置 1(STM32F42xxx 和 STM32F43xxx
器件)
. 将 FLASH_CR 寄存器中的 STRT 位置 1 - 等待 BSY 位清零
注意: 如果 FLASH_CR 寄存器中的 MERx 位和 SER 位均置为 1,则无法执行扇区擦除和批量擦除。
这里写一段flash 扇区删除的代码
Flash 状态寄存器 (FLASH_SR)
Flash status register
Flash 状态寄存器提供正在执行的编程和擦除操作的相关信息。
偏移地址:0x0C
复位值:0x0000 0000
访问:无等待周期,按字、半字和字节访问
用于 STM32F405xx/07xx 和 STM32F415xx/17xx 的 Flash 控制寄存器
(FLASH_CR)
Flash control register
Flash 控制寄存器用于配置和启动 Flash 操作。
偏移地址:0x10
复位值:0x8000 0000
访问:当前未执行任何 Flash 操作时无等待周期,按字、半字和字节访问。
注意FLASH的值擦完是FF写的时候是把1变0
//1. 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作 这相当于第一步
/*** @brief 得到FLASH的错误状态* @param 无* @retval 执行结果* @arg 0 : 已完成* @arg 其他 : 错误编号*/
static uint8_t stmflash_get_error_status(void)
{uint32_t res = 0;res = FLASH->SR;if (res & (1 << 16)) return 1; /* BSY=1, 繁忙 */if (res & (1 << 7)) return 2; /* PGSERR=1,编程序列错误 */if (res & (1 << 6)) return 3; /* PGPERR=1,编程并行位数错误 */if (res & (1 << 5)) return 4; /* PGAERR=1,编程对齐错误 */if (res & (1 << 4)) return 5; /* WRPERR=1,写保护错误 */return 0; /* 没有任何状态/操作完成. */
}
/*** @brief 等待操作完成* @param time : 要延时的长短* @retval 执行结果* @arg 0 : 已完成* @arg 0XFF: 超时* @arg 其他 : 错误编号*/
static uint8_t stmflash_wait_done(uint32_t time)
{uint8_t res;do{res = stmflash_get_error_status(); if (res != 1){break; /* 非忙, 无需等待了, 直接退出 */}time--;} while (time);if (time == 0)res = 0XFF; /* 超时 */return res;
}/*** @brief 获取某个地址所在的flash扇区* @param faddr : flash地址* @retval 0~11, 即addr所在的扇区*/
static uint8_t stmflash_get_flash_sector(uint32_t addr)
{if (addr < ADDR_FLASH_SECTOR_1)return 0;else if (addr < ADDR_FLASH_SECTOR_2)return 1;else if (addr < ADDR_FLASH_SECTOR_3)return 2;else if (addr < ADDR_FLASH_SECTOR_4)return 3;else if (addr < ADDR_FLASH_SECTOR_5)return 4;else if (addr < ADDR_FLASH_SECTOR_6)return 5;else if (addr < ADDR_FLASH_SECTOR_7)return 6;else if (addr < ADDR_FLASH_SECTOR_8)return 7;else if (addr < ADDR_FLASH_SECTOR_9)return 8;else if (addr < ADDR_FLASH_SECTOR_10)return 9;else if (addr < ADDR_FLASH_SECTOR_11)return 10;return 11;
}static uint8_t stmflash_erase_sector(uint32_t saddr)
{uint8_t res = 0;res = stmflash_wait_done(0XFFFFFFFF); /* 等待上次操作结束 */ //1. 检查 FLASH_SR 寄存器中的 BSY 位,以确认当前未执行任何 Flash 操作if (res == 0){FLASH->CR &= ~(3 << 8); /* 清除PSIZE原来的设置 */ //默认8位编程FLASH->CR |= 2 << 8; /* 设置为32bit宽,确保VCC=2.7~3.6V之间!! */FLASH->CR &= ~(0X1F << 3); /* 清除原来的设置 */FLASH->CR |= saddr << 3; /* 设置要擦除的扇区 */FLASH->CR |= 1 << 1; /* 扇区擦除 */ // SER置1 激活扇区擦除FLASH->CR |= 1 << 16; /* 开始擦除 */res = stmflash_wait_done(0XFFFFFFFF); /* 等待操作结束 */ //位 16 STRT:启动 (Start) 该位置 1 后可触发擦除操作。// **注意这里没有设置MER,MER是按块擦除这里是按扇区擦除**if (res != 1) /* 非忙 */{FLASH->CR &= ~(1 << 1); /* 清除扇区擦除标志 */// SER:扇区擦除 (Sector Erase)}}return res;
}
4.4编程(写)
Flash 编程顺序如下:
- 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何主要 Flash 操作。
- 将 FLASH_CR 寄存器中的 PG 位置 1。
- 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作:
— 并行位数为 x8 时按字节写入
— 并行位数为 x16 时按半字写入
— 并行位数为 x32 时按字写入
— 并行位数为 x64 时按双字写入 - 等待 BSY 位清零
注意: 把 Flash 的单元从“1”写为“0”时,无需执行擦除操作即可进行连续写操作。把 Flash 的
单元从“0”写为“1”时,则需要执行 Flash 擦除操作。
如果同时发出擦除和编程操作请求,首先执行擦除操作。
这里放一段写代码
//从指定地址开始写入指定长度的数据
//WriteAddr:起始地址(此地址必须为2的倍数!!)
//pBuffer:数据指针
//NumToWrite:半字(16位)数(就是要写入的16位数据的个数.)
void Flash_Write(uint32_t WriteAddr, uint16_t *pBuffer, uint16_t NumToWrite)
{uint8_t status = 0;uint32_t addrx =0;uint32_t endaddr=0;uint8_t sector;if(WriteAddr<STM32_FLASH_BASE||WriteAddr%2||WriteAddr>(STM32_FLASH_BASE+STM32_FLASH_SIZE))//判断地址是否符合这里我们需注意基地址和flash大小可以根据手册查{return;//return 语句是提前结束函数的唯一办法。return 后面可以跟一份数据,表示将这份数据返回到函数外面;return 后面也可以不跟任何数据,表示什么也不返回,仅仅用来结束函数。}FLASH_Unlock();//解锁之前介绍过 直接用库函数中的函数FLASH_DataCacheCmd(DISABLE);//关闭数据缓存,这里不关闭数据缓存擦除时可能会发生缓存不一致现象 这里我没验证相关可以参考 https://shequ.stmicroelectronics.cn/thread-621109-1-1.htmladdrx=WriteAddr;//开始地址endaddr=WriteAddr+NumToWrite*2;//结束地址sector=stmflash_get_flash_sector(addrx);//获取扇区if(addrx<0X1FFF0000)//地址0x1FFF 0000是系统存储器的地址{while(addrx<endaddr){if(Flash_ReadHalfWord(addrx)!=0XFFFF)//读到非零擦除{status = stmflash_erase_sector(sector);if(status)break;}else{addrx+=2;}}}if(status==0){status = stmflash_wait_done(0XFFFFF);//这一句其实没用while(WriteAddr<endaddr){if(stmflash_wait_done(0XFFFFF)==0)status=FLASH_ProgramHalfWord(WriteAddr,*pBuffer);//半字写入elsebreak;WriteAddr+=2;pBuffer++;}} //这里缺一点如果写入错误应该如何判断写入问题FLASH_DataCacheCmd(ENABLE);//使能数据缓冲FLASH_Lock();//上锁}
读函数
//读取指定地址的半字(16位数据)
//faddr:读地址
//返回值:对应数据.
static uint16_t Flash_ReadHalfWord(uint32_t faddr)
{return *(vu16 *)faddr;//(vu16 *)将32位地址强制转换为16为__IO uint16_t 16位地址 第二个*才是返回该地址所存储的值。
}
关于f1的和这个不一样先不写了先写到这里但是流程是差不多的。
1、这里注意我们在进行擦除和写入时操作的基本单元是sector 所以在进行操作时哪怕对某一个地址中的值进行修改需要先将扇区中的值读出来然后更改这个值再写进去,所以当数据量特别大的时候我们也需要一个特别大的全局buffer现将值读出来有点不实用,这里我想了一个思路还是要计算当前要写的字节在sector的大小然后把他给到一个临时buffer中然后修改临时buffer的值将buffer再写回sector中,但是同样存在临时buffer太大栈溢出导致硬件中断错误
2、注意这里我们写的数据没有超过该secotr的大小如果超过了那么就坏了,还要根据扇区大小不同判断剩余字节数
先写到这吧
相关文章:

#stm32整理(一)flash读写
以这篇未开始我将进行stm32学习整理为期一个月左右完成stm32知识学习整理内容顺序没有一定之规写到哪想到哪想到哪写到哪,主要是扫除自己知识上的盲区完成一些基本外设操作。 以stm32f07为例子进行flash读写操作 stm32flash简介 参考资料正点原子和野火开发手册 …...

windows10编译高版本openssl
参考文章 参考文章中的windows编译为低版本,在高版本的openssl编译中已经没有:“ms\do_ms.bat”这个脚本了,现记录下编译过程 1、准备工作 安装ActivePerl,安装后会自动写入环境变量,参照参考文章测试安装成功与否&a…...

Mac之NVM|通过brew安装、更新、卸载、重新安装nvm
文章目录 导文通过brew安装NVM通过brew更新NVM通过brew卸载NVM通过brew重新安装NVM 导文 Mac之NVM 通过brew安装、更新、卸载、重新安装 通过brew安装NVM brew install nvm通过brew更新NVM brew upgrade nvm通过brew卸载NVM brew uninstall nvm通过brew重新安装NVM brew re…...

react的状态管理有哪些方法?
在React中,有多种方法可以进行状态管理,以下是其中一些常见的方法: 1:使用React的内置状态(State): React组件可以通过使用 useState 钩子来管理内部的状态。它允许你在函数组件中定义和更新状态。例如: import React, { useState } from react;function MyComponent…...

AST注入-从原型链污染到RCE
文章目录 概念漏洞Handlebarspug 例题 [湖湘杯 2021 final]vote 概念 什么是AST注入 在NodeJS中,AST经常被在JS中使用,作为template engines(引擎模版)和typescript等。对于引擎模版,结构如下图所示。 如果在JS应用中存在原型污染漏洞&…...

【开题报告】基于uniapp的在线考试小程序的设计与实现
1.研究背景 随着社会的发展和科技的进步,网络技术被广泛应用于教育领域。在线教育已成为当今发展趋势之一,其中在线考试更是具有重要的意义。传统的考试方式不仅耗费大量人力物力,而且存在考试成果的保密问题。而在线考试可以使考试过程更加…...

使用pdf2image pdf转图片
安装poppler https://wenku.csdn.net/answer/1zxh8ckp6i from pdf2image import convert_from_path, convert_from_bytes import os# https://github.com/Belval/pdf2imageoutput_folder ./ dpi_value 600 pdf_start_page 1 # pdf显示的第一页 start_page 237 # 真实页码 p…...

非关系型数据库Redis的安装【Linux】及常用命令
前言 Redis(Remote Dictionary Server)是一种开源的内存数据库管理系统,它以键值存储方式来存储数据,并且支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。Redis最初由Salvatore Sanfilippo开发,…...

【React】02.create-react-app基础操作
文章目录 当前以及未来的开发,一定是:组件化开发如何划分组件React的工程化/组件化开发create-react-app基础运用运用react常用版本一个React项目中,默认会安装 2023年最新珠峰React全家桶【react基础-进阶-项目-源码-淘系-面试题】 当前以及…...

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法
gcc -static 在centos stream8 和centos stream9中运行报错的解决办法: 报/usr/bin/ld: cannot find -lc 我们下载glibc-static: 选择x86_64的。 还有一个是libxcrypt-static,依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…...

【UE5 Cesium】actor随着视角远近来变化其本身大小
效果 步骤 1. 首先我将“DynamicPawn”设置为默认的pawn类 2. 新建一个父类为actor的蓝图,添加一个静态网格体组件 当事件开始运行后添加一个定时器,委托给一个自定义事件,每2s执行一次,该事件每2s获取一下“DynamicPawn”和acto…...

vue-render函数的三个参数
第一个参数(必须) - {String | Object | Function} Vue.component(elem, {render: function(createElement) {return createElement(div);//一个HTML标签字符/*return createElement({template: <div></div>//组件选项对象});*//*var func function() {return {t…...

数据结构与算法(Java版) | 排序算法的介绍与分类
各位朋友,现在我们即将要进入数据结构与算法(Java版)这一系列教程中的排序算法这一章节内容的学习中了,所以还请大家系好安全带,跟随我准备出发吧! 相信诸位应该都知道排序算法有很多种吧!就算没…...

Java 实现uniapp本机手机号一键登录
这里简单的贴一下后端的解析代码 其他配置项参照uniapp的官方文档配置就好了 这里的accessToken和openid是前端请求uCloud获取的 Data public class UniAppLoginVO {private Integer code;private String message;private ResultDataVO data;private Boolean success;private R…...

树莓派使用Nginx搭建web网站内存利用太低了?高效远程访问试试结合内网穿透进行
🎬 鸽芷咕:个人主页 🔥 个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一. Nginx安装步骤1.安装更新2.更新完成后安装Nginx 包3. 启动Nginx 二. 安装cpolar内网穿透工具1. 使用cpolar一…...

基于SSM的搬家预约系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

(论文阅读13/100)R-CNN minus R
文献阅读笔记 简介 题目 R-CNN minus R 作者 Karel Lenc Andrea Vedaldi 原文链接 https://arxiv.org/pdf/1506.06981.pdf 关键词 Null 研究问题 proposal generation在基于CNN的探测器中的作用,以确定它是否是一个必要的建模组件。 R-CNN留下的几个有趣…...

Jmeter和Postman哪个做接口测试会更好
软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中,有高手,自然也会有小白,但有一点我们无法否认,就是每一个高手都是从小白开始的,所以今天我们就来谈谈一大部分人在做的接口测试,小白变高手…...

【算法|二分查找No.2】leetcode 69. x 的平方根
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...

AI:56-基于深度学习的微表情识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

Jetpack Compose 中下拉框实现
下拉菜单主要 以下三种实现: ExperimentalMaterialApi Composable fun ExposedDropdownMenuBox(expanded: Boolean,onExpandedChange: (Boolean) -> Unit,modifier: Modifier Modifier,content: Composable ExposedDropdownMenuBoxScope.() -> Unit )实现代…...

输出最长公共字串
题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列 示例 示例 1: 输入:text1 "abcde", text2 "ace" 输出:"ace" 示例 2: 输入:text1 &quo…...

学习经验分享【NO.19】YOLOv5可视化训练过程
将train.py中project的参数设置为如下: 点击AutoPanel即可: 得到如下的训练过程,可以观察所进行提升效果是否有用以及可以作为论文中的图,提高论文的档次。...

低代码可视化逻辑编排工具:JNPF
目录 Intro 一、是什么? 提供自动化的解决方案 二、为什么受欢迎? JNPF自身特点——安全、方便、高效、低耗 对于企业,更“安全” 成本“最低”,效率“最高” 三、JNPF开发平台功能展示 技术介绍 参考地址 近几年,随着…...

Redis创始人开源最小聊天服务器,仅200行代码,几天功夫已获2.8K Star!
中午时候,在技术交流群里聊起关于Redis创始人的一些趣事,比如离开Redis之后,去写科幻小说之类的。 因为好奇科幻小说,TJ君就去搜索了一下。结果一搜,发现Redis作者最近居然又搞了个新活儿! 世界上最小的聊…...

RK-3399pro 萤火虫firefly 官方unbuntu 固件系统安装搜狗中文输入法
RK-3399pro 萤火虫firefly 官方unbuntu 固件系统安装搜狗输入法(适用于所有基于Ubuntu的UI桌面系统) 一、添加中文语言支持输入法平台fcitx 1.安装fcitx sudo apt-get install fcitx 2.然后设置fcitx为开机自启动 sudo cp /usr/share/applications/fc…...

2014年亚太杯APMCM数学建模大赛A题无人机创造安全环境求解全过程文档及程序
2014年亚太杯APMCM数学建模大赛 A题 无人机创造安全环境 原题再现 20 国集团,又称 G20,是一个国际经济合作论坛。2016 年第 11 届 20 国集团峰会将在中国召开,这是继 APEC 后中国将举办的另一个大型峰会。此类大型峰会,举办城市…...

Java字符串常用函数 详解5000字 (刷题向 / 应用向)
1.直接定义字符串 直接定义字符串是指使用双引号表示字符串中的内容,例如"Hello Java"、"Java 编程"等。具体方法是用字符串常量直接初始化一个 String 对象,示例如下: 1. String str"Hello Java"; 或者 …...

在RabbitMQ中 WorkQueue 工作队列 和发布(publish)/订阅(Subscribe) 有什么区别?
在RabbitMQ中,"Work Queue"(工作队列)和"Publish/Subscribe"(发布/订阅)是两种不同的消息传递模型,它们有不同的用途和工作方式。 Work Queue (工作队列): 用途:…...

关闭Dell xps 系列笔记本触控屏
【电脑】->【管理】->【设备管理器】 右键 禁用选择即可...