stm32-定时器输入捕获

目录

一、输入捕获简介

二、输入捕获框图

1.定时器总框图

2.输入捕获框图 

3.主从触发模式

三、固件库实现 

1.定时器测量PWM频率

2.PWMI模式 


一、输入捕获简介

二、输入捕获框图

1.定时器总框图

 上图可知,四个输入捕获和输出比较共用4CCR寄存器,且输入捕获和输出比较的CH口是同一个,所以同一个通道同一时间只能使用一种功能

  • 输入滤波器和边沿检测器一旦检测到电平跳变,就会将CNT的值写入CCR中,类似于中断的作用

2.输入捕获框图 

分频器:

滤波器:

3.主从触发模式

主模式: 这个主模式的输出可以是PWM,即我的看法是主模式是用来作为其他定时器的输入的,比如我们用定时器1的PWMOC输出作为TIM2的输入捕获波型

触发源选择和从模式:即触发从模式的方式,比如我们可以用通道1的滤波后的定时器输入作为触发器,来触发从模式的复位,即通道一每接收到一次边沿跳变(具体的高低是我们自己设置的),就会触发从模式CNT清零

三、固件库实现 

1.定时器测量PWM频率

  • TIM3用于输出比较产生PWM,TIM4用于输入捕获,只有CH1和CH2有从模式
  • TIM4的配置同TIM3的前面一致,不过TIM4的ARR给到了65536-1 防止溢出时还未检测完频率
  • 初始化输入捕获单元,选上升沿---TIM_ICInit
  • 配置触发源--TIM_SelectInputTrigger
  • 配置从模式为RESET--TIM_SelectSlaveMode
  • 启动定时器,TIM_Cmd(TIM4,ENABLE);//CNT开始自增
  • 在主函数里用库函数设置TIM3的PSC和CRR,初始化的时候TIM3的ARR设置为100-1,这个数字好计算,用库函数读取N(CNT)

#include "bsp_tim.h"//TIM3--CH1--PA6
void TIM3_OC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PWM引脚//重定义GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM3);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 100-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化OC-输出比较结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//因为结构体里面的成员有些是高级定时器采用得到,所以这里就先全部初始化一遍,然后再配置具体的值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStruct.TIM_Pulse = 50;//CRR   --设置频率1KHZ,占空比50%,分辨率1%的PWM波型TIM_OCInitStruct.TIM_Pulse = 0;//用固件库的一个函数 TIM_SetCompare2 直接配置CRRTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OC1Init(TIM3,&TIM_OCInitStruct);//CH1通道//启动定时器TIM_Cmd(TIM3,ENABLE);}
void PWM_SetCompare1(uint16_t Compare)//设置CRR,即比较值
{TIM_SetCompare1(TIM3,Compare);
}
void PWM_SetPrescaler(uint16_t Prescaler)//设置PSC
{TIM_PrescalerConfig(TIM3,Prescaler,TIM_PSCReloadMode_Immediate);//不使用影子寄存器
}
//TIM4--CH1--PB6
void TIM4_IC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启PWM引脚//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOB,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM4);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//PSC-预分频器-->fc = 72M/PSC = 1MTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 65536-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//初始化输入捕获单元TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//输入通道TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//直连通道 ,不交叉TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频--每次触发都有效TIM_ICInitStruct.TIM_ICFilter = 0xF;//滤波器参数TIM_ICInit(TIM4,&TIM_ICInitStruct);//配置触发源TIM_SelectInputTrigger(TIM4,TIM_TS_TI1FP1);//配置从模式为RESETTIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);//启动定时器TIM_Cmd(TIM4,ENABLE);//CNT开始自增}uint32_t IC_Get_Freq(void)
{return 1000000 / (TIM_GetCapture1(TIM4)+1);//fc/N   fc = 1M-->我们在上方配置的PSC为72-1//这里加1是为了凑整,--->不然测出来是1001//未连接PB6和PA6的时候是1000000是因为CRR1寄存器复位值为0,0+1=1 所以1M/1=1M
}
int main()
{OLED_Init();USART_Config();TIM3_OC_Config();TIM4_IC_Config();//配置TIM3的输出PWM频率和占空比				//CK_PSC = 72M   ARR+1 已经配置好了是100PWM_SetPrescaler(720-1);		//Freq = CK_PSC / (PSC+1)/(ARR+1)PWM_SetCompare1(50); 				//占空比 Duty = CCR /(ARR+1)//此时Freq = 72000000/720/100 = 1000while(1){i = IC_Get_Freq();OLED_ShowNum(1,1,i,7);}
}

