stm32——AD采集以及DMA

        今天继续我们的STM32的内容学习,我使用的单片机是STM32F103VCT6,通过Keil Array Visualization软件来观测AD采样出来的波形。先来看看本次实验用到的硬件知识。

        首先是ADC(Analog-to-Digital Converter)是模拟信号转数字信号的关键组件,用于将来自外部传感器或模拟输入的模拟信号转换为数字形式,以便微处理器或控制器进行数字信号处理。如果大家看我其他文章的话,这个器件就是我们采样需要用到的一个器件。它的功能框图如下。

ADC功能框图

        首先,需要注意的是电压的范围,这也是ADC输入信号的幅值范围[V_{REF-},V_{REF+}],这里我用的电压范围是[0,3]。这样就够了。当然好像也有负的。这里就不做讨论了。其次,就是输入通道,也就是你的采样信号加在哪个地方。每个ADC最多有16个通道。ADC1和ADC2都有16个通道。接下来,这张图就是ADC对应通道的IO口。大家可以参考一下。这个只是STM32F103VET6的ADC的IO分配,具体到单片机大家可以去找参考手册。

         对应的GPIO口要配置成模拟输入模式,即GPIO_Mode_AIN。我使用的是ADC1的4通道,由上图可知,也就是PA4的端口。代码如下。

void GPIO_Configuration(void)
{/* 定义 GPIO 初始化结构体 GPIO_InitStructure */GPIO_InitTypeDef GPIO_InitStructure;/* 将 PA.4 设置为模拟输入脚 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);
}

      接下来就是配置ADC了。这里要根据下面的结构体,慢慢配置。包括工作模式,ADC扫描(单通道还是多通道),转换模式的选择,触发方式的选择,对齐格式的选择(左对齐,右对齐等)、ADC采集通道数。当然我建议大家复制粘贴,毕竟结构体打起来太麻烦了,咱们主要学的是原理。结构体如下。

typedef struct
{uint32_t ADC_Mode;                      /*!< Configures the ADC to operate in independent ordual mode. This parameter can be a value of @ref ADC_mode */FunctionalState ADC_ScanConvMode;       /*!< Specifies whether the conversion is performed inScan (multichannels) or Single (one channel) mode.This parameter can be set to ENABLE or DISABLE */FunctionalState ADC_ContinuousConvMode; /*!< Specifies whether the conversion is performed inContinuous or Single mode.This parameter can be set to ENABLE or DISABLE. */uint32_t ADC_ExternalTrigConv;          /*!< Defines the external trigger used to start the analogto digital conversion of regular channels. This parametercan be a value of @ref ADC_external_trigger_sources_for_regular_channels_conversion */uint32_t ADC_DataAlign;                 /*!< Specifies whether the ADC data alignment is left or right.This parameter can be a value of @ref ADC_data_align */uint8_t ADC_NbrOfChannel;               /*!< Specifies the number of ADC channels that will be convertedusing the sequencer for regular channel group.This parameter must range from 1 to 16. */
}ADC_InitTypeDef;
 /* 定义 ADC 初始化结构体 ADC_InitStructure */ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent·;ADC_InitStructure.ADC_ScanConvMode = DISABLE ;ADC_InitStructure.ADC_ContinuousConvMode =  DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2 ;  // 指定 TIM2 的触发输出作为 ADC 触发源ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);

       我配置的结构体如上,其他的都无所谓,重要的是这个ADC_ExternalTrigConv的选择。烦的嘞,我也是服了。为什么说它烦,咱们继续写。这里使用的是TIM2外部触发ADC1,捕获比较事件2会产生一个触发信号,使得ADC在上升沿或者是下降沿的触发。也就是TIM2每到捕获比较事件结束后,它就是采一次样。那什么是捕获比较事件?捕获事件:在定时器模块中捕获外部信号的状态变化或时间点。比如,可以捕获外部传感器产生的脉冲信号的上升沿或下降沿;比较事件:通过比较寄存器中的值和计数器的值,触发比较事件。比如,可以在比较寄存器值等于计数器值时触发一个事件。这就需要继续配置我们的TIM2定时器了。配置如下。

