当前位置: 首页 > news >正文

物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录

  • 可变参数的使用技巧
  • 第三阶段-初级实验
    • Lesson5:不一样的点灯实验---学习I/O的输出
  • ☆点灯的电路图分析
    • 1 一起看看点灯的电路图
    • Tip1:另一种点灯的电路
    • Tip1:如何访问外设的寄存器
    • 2 STM32F407中操作GPIO的方法
  • 通过直接操作寄存器实现点灯实验
    • Tip1:硬件编程的基本流程
  • 2代码实现及分析

可变参数的使用技巧

void fixed_args_func(int a, double b, char c)
{printf("a = 0x%p\n", &a);printf("b = 0x%p\n", &b);printf("c = 0x%p\n", &c);
if(&a==MCULowPower)
}
void var_args_func(const char * fmt, ...)
{... ...
}
void var_args_func(const char * fmt, ...)
{char    *ap;ap = ((char*)&fmt) + sizeof(fmt);printf("%d\n", *(int*)ap);ap =  ap + sizeof(int);printf("%d\n", *(int*)ap);ap =  ap + sizeof(int);printf("%s\n", *((char**)ap));
}

在这里插入图片描述

第三阶段-初级实验

Lesson5:不一样的点灯实验—学习I/O的输出

1: 理论基础 CPU工作机制 如何对CPU编程
外设的的原理
2:代码实现以及分析
3:在板实验和调试
嵌入式开发必知会之三—
了解LED☆点灯的电路图分析区
STM32F407中GPIO的特性及操作方法
1.LED的功能,特点和用途
在这里插入图片描述

发光二极管
在这里插入图片描述

2.LED的工作原理

课后作业:请同学们课后了解电阻,电容和电感的功能,特点,用途及电路符号表示

☆点灯的电路图分析

1 一起看看点灯的电路图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Tip1:另一种点灯的电路

1 STM32F407中GPIO的特性
Tip1:如何访问外设的寄存器