2.PWMI模式 

PA6提供PWM
PB6接收PWM
接收的时候分两个通道接收,通道一接收频率,通道二接收占空比
--因为一个CCR寄存器只能接收一种数据
占空比 = 高电平时间/总时间,只用一个CCR无法测量
所以把CCR2当做测量高电平时间的工具
相当于把PWM信号通过CH1的通道输入到两个CCR中,所以最后只用测CH1的PWM就行
通道一上升沿
通道二下降沿
选CH1的RESET,->选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。
所以CCR1是上升沿->上升沿,即整个PWM
CCR2是从下降沿->上升沿
所以Duty = CCR2/CCR1

TIM_PWMIConfig()

使用这个函数可快速配置通道二,其原理就是用if语句判断当前已经配置好的通道,然后进行另一个通道的反向配置 

#include "bsp_tim.h"//TIM3--CH1--PA6
void TIM3_OC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PWM引脚//重定义GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;//复用推挽,手册可看GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOA,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM3);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;//PSC-预分频器TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 100-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化OC-输出比较结构体TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//因为结构体里面的成员有些是高级定时器采用得到,所以这里就先全部初始化一遍,然后再配置具体的值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//TIM_OCInitStruct.TIM_Pulse = 50;//CRR   --设置频率1KHZ,占空比50%,分辨率1%的PWM波型TIM_OCInitStruct.TIM_Pulse = 0;//这里的CRR就不需要了,用固件库的一个函数 TIM_SetCompare2 直接配置CRRTIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性TIM_OC1Init(TIM3,&TIM_OCInitStruct);//CH1通道//启动定时器TIM_Cmd(TIM3,ENABLE);}
void PWM_SetCompare1(uint16_t Compare)//设置CRR,即比较值
{TIM_SetCompare1(TIM3,Compare);
}
void PWM_SetPrescaler(uint16_t Prescaler)//设置PSC
{TIM_PrescalerConfig(TIM3,Prescaler,TIM_PSCReloadMode_Immediate);//不使用影子寄存器
}
//TIM4--CH1--PB6-频率
// 			CH2--PB7-占空比	
void TIM4_IC_Config()
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启PWM引脚//初始化GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOB,&GPIO_InitStruct);//选择时基单元的时钟-为内部时钟--定时器上电后默认是内部时钟,故不写这一个也行TIM_InternalClockConfig(TIM4);//初始化时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_Prescaler = 72-1;//PSC-预分频器-->fc = 72M/PSC = 1MTIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitStruct.TIM_Period = 65536-1;//ARR寄存器-重装载寄存器TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;/*不分频----滤波器的采样频率,可以由内部时钟直接提供,也可以由内部时钟加一个时钟分频而来,分频系数就是由TIM_ClockDivision决定*/TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器,只有高级定时器才有TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);//初始化输入捕获单元TIM_ICInitTypeDef TIM_ICInitStruct;TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//输入通道TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;//直连通道 ,不交叉TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频--每次触发都有效TIM_ICInitStruct.TIM_ICFilter = 0xF;//滤波器参数TIM_ICInit(TIM4,&TIM_ICInitStruct);TIM_PWMIConfig(TIM4,&TIM_ICInitStruct);//由该函数的具体实现可知,我们上面配置的通道一,该函数就会给我们配置成通道二和应该更改的参数//作用同下/*TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//输入通道TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_IndirectTI;//交叉TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;//不分频--每次触发都有效TIM_ICInitStruct.TIM_ICFilter = 0xF;//滤波器参数TIM_ICInit(TIM4,&TIM_ICInitStruct);*///配置触发源TIM_SelectInputTrigger(TIM4,TIM_TS_TI1FP1);//配置从模式为RESETTIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);//选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。--SMCR_SMSTIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);//使能主从模式--SMCR_MSM//启动定时器TIM_Cmd(TIM4,ENABLE);//CNT开始自增}float IC_Get_Freq(void)
{return 1000000 / (float)(TIM_GetCapture1(TIM4)+1);//fc/N   fc = 1M//这里加1是为了凑整,--->不然测出来是1001//未连接PB6和PA6的时候是1000000是因为CRR1寄存器复位值为0,0+1=1 所以1M/1=1M
}
float IC_Get_Duty(void)
{return (float)(100*(1+TIM_GetCapture2(TIM4)))/(1+TIM_GetCapture1(TIM4));//*100->为了显示的是整数,各加一是为了看着舒服
}
int main()
{OLED_Init();USART_Config();TIM3_OC_Config();TIM4_IC_Config();//配置TIM3的输出PWM频率和占空比				//CK_PSC = 72M   ARR+1 已经配置好了是100PWM_SetPrescaler(720-1);		//Freq = CK_PSC / (PSC+1)/(ARR+1)PWM_SetCompare1(50); 				//占空比 Duty = CCR /(ARR+1)//此时Freq = 72000000/720/100 = 1000while(1){i = IC_Get_Freq();j = IC_Get_Duty();OLED_ShowNum(1,1,i,7);OLED_ShowNum(3,1,j,3);}
}

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

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