void TIM2_Configuration(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//定时器TIM2初始化TIM_TimeBaseStructure.TIM_Period = 3515-1; 		//设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler = 1-1; 			//设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 		//设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 		//TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);			//根据指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;		//选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;		//比较输出使能TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/2;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;		//输出极性:TIM输出比较极性低TIM_OC2Init(TIM2, & TIM_OCInitStructure);		//初始化外设TIM2_CH2TIM_Cmd(TIM2, ENABLE); 			//使能TIM2
}

        这里的OC呢,就是我所说的输出比较事件,竟然我们能用OC,那能不能用IC输入捕获呢?有没有大佬指导一下,孩子没搞出来。O_O

        接下来,就是配置DMA,与常用的USART串口通信一致。DMA(Direct Memory Access,直接内存访问)是一种无需MCU干预,在外设和存储器之间或者存储器和存储器之间直接进行数据传输的技术。在传统的数据传输方式中,MCU需要参与每个数据的读取和写入操作,这会消耗大量的MCU资源和时间。而 DMA 控制器可以接管数据传输的任务,直接控制数据在不同存储区域之间的移动,从而大大提高了数据传输的效率,减轻了MCU的负担,使MCU能够同时处理其他任务。换句话说,这个DMA传输数据的时候就是点对点的进行传输,不需要经过MCU,不占用内存。有两个DMA,分别为DMA1和DMA2。DMA1上含有7个通道,DMA2上含有5个通道。其功能框图以及通道的分配图如下。

DMA功能框图
DMA1各个通道的映射
DMA2各个通道的映射

        我用的是ADC1,由上图,所以为DMA1。接下来看看DMA配置,包括外设地址,存储地址,传输方向,传输的数据量,外设是否增量,地址是否增量,外设数据宽度,存储器数据宽度,模式选择,通道优先级,什么到什么的模式。结构体如下。

typedef struct
{uint32_t DMA_PeripheralBaseAddr; /*!< Specifies the peripheral base address for DMAy Channelx. */uint32_t DMA_MemoryBaseAddr;     /*!< Specifies the memory base address for DMAy Channelx. */uint32_t DMA_DIR;                /*!< Specifies if the peripheral is the source or destination.This parameter can be a value of @ref DMA_data_transfer_direction */uint32_t DMA_BufferSize;         /*!< Specifies the buffer size, in data unit, of the specified Channel. The data unit is equal to the configuration set in DMA_PeripheralDataSizeor DMA_MemoryDataSize members depending in the transfer direction. */uint32_t DMA_PeripheralInc;      /*!< Specifies whether the Peripheral address register is incremented or not.This parameter can be a value of @ref DMA_peripheral_incremented_mode */uint32_t DMA_MemoryInc;          /*!< Specifies whether the memory address register is incremented or not.This parameter can be a value of @ref DMA_memory_incremented_mode */uint32_t DMA_PeripheralDataSize; /*!< Specifies the Peripheral data width.This parameter can be a value of @ref DMA_peripheral_data_size */uint32_t DMA_MemoryDataSize;     /*!< Specifies the Memory data width.This parameter can be a value of @ref DMA_memory_data_size */uint32_t DMA_Mode;               /*!< Specifies the operation mode of the DMAy Channelx.This parameter can be a value of @ref DMA_circular_normal_mode.@note: The circular buffer mode cannot be used if the memory-to-memorydata transfer is configured on the selected Channel */uint32_t DMA_Priority;           /*!< Specifies the software priority for the DMAy Channelx.This parameter can be a value of @ref DMA_priority_level */uint32_t DMA_M2M;                /*!< Specifies if the DMAy Channelx will be used in memory-to-memory transfer.This parameter can be a value of @ref DMA_memory_to_memory */
}DMA_InitTypeDef;

        说到这里就差不多了。接下来,给大家看看一个完整的代码。本次实验整体的思路是通过TIM2外部触发ADC启动,经过DMA进行传输,通过仿真软件来看到我们所要的波形。这里以波形为主,至于采样率这些就不去深究了,大家可以自由发挥。我这里的输入信号为0~3V的正弦信号,采样率约为20.48KHz。至于为什么20.48KHz?大家结合FFT想想为什么?之后告诉大家。完整代码如下。