2 STM32F407中操作GPIO的方法

  • 输出的配置

  • 高低电平的配告

  • 手册描述
    通用IO (GPIO)
    除非特别说明,否则本部分适用于整个STM32F4xx系列。

    • 7.1 GPIO简介
      每个通用IO端口包括4个32位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和 GPIOx_PUPDR)、2个32位数据寄存器(GPIOx_IDR和
      GPIOx_ODR)、1个 32位置位/复位寄存器(GPIOx_BSRR)、1个32位锁定寄存器(GPIOx_LCKR)和2个32位复用功能选择寄存器(GPIOx_AFRH 和GPIOx_AFRL)。

    • 7.2 GPIO主要特性受控IO多达16个
      输出状态:推挽或开漏+上拉/下拉
      从输出数据寄存器(GPIOx_ODR)或外设(复用功能输出)输出数据可为每个IO选择不同的速度
      输入状态:浮空、上拉/下拉、模拟
      将数据输入到输入数据寄存器(GPIOx_IDR)或外设(复用功能输入)置位和复位寄存器(GPIOx_BSRR),对GPIOx_ODR具有按位写权限锁定机制(GPIOx_LCKR),可冻结IO配置
      模拟功能
      复用功能输入/输出选择寄存器(一个IO最多可具有16个复用功能>快速翻转,每次翻转最快只需要两个时钟周期
      引脚复用非常灵活,允许将IO引脚用作GPIO或多种外设功能中的一种

    • 7.3 GPIO功能描述
      根据数据手册中列出的每个lO端口的特性,可通过软件将通用IVO(GPIO)端口的各个端口位分别配置为多种模式;
      输入浮空
      输入上拉
      输入下拉模拟功能
      具有上拉或下拉功能的开漏输出具有上拉或下拉功能的推挽输出具有上拉或下拉功能的复用功能推挽具有上拉或下拉功能的复用功能开漏
      每个IO端口位均可自由编程,但IO端口寄存器必须按32位字、半字或字节进行访问。GPIOx_BSRR寄存器旨在实现对GPIO ODR寄存器进行原子读取/修改访问。这样便可确保在读取和修改访问之间发生中断请求也不会有问题。
      在这里插入图片描述

    • 8.3.10 Output配置
      在这里插入图片描述 在这里插入图片描述
      当lO口编程为输出时:。输出缓冲区被启用:
      在这里插入图片描述

    -漏极模式:输出寄存器中的“O”激活N-MOS,而“1”激活N-MOS
    在输出寄存器中离开Hi-Z端口(P-MOS从未激活)
    推挽模式:输出寄存器中的“O”激活N-MOS,而输出寄存器中的“1”激活P-MoS
    施密特触发器输入被激活
    弱上拉和下拉电阻是否激活取决于GPIOx_PUPDR寄存器中的值
    l/O引脚上的数据在每个AHB1时钟周期中被采样到输入数据寄存器中
    对输入数据寄存器的读访问获得I/O状态。
    对输出数据寄存器的区域访问获得最后写入的值。
    图29显示了IO端口位的输出配置。
    原文:
    8.3.10 Output configuration
    When the I/O port is programmed as output:
    • The output buffer is enabled:
    – Open drain mode: A “0” in the Output register activates the N-MOS whereas a “1”
    in the Output register leaves the port in Hi-Z (the P-MOS is never activated)
    – Push-pull mode: A “0” in the Output register activates the N-MOS whereas a “1” in
    the Output register activates the P-MOS
    • The Schmitt trigger input is activated
    • The weak pull-up and pull-down resistors are activated or not depending on the value
    in the GPIOx_PUPDR register
    • The data present on the I/O pin are sampled into the input data register every AHB1
    clock cycle
    • A read access to the input data register gets the I/O state
    • A read access to the output data register gets the last written value
    Figure 29 shows the output configuration of the I/O port bit.

Tip1:如何访问外设的寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 STM32F407中操作GPIO的方法

  • 输出的配置
  • 高低电平的配置

通过直接操作寄存器实现点灯实验

  • 实验的需求分析(实验目的)
    • 学会基本的硬件操作—I/O的输出高低电平
    • 操作学习利用系统时钟实现较为精确的延时
    • 学习规范的模块化编程
    • 学会使用CMSIS的支持库
  • 通过直接操作寄存器实现点灯代码
  • 代码下载及调试演示
    1程序流程分析
    • 如何利用系统时钟实现较为精确的延时
      9.5SysTick 定时器
      9.5.1 为什么要有SysTick 定时器
      Cortex-M处理器内集成了一个小型的名为SysTick(系统节拍)的定时器,它属于NVIC的一部分,且可以产生SysTick 异常(异常类型#15)。SysTick 为简单的向下计数的24位计数器,可以使用处理器时钟或外部参考时钟(通常是片上时钟源)。
      在现代操作系统中,需要一个周期性的中断来定期触发OS内核,如用于任务管理和上下文切换,处理器也可以在不同时间片内处理不同任务。处理器设计还需要确保运行在非特权等级的应用任务无法禁止该定时器,否则任务可能会禁止SysTick 定时器并锁定整个系统。
      之所以在处理器内增加一个定时器,是为了提高软件的可移植性。由于所有的Cortex-M处理器都具有相同的SysTick定时器,为一种Cortex-M3/M4微控制器实现的OS也能适用于其他的Cortex-M3/M4微控制器。
      若应用中不需要使用OS,SysTick定时器可用作简单的定时器外设﹐用以产生周期性中断、延时或时间测量。
      9.5.2SysTick定时器操作

      在这里插入图片描述
      如表9.6所示,SysTick定时器中存在4个寄存器。CMSIS-Core头文件中定义了一个名为SysTick的结构体,方便对这些寄存器的访问。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

      SysTick内部包含一个24位向下计数器,如图9.15所示。它会根据处理器时钟或一个参考时钟信号(在ARM Cortex-M3或Cortex-M4 技术参考手册中也被称作STCLK)来减小计数。参考时钟信号取决于微控制器的实际设计,有些情况下﹐它可能会不存在。由于要检测上升沿,参考时钟至少得比处理器时钟慢两倍。
      在设置控制和状态寄存器的第О位使能该计数器后,当前值寄存器在每个处理器时钟周期或参考时钟的上升沿都会减小。若计数减至0,它会从重加载寄存器中加载数值并继续运行。
      另外一个寄存器为SysTick校准值寄存器。它为软件提供了校准信息。由于CMSIS-Core提供了一个名为SystemCoreClock 的软件变量(CMSIS 1.2 及之后版本可用,CMSIS 1.1或之前版本则使用变量SystemFrequency) ,因此它就未使用SysTick校准值寄存器。系统初始
      化函数SystemInit()函数设置了该变量,而且每次系统时钟配置改变时都要对其进行更新。这种软件手段比利用SysTick校准值寄存器的硬件方式更灵活。
      SysTick寄存器的细节如表9.7~表9.10所示。
      9.5.3使用 SysTick定时器
      若只想产生周期性的SysTick中断,最简单的方法就是使用CMSIS-Core函数 SysTick_Config :
      uint32_t SysTick_Conf ig(uint32_t ticks) ;
      该函数将SysTick 中断间隔设置为ticks,使能计数器使用处理器时钟,然后设置SysTick异常为最低优先级。
      例如,若要在30MHz的时钟频率下产生1kHz的SysTick异常,则可以使用:SysTick_Config(SystemCoreClock / 1000) ;
      变量SystemCoreClock应该存放正确的时钟频率数值,也就是30×10°。另外,只需使用:
      SysTick_Config( 30000) ;
      //30MHz / 1000 = 30000
      SysTick_Handler( void)的触发频率就变成了1kHz。
      若SysTick_Config 函数的输入参数不满足24位重加载数值寄存器(大于0xFFFFFF),SysTick_Config函数返回1,否则会返回0。
      许多情况下,可能会使用参考时钟或者不想使能SysTick 中断,那么就不要使用SysTick_Config 函数。此时需要直接操作 SysTick寄存器,推荐使用下面的流程:
      (1)将0写人 SysTick->CTRL禁止 SysTick定时器。这个操作是可选的。若重用了其他代码,则由于SysTick之前可能已经使能过了,因此本操作是推荐使用的。
      (2)将新的重加载值写入SysTick->LOAD,重加载值应该为周期数减1。
      (3)将任何数值写人SysTick当前值寄存器SysTick->VAL,该寄存器会被清零
      (4)写入 SysTick控制和状态寄存器SysTick->CTRL启动SysTick定时器。
      由于SysTick定时器向下计数到0,因此,若要设置SysTick周期为1000,则应该将重加载值(SysTick->LOAD)设置为999。
      若要在轮询模式中使用SysTick定时器,则可以利用SysTick 控制和状态寄存器(SysTick->CTRL)中的计数标志来确定定时器何时变为0。例如,可以将SysTick定时器设置为特定数值,然后等它变为0,并以此实现延时:
      SysTick-> CTRL = 0;
      /禁止SysTick
      SysTick - > LOAD = OxFF;
      //计数范围255~0 (256个周期)
      SysTick-> VAL = 0 ;
      //清除当前值和计数标志
      SysTick- > CTRL = 5;
      //使能SysTick定时器并使用处理器时钟 5的二进制是0101
      while ( (SysTick - >CTRL & Ox00010000) == 0);//等待计数标志置位
      SysTick - > CTRL= 0 ;
      /!禁止 SysTick
      若要将SysTick中断用作在一定时间后触发的单发操作,则可以将重加载值减小12个周期,以补偿中断等待时间。例如,要使SysTick定时器在300个时钟周期后执行:
      volatile int SysTickFired;
      1/全局软件标志,表示 SysTickAlarm已执行

      SysTick-> CTRL= 0 ;
      /禁止 SysTick
      SysTick -> LOAD = (300-12);
      //设置重加载值,由于异常等待减去12
      SysTick - > VAL=0;
      //将当前值清为0
      SysTickFired = 0;
      //将软件标志设为0
      SysTick - > CTRL= 0x7;
      1/使能SysTick,使能 SysTick异常且使用处理器时钟 0x7=0111
      while (SysTickFired == 0 );
      1/等待SysTick处理将软件标志置位
      在单发SysTick处理中﹐需要禁止SysTick,以防SysTick 异常再次产生。若由于所需的处理任务花费的时间太长而导致挂起状态再次置位﹐则可能还需要清除SysTick 的挂起状态:
      void SysTick_Handler(void)
      // SYSTICK异常处理
      {
      SysTick ->CTRL = Ox0 ;
      /1禁止SysTick
      …;
      //执行所需任务
      SCB->ICSR | = 1 <<25;
      //清除SYSTICK挂起位,防止再次挂起
      sysTickFired++ ;
      //更新软件标志,主程序据此可以知道SysTick
      定时任
      务已执行
      return;
      若同时产生了另一个异常,则 SysTick异常可能会延迟。
      SysTick 定时器可用于时间测量。例如,可以用下面的代码测量一个短函数的持续时间:
      unsigned int start_time,stop_time,cycle_count;
      SysTick - > CTRL= 0 ;
      /I/禁止SysTick
      SysTick - > LOAD =0xFFFFFFFF;
      //将重加载值设置为最大
      SysTick -> VAL= 0 ;
      //将当前值清为0
      SysTick ->CTRL= 0x5;
      /1使能SysTick,使用处理器时钟
      while(SysTick- > VAL != 0);
      //等待SysTick重加载
      start_time = SysTick - > VAL;
      //获取开始时间
      function();
      //执行要测量的函数
      stop_time =SysTick- > VAL;
      1/获取停止时间
      由于SysTick定时器向下计数, start_time的数值比 stop_time要大。可能还需要在时间
      测量的结尾检查一下count_flag。若count_tlag 置位时测则风的NE大了 A旧 t六敝还要能SysTick异常且在SysTick处理中计算SyslicK T效奋恤出的认效。nW川心欢u一考虑SysTick 异常。
      SysTick定时器还提供了一个校准值寄存器。若该信息存在,则SysTick->CALIB寄存
      器的最低24位表示要得到10ms SysTick间隔所需的重加载值。个过,计多似丘润’P开仅有这个信息,TENMS位域读出为0。CMSIS-Core方案则提供」一个表水频平信忌的队什受量,这种方式更加灵活且得到了多数微控制器供应商的支持。
      可以利用 SysTick校准值寄存器的第31位确定参考时钟是否存在。9.5.4其他考虑
      在使用SysTick定时器时需要考虑以下几点:
      . SysTick定时器中的寄存器只能在特权状态下访问。·参考时钟在一些微控制器设计中可能会不存在。
      ·若应用中存在嵌入式OS,SysTick定时器会被OS使用,因此就不能冉放应用在方使用了。
      ·当处理器在调试期间暂停时,SysTick定时器会停止计数。
      ·根据微控制器的实际设计,SysTick定时器可能会在某些休眠模式中停止计数。

/初始化延迟函数
//当使用uoo=的时候,此函数会初始化uco=的时钟节拍7/SYSTICK的时钟固定为AHB时钟的1/8
//sYSCLK:系统时钟频率
void delay_init (u8 sYSCLK)
{
SysTick->CTRL&=~(1<<2);//SYSTICR使用外部时钟源 只操作了第2位
fac_us=SYSCLK/8;//每个us需要的systick时钟数
fac_ms= (u16) fac_us*1000;//每个ns需要的systick时钟数
}
  • 如何初始化I/O

Tip1:硬件编程的基本流程

1、初始化硬件:总线始终初始化,申请区域存放寄存器,配置IO的输出形式,设置IOspeed,是否需要AF(第2功能)

2代码实现及分析

#include "sys tick.h"
#include "led.h"#define SYS_MAX_CLK 168int main(void)
{Led_init();//初始化LED0delay_init(SYS_MAX_CLK);//初始化系统时钟while(1){LED0_ON;//点亮LED0delay_ms(1000);//延时1sLED0_OFF;//关闭leddelay_ms(1000);//延时1s}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

物联网|可变参数的使用技巧|不一样的点灯实验|访问外设的寄存器|操作寄存器实现点灯|硬件编程的基本流程-学习笔记(11)

文章目录 可变参数的使用技巧第三阶段-初级实验Lesson5:不一样的点灯实验---学习I/O的输出 ☆点灯的电路图分析1 一起看看点灯的电路图Tip1:另一种点灯的电路Tip1:如何访问外设的寄存器2 STM32F407中操作GPIO的方法 通过直接操作寄存器实现点灯实验Tip1:硬件编程的基本流程 2代…...

30. 利用linprog 解决 生产决策问题(matlab程序)

1.简述 线线规划的几个基本性质&#xff1a;【文献[1]第46页】 (1)线性规划问题的可行域如果非空&#xff0c;则是一个凸集-凸多面体&#xff1b; (2)如果线性规划问题有最优解&#xff0c;那么最优解可在可行域的顶点中确定&#xff1b; (3)如果可行域有界&#xff0c;且可行域…...

一百三十九、Kettle——Linux安装Kettle8.2

一、目的 为了方便海豚调度kettle任务&#xff0c;在Linux上安装kettle 二、kettle版本与前提 版本&#xff1a;kettle8.2 pdi-ce-8.2.0.0-342 前提&#xff1a;Linux已经安装好jdk 三、安装步骤 &#xff08;一&#xff09;打开安装包所在地 [roothurys22 ~]# cd …...

react路由在layout中的监听

业务中需要在layout里来监听路由的变化&#xff0c;但是layout并不是一个路由组件&#xff0c;所以layout组件内的props并没有location,history等属性&#xff0c;&#xff08;路由组件&#xff1a;由Route组件处理的才是路由组件&#xff09;所以我们需要将layout组件转变成路…...

Java反射(三)

目录 1.反射与代理设计模式 2.反射与Annotation 3.自定义Annotation 4.Annotation整合工厂设计模式和代理设计模式 1.反射与代理设计模式 代理模式是指通过业务真实类实现业务接口&#xff0c;再通过设置代理类创建业务真实类子类从而间接访问业务真实类。但是这存在一个弊…...

ansible-playbook roles编写lnmp剧本

目录 集中式编写lnmp剧本 执行 分布式编写lnmp剧本 一定要设置ssh免交互 nginx mysql php 执行 集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml - name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condifurecopy: src/etc/yum.repos.d/nginx.r…...

相机可用性变化监听AvailabilityCallback流程分析

相机可用性变化监听及流程分析 一、接口说明 ​ 相机可用性变化监听可以通过CameraManager中的接口registerAvailabilityCallback()来设置回调&#xff0c;接口如下&#xff1a; /** *注册一个回调以获得有关相机设备可用性的通知。 * *<p>再次注册相同的回调将用提供…...

使用Python多线程实现生产者消费者模型

“Talk is cheap, show me the code.” 废话不多说&#xff0c;直接上代码&#xff1a; """ 生产者消费者模型 Python实现 """ import queue import threading import random import timeclass ConsProd:# 队列参数_que None # 队列# 生产者…...

Notepad++工具通过正则表达式批量替换内容

1.每行末尾新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入$&#xff0c;替换为输入特定字符串&#xff1b;选中循环查找&#xff0c;查找模式选正则表达式&#xff1b;最后点击全部替换 2.每行行首新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入^&…...

从零构建深度学习推理框架-3 手写算子relu

Relu介绍&#xff1a; relu是一个非线性激活函数&#xff0c;可以避免梯度消失&#xff0c;过拟合等情况。我们一般将thresh设为0。 operator类&#xff1a; #ifndef KUIPER_COURSE_INCLUDE_OPS_OP_HPP_ #define KUIPER_COURSE_INCLUDE_OPS_OP_HPP_ namespace kuiper_infer {…...

想做上位机,学C#还是QT?

学习C#还是Qt&#xff0c;取决于你的具体需求和偏好。 如果你计划开发跨平台的桌面应用程序&#xff0c;并且希望使用一种更轻量级、直观的界面框架&#xff0c;那么Qt可能是一个不错的选择。Qt是一个功能丰富且成熟的跨平台框架&#xff0c;支持多种开发语言&#xff08;包括…...

Ansible —— playbook 剧本

Ansible —— playbook 剧本 一、playbook的概述1.playbook简介2.什么是Ansible playbook剧本&#xff1f;3.Ansible playbook剧本的特点4.如何使用Ansible playbook剧本&#xff1f;5.playbooks 本身由以下各部分组成 二、playbook示例1.运行playbook2.定义、引用变量3.指定远…...

ARM寻址方式

寻址方式 寻址方式是根据指令中给出的地址码字段来实现寻找操作数地址的方式&#xff0c;ARM中有以下8种基本的寻址方式。 1、寄存器寻址 将寄存器中的值作为操作数&#xff0c;指令中的地址码字段是寄存器编号。 MOV R1,R2 ;R1 R2 ADD R0,R1,R2 ;R0 R1 R22、立即寻…...

【JAVA】String ,StringBuffer 和 StringBuilder 三者有何联系?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言StringBufferStringBuffer方法 StringBuilderStringBuilder方法 String &#xff0c;StringBuffer 和 StringBuilder的区别String和StringBuffer互相转换 前言 在之前的文章…...

关于计数以及Index返回订单号升级版(控制字符长度,控制年月标记)

数据库表操作&#xff1a; EXEC sys.sp_dropextendedproperty nameNName , level0typeNSCHEMA,level0nameNdbo, level1typeNTABLE,level1nameNSetNoIndexGOEXEC sys.sp_dropextendedproperty nameNMS_Description , level0typeNSCHEMA,level0nameNdbo, level1typeNTABLE,level…...

【计算机网络】11、网桥(bridge)、集线器(hub)、交换机(switch)、路由器(router)、网关(gateway)

文章目录 一、网桥&#xff08;bridge)二、集线器&#xff08;hub&#xff09;三、交换机&#xff08;switch)四、路由器&#xff08;router&#xff09;五、网关&#xff08;gateway&#xff09; 对于hub&#xff0c;一个包过来后&#xff0c;直接将包转发到其他口。 对于桥&…...

第九篇-自我任务数据准备

格式化自我意识数据用于ChatGLM微调 准备数据源 https://github.com/hiyouga/ChatGLM-Efficient-Tuning cd data self_cognition.json代码self_process.py #!/usr/bin/python # -*- coding: UTF-8 -*- # 读取self_cognition自我认知解析并写入转换新文件import json# 读取se…...

2023.8.1号论文阅读

文章目录 MCPA: Multi-scale Cross Perceptron Attention Network for 2D Medical Image Segmentation摘要本文方法实验结果 SwinMM: Masked Multi-view with SwinTransformers for 3D Medical Image Segmentation摘要本文方法实验结果 MCPA: Multi-scale Cross Perceptron Att…...

webpack优化前端框架性能

webpack优化目的 webpack优化目的1. 提升开发体验提升开发体验使用 SourceMap 2. 提升打包构建速度提升打包构建速度&#xff08;开发模式&#xff09;提升打包速度 oneOf提升打包速度 include&#xff08;包含&#xff09;/exclude&#xff08;排除&#xff09;提升第二次打包…...

Unity UGUI的Outline(描边)组件的介绍及使用

Unity UGUI的Outline(描边)组件的介绍及使用 1. 什么是Outline(描边)组件&#xff1f; Outline(描边)组件是Unity UGUI中的一种特效组件&#xff0c;用于给UI元素添加描边效果。通过设置描边的颜色、宽度和模糊程度&#xff0c;可以使UI元素在视觉上更加突出。 2. Outline(描…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...