相关文章

Android SystemServer进程解析

SystemServer进程在android系统中占了举足轻重的地位,系统的所有服务和SystemUI都是由它启动。 一、SystemServer进程主函数流程 1、主函数三部曲 //frameworks/base/services/java/com/android/server/SystemServer.java /** * The main entry point from zy…

element ui el-select组件添加选项下拉加载

需求描述&#xff1a;在做搜索的时候由于有一个下拉列表接口返回数据特别多所以对列表进行了一个下拉触底加载的事件&#xff0c;但是官方文档是没有对应的api的所以自己使用指令写了一个方法。 实现代码&#xff1a; <el-selectv-model"sellerNameSearchVal"v-s…

维修SedoTreepoint染色机电脑Sedomat 1800+ 5500触摸屏控制器

染厂控制器 染厂机械触摸屏控制器 Sedomat 1808 Sedomat 1808 提供 7 英​​寸用户友好型触摸屏显示屏&#xff0c;防水等级为 IP67。它保证了恶劣环境下的高质量和可靠性。RFID阅读器提供了数据采集的可能性。内部I/O可配置以满足纱线、织物和其他类型染整机的要求。 除了这些…

代码之外的功夫:程序员精进之路 -- 阅读笔记及总结

第一章 设计原型 Ross自己也不是很明确自己的需求。——好家伙&#xff0c;太真实了。客户不能明确清晰地传递自己的需求&#xff0c;客户可能只有一个大概的目标。这时候&#xff0c;该怎么办&#xff1f; 这时候可以和客户沟通&#xff0c;先出一个草图&#xff08;线框图&…

安卓UI面试题 26-30

26. Window和DecorView是什么?DecorView又是如何和Window建立联系的?Window是 WindowManager 最顶层的视图,它负责背景(窗口背景)、Title之类的标准的UI元素, Window是一个抽 象类,整个Android系统中, PhoneWindow是 Window的唯一实现类。 至于 DecorView,它是一个顶级 …

vue+elementUI实现指定列的单元格可编辑

template中的代码如下&#xff1a; <div v-if"(item.label 高压侧 || item.label 低压侧)&&coloumnHeader.label 单柱片数"><div class"editableCell"><div v-if"item.label 高压侧" dblclick"changeValue(sco…

人工智能程序使用的编程语言

用C语言可以写人工智能程序吗&#xff1f; 可以用C语言编写具有人工智能功能的程序&#xff0c;但是较为复杂。C语言是一种通用的编程语言&#xff0c;它在执行速度和资源控制方面表现出色&#xff0c;这使得它适合于需要高性能处理的人工智能应用&#xff0c;如游戏AI&#xf…

邮件安全|“AI钓鱼邮件”愈发泛滥,钓鱼邮件如何防“钓”?

毋庸置疑&#xff0c;人工智能是把双刃剑。 在AI蓬勃发展的过程中&#xff0c;潜在的风险正在悄然滋长。 近日&#xff0c;网络安全公司Enea发布的一份报告指出&#xff0c;随着以人工智能驱动的语音钓鱼&#xff08;vishing&#xff09;和短信钓鱼&#xff08;smishing&…

tomcat中把项目放在任意目录中的步骤