/*******************************************************************************
* 文件名          : main.c
* 作者            : Losingamong
* 时间			  : 08/08/2008
* 文件描述        : 主函数
********************************************************************************//* 头文件    ------------------------------------------------------------------*/#include "stm32f10x.h"
#include "stm32f10x_adc.h"
#include "stdio.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_tim.h"/* 自定义同义关键字    --------------------------------------------------------*//* 自定义参数宏        --------------------------------------------------------*//* 自定义函数宏        --------------------------------------------------------*//* 自定义变量          --------------------------------------------------------*/
#define ADC1_DR_Address    ((u32)0x40012400 + 0x4c) uint16_t AD_Value[512];
uint16_t temp[512];
uint8_t ADC_FLAG;/* 自定义函数声明      --------------------------------------------------------*/void RCC_Configuration(void);
void GPIO_Configuration(void);
void ADC_Configuration(void); 
void DMA_Configuration(void);
void TIM2_Configuration(void);/*******************************************************************************
* 函数名		 : main
* 函数描述       : Main 函数
* 输入参数       : 无
* 输出结果       : 无
* 返回值         : 无
*******************************************************************************/
int main (void)
{int i = 0;/* 设置系统时钟 */RCC_Configuration();/* 设置 GPIO 端口 */GPIO_Configuration();/* 设置 ADC */ADC_Configuration();/* DMA 初始化 */DMA_Configuration();/* 配置 TIM2 */TIM2_Configuration();while(1){if(ADC_FLAG == 1){for(i = 0; i < 512; i++){    temp[i] = AD_Value[i];      }ADC_FLAG = 0;                                DMA_Cmd(DMA1_Channel1, ENABLE);             }}
}/*******************************************************************************
* 函数名	: RCC_Configuration
* 函数描述  : 设置系统各部分时钟
* 输入参数  : 无
* 输出结果  : 无
* 返回值    : 无
*******************************************************************************/
void RCC_Configuration(void)
{/* 使能各个用到的外设时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}void TIM2_Configuration(void)
{ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//定时器TIM2初始化TIM_TimeBaseStructure.TIM_Period = 3515-1; 		//设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler = 1-1; 			//设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 		//设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 		//TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);			//根据指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;		//选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;		//比较输出使能TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period/2;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;		//输出极性:TIM输出比较极性低TIM_OC2Init(TIM2, & TIM_OCInitStructure);		//初始化外设TIM2_CH2TIM_Cmd(TIM2, ENABLE); 			//使能TIM2}/*******************************************************************************
* 函数名  		: GPIO_Configuration
* 函数描述    	: 设置各 GPIO 端口功能
* 输入参数      : 无
* 输出结果      : 无
* 返回值        : 无
*******************************************************************************/
void GPIO_Configuration(void)
{/* 定义 GPIO 初始化结构体 GPIO_InitStructure */GPIO_InitTypeDef GPIO_InitStructure;/* 将 PA.4 设置为模拟输入脚 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);
}/*******************************************************************************
* 函数名  		: ADC_Configuration
* 函数描述    	: 初始化并启动 ADC 转换,由 TIM2 外部触发
* 输入参数      : 无
* 输出结果      : 无
* 返回值        : 无
*******************************************************************************/void ADC_Configuration(void)
{/* 定义 ADC 初始化结构体 ADC_InitStructure */ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = DISABLE ;ADC_InitStructure.ADC_ContinuousConvMode =  DISABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2 ;  // 指定 TIM2 的触发输出作为 ADC 触发源ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);RCC_ADCCLKConfig(RCC_PCLK2_Div6);/* 设置 ADC1 使用 8 转换通道,转换顺序 1,采样时间为 55.5 周期 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);/* 使能 ADC1 */ADC_Cmd(ADC1, ENABLE);/* 复位 ADC1 的校准寄存器 */   ADC_ResetCalibration(ADC1);/* 等待 ADC1 校准寄存器复位完成 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始 ADC1 校准 */ADC_StartCalibration(ADC1);/* 等待 ADC1 校准完成 */while(ADC_GetCalibrationStatus(ADC1));/* 使能外部触发 启动 ADC1 转换 */ ADC_ExternalTrigConvCmd(ADC1, ENABLE);ADC_DMACmd(ADC1,ENABLE);
}void DMA_Configuration(void)
{DMA_InitTypeDef DMA_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//DMA1初始化DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;				//ADC1地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&AD_Value; 		//内存地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 				//方向(从外设到内存)DMA_InitStructure.DMA_BufferSize = 512; 						//传输内容的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 		//外设地址固定DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 			//内存地址固定DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; //外设数据单位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;    //内存数据单位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ; 		//DMA模式:循环传输DMA_InitStructure.DMA_Priority = DMA_Priority_High ; 		//优先级:高DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   		//禁止内存到内存的传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //配置DMA1DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);		//使能传输完成中断NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);DMA_Cmd(DMA1_Channel1,ENABLE);
}void DMA1_Channel1_IRQHandler(void)
{	if(DMA_GetITStatus(DMA1_IT_TC1)!= RESET){
//         DMA_Cmd(DMA1_Channel1, DISABLE); // 关闭 DMA1 通道 1 和 ADC1ADC_FLAG = 1; // ADC1 采集完成标志DMA_ClearITPendingBit(DMA1_IT_TC1); // 清除中断标志}
}

        结果如下,

        今天就说到这里,下次讲刺激的FFT。

        欲知后事如何,且听下回分解。OVO........

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/870369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x264 编码器 AArch64 汇编函数模块关系分析

x264 编码器 AArch64 汇编介绍 x264 是一个流行的开源视频编码器,它实现了 H.264/MPEG-4 AVC 标准。x264 项目致力于提供一个高性能、高质量的编码器,支持多种平台和架构。对于 AArch64(即 64 位 ARM 架构),x264 编码器利用该架构的特性来优化编码过程。在 x264 编码器中,…

纹波电流与ESR:解析电容器重要参数与应用挑战

电解电容纹波电流与ESR&#xff08;Equivalent Series Resistance&#xff09;是电容器的重要参数&#xff0c;用来描述电容器对交流信号的响应能力和能量损耗。电解电容纹波电流是指电容器在工作时承受的交流信号电流&#xff0c;而ESR则是电容器内部等效电阻&#xff0c;影响…

下载设计免抠元素,就上这6个网站,免费下载!

寻找免费PNG免抠素材网站是创意设计者们探索的重要一环。这些网站提供了丰富的PNG格式素材&#xff0c;去除了背景&#xff0c;方便在不同项目中使用。精心挑选了6个免费PNG免抠素材网站&#xff0c;它们提供了高品质的素材资源&#xff0c;无论是个人设计还是商业项目&#xf…

CVE-2024-23692: Rejetto HTTP File Server 2.3m Unauthenticated RCE漏洞复现

目录 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 漏洞简介 漏洞环境 漏洞复现 exp 复现 结果 如何修复 本文章仅供学习使用&#xff01;&#xff01;&#xff01; Rejetto HTTP介绍 Rejetto是一个流行的开源软件项目&#xff0c;主要…

python开发-创建项目

一、创建项目 1.1在终端 1. 进入某个目录&#xff08;项目放在哪&#xff09; 2. 执行命令创建项目 django-admin startproject 项目名称1.2 在pycharm中创建项目 二、创建app 创建app命令 django-admin startapp app01注册app 编写URL和视图函数对应关系 编写视图函数…

1950年-2021年中国历年民航航线里程统计报告

数据为1950年到2021年我国每年的民航航线总里程数据。 2021年&#xff0c;我国定期航班航线总里程为689.78万公里&#xff0c;相比2019年下降了258.44万公里。 数据统计单位为&#xff1a;公里. 数据说明&#xff1a; 2011年起民航航线里程改为定期航班航线里程 我国定期航班…

怎么将图片批量压缩处理?不牺牲图片清晰度的压缩秘诀

#北京city清凉walk指南# 夏日的北京&#xff0c;满目的绿色和清新空气让人沉醉。 然而&#xff0c;摄影爱好者们在记录这些美好瞬间的同时&#xff0c;也面临着大量图片的存储与管理难题。 随着手机和相机像素的提高&#xff0c;每张照片都可能成为存储空间的"大户&quo…

从0到1开发一个Vue3的新手引导组件(附带遇到的问题以及解决方式)

1. 前言: 新手引导组件,顾名思义,就是强制性的要求第一次使用的用户跟随引导使用应用,可以让一些第一次使用系统的新手快速上手,正好我最近也遇到了这个需求,于是就想着开发一个通用组件拿出来使用(写完之后才发现element就有,后悔了哈哈哈&#x1f62d;&#x1f62d;) 示例图…

【芯片方案】珠宝手机秤方案

珠宝手机秤作为一种便携式电子称重设备&#xff0c;因其小巧、便携、精度高等特点&#xff0c;广泛应用于各种需要精确称重的场景。可能这个目前在国内使用的人比较少&#xff0c;但在西方国家珠宝手机秤却是可以用来送礼的物品。因为珠宝手机秤的外观跟手机外观大多相似&#…

顶顶通呼叫中心中间件-打电话没声音检查步骤(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-电话没声音检查步骤(mod_cti基于FreeSWITH) 检查步骤 1、检查配置文件 检查配置文件&#xff1a;打开ccadmin -> 配置文件 -> vars -> external_ip$${local_ip_v4}看一下这个有没有配置正确的外网IP&#xff0c;如果没有配置正确就需要配置正…

PyCharm 2023.3.2 关闭时一直显示正在关闭项目

文章目录 一、问题描述二、问题原因三、解决方法 一、问题描述 PyCharm 2023.3.2 关闭时一直显示正在关闭项目 二、问题原因 因为PyCharm还没有加载完索引导致的 三、解决方法 方法一&#xff1a; 先使用任务管理器强制关闭&#xff0c;下次关闭时注意要等待PyCharm加载完索…

C语言-顺序表

&#x1f3af;引言 欢迎来到HanLop博客的C语言数据结构初阶系列。在这个系列中&#xff0c;我们将深入探讨各种基本的数据结构和算法&#xff0c;帮助您打下坚实的编程基础。本次我将为你讲解。顺序表&#xff08;也称为数组&#xff09;是一种线性表&#xff0c;因其简单易用…

ArcGIS Pro入门制图教程

地理信息系统 (GIS) 是一种使用地图显示和分析数据的方式。在本教程中&#xff0c;您将学习桌面 GIS 应用程序 ArcGIS Pro 的基础知识。 新加坡的一家旅行社希望制作一款宣传册&#xff0c;用于向游客介绍距离市中心热门目的地最近的火车站。该宣传册将与带有文本信息的地图相…

使用 `useAppConfig` :轻松管理应用配置

title: 使用 useAppConfig &#xff1a;轻松管理应用配置 date: 2024/7/11 updated: 2024/7/11 author: cmdragon excerpt: 摘要&#xff1a;本文介绍了Nuxt开发中useAppConfig的使用&#xff0c;它便于访问和管理应用配置&#xff0c;支持动态加载资源、环境配置切换、权限…

软考:软件设计师 — 2.操作系统

二. 操作系统 1. 操作系统概念 &#xff08;1&#xff09;操作系统的作用 操作系统是计算机硬件之上的第一层软件系统。 操作系统通常用来&#xff1a; 管理系统的硬件、软件、数据资源。控制程序运行。人机之间的接口。应用软件与硬件之间的接口。 可概括为&#xff1a; …

【Linux】内核文件系统系统调用流程摸索

内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的&#xff1a; 我们打印的pid,tgid就是从这里来的&#xff0c;然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息&#xff1a; 从上述日志&#xff0c;其实我也把write的系统调用加了入口的打印信…

CSS3实现彩色变形爱心动画【附源码】

随着前端技术的发展&#xff0c;CSS3 为我们提供了丰富的动画效果&#xff0c;使得网页设计更加生动和有趣。今天&#xff0c;我们将探讨如何使用 CSS3 实现一个彩色变形爱心加载动画特效。这种动画不仅美观&#xff0c;而且可以应用于各种网页元素&#xff0c;比如加载指示器或…

水库大坝安全监测险情主要内容

水库常见险情主要包括洪水漫顶、脱坡滑坡、坝体裂缝、 散浸、渗漏、漏洞、陷坑、管涌等&#xff0c;此外风浪冲击、水流冲刷等也会加剧险情的扩大。大坝险情万一抢护不及时&#xff0c;易导致发 生溃坝事故&#xff0c;造成极为严重的灾难性后果。要做到及时有效地 抢护大坝险情…

科技信息项目验收测试包括哪些内容?验收测试报告如何获取?

科技信息项目验收测试是指在科技信息项目完成后&#xff0c;组织专业测评团队对项目开发过程和成果进行全面、系统、客观的评测和鉴定的过程。通过验收测试&#xff0c;可以评估项目的质量、功能完整性以及满足业务需求的程度&#xff0c;并为项目的成功上线提供依据。 为了进…

uniapp实现table排序

根据后端接口传来的数字大小对列表进行升序/降序展示 效果图&#xff0c;价格由高到低降序 价格由低到高 升序 js 降序升序代码如下 export default {data() {return {MtList:[]}},onLoad() {this.MtypeName();//加载列表方法},methods: {MtypeName(){//列表方法this.$api.…