java web 项目由idea开发&#xff0c;路径如下图所示&#xff1a; 1.在tomcat安装目录conf\Catalina\localhost 里面&#xff0c;编写lesson1.xml文件内容如下&#xff1a; <Context path"/lesson1" docBase"C:\Users\信息技术系\Desktop\2024\学校工作\jav…

详解uniapp的生命周期

这篇文章主要介绍了 uniapp 的生命周期, 应用生命周期是指应用程序从启动到关闭的整个过程&#xff0c;包括应用程序的启动、前后台切换、退出等, 需要的朋友可以参考下 Uniapp 作为一款跨平台应用开发框架&#xff0c;具有丰富的生命周期&#xff0c;以下是 Uniapp 的生命周期…

【一】【单片机】有关LED的实验

点亮一个LED灯 根据LED模块原理图&#xff0c;我们可以知道&#xff0c;通过控制P20、P21...P27这八个位置的高低电平&#xff0c;可以实现D1~D8八个LED灯的亮灭。VCC接的是高电平&#xff0c;如果P20接的是低电平&#xff0c;那么D1就可以亮。如果P20接的是高电平&#xff0c;…

【四 (4)数据可视化之 Ploty Express常用图表及代码实现 】

目录 文章导航一、介绍二、安装Plotly Express三、导入Plotly Express四、占比类图表1、饼图2、环形图3、堆叠条形图4、百分比堆叠条形图 五、比较排序类1、条形图2、漏斗图3、面积漏斗图 六、趋势类图表1、折线图2、多图例折线图3、分列折线图4、面积图5、多图例面积图 七、频…

逻辑数据平台的 NoETL 之道(内含QA)

作者简介&#xff1a; 余俊&#xff0c;Aloudata 合伙人 & 技术副总裁。拥有 18 年互联网技术和大数据平台相关架构经验。作为主架构师及核心研发主导并完成了 Alibaba B2B 首个海量分布式 KV 存储系统&#xff0c;作为网站架构师负责 Aliexpress 全球买全球卖交易系统的第…

【云原生-kubernetes系列】--kubernetes日志收集

1、ELK架构 1.1、部署ES集群 https://mirrors.tuna.tsinghua.edu.cn/elasticstack/apt/7.x/pool/main/e/elasticsearch/ 1、下载软件包 rootes-server1:~# wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/apt/7.x/pool/main/e/elasticsearch/elasticsearch-7.12.0-…

STL库中的string

文章目录 一、STL的六大组件二、string类2.1string中的size()方法2.2隐式类型的转换2.3string的多种构造2.4string中size与length是否有差异&#xff1f;2.4string中的capacity2.5string中的push_back和append2.6string中运算符重载operator2.7string中的reserve扩容2.8string中…

数据结构——字符串

1.leetcode 151 题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/reverse-words-in-a-string/…

C++:基类中的函数什么情况下声明为虚函数

在C中&#xff0c;基类中的函数应该在以下情况下声明为虚函数&#xff1a; 实现多态行为&#xff1a;如果你希望通过基类指针或引用来调用派生类中的重写函数&#xff0c;那么基类中的这个函数应该被声明为虚函数。这是实现运行时多态性的一种方式。 允许派生类重写&#xff1…

体验OceanBase OBD V2.5.0 组件内扩容和组件变更

背景 OBD 是OceanBase的命令行部署工具&#xff0c;在 obd V2.5.0 版本之前&#xff0c;其主要功能主要是部署各类组件&#xff0c;例如 oceanbase-ce,obproxy-ce,obagent 等。然而&#xff0c;它并不支持组件的变更操作以及组件内部的扩缩容调整。具体来说&#xff1a; 1、若…

C语言经典面试题目(八)

1、什么是文件指针&#xff1f;请解释文件指针的作用。 文件指针是在C语言中用来指向文件的指针变量。它主要用于对文件进行读写操作&#xff0c;通过文件指针可以控制文件的读写位置、读取文件内容、向文件中写入数据等操作。 文件指针的作用&#xff1a; 打开文件&#xff…

网络层_IP

传输层解决的是传输控制&#xff0c;而实际真正决定数据能否发送到对端的是网络层。网络层是有概率传输&#xff0c;而传输层是可靠性传输。所以传输层网络层就可以做到将数据可靠发送到对端。网络层的常见协议有&#xff1a;IP、ICMP等&#xff0c;其中最重要的是IP协议&#…