五、定时器实现呼吸灯
5.1 定时器与计数器简介
定时器是一种通过对内部时钟脉冲计数来测量时间间隔的模块。它的核心是一个递增或递减的寄存器(计数器值)。如果系统时钟为 1 MHz
,定时器每 1 μs
计数一次。
计数器是一种对外部事件(如脉冲信号)进行计数的模块,而不是基于固定时钟。外部引脚每收到一个脉冲(如按键按下或传感器触发),计数值加 1 或减 1。
LPC1100系列Cortex-M0微控制器有2个32位和2个16位可编程定时器/计数器,都有捕获和匹配输出的功能。
捕获:捕获功能用于记录外部信号变化时定时器的当前值,常用于测量信号的频率、脉宽或相位差。当外部信号(如引脚电平变化)触发捕获事件时,定时器的当前值会被自动保存到捕获寄存器。
匹配输出:定时器的一种功能,当定时器的计数值达到预设的匹配值(Match Value)时,自动触发特定动作(如翻转引脚电平、产生中断等)。用户预先设置一个匹配值,当定时器计数值等于该值时,硬件会自动执行操作,无需 CPU 干预。
5.2 定时器工作流程
对于定时器,先设置预分频计数器的计数上限,预分频计数器每计满一次定时器就加一,定时器达到匹配就可触发相应事件。
设置 PR (分频值)的值(如 PR = 99),PC 从 0 开始计数。每来一个输入时钟脉冲,PC 加 1。当 PC = PR 时,PC 清零,并输出一个脉冲给定时器的主计数器。每接收到一个来自预分频器的脉冲,定时器的主计数器TC加 1。
5.3 定时器/计数器寄存器
有四种定时器 TMR32B0、TMR32B1、TMR16B0, TMR16B1
功能类似,就计的总数32位、16位的区别
5.3.1 定时器中断寄存器 TMR32/16BnIR
包含4个匹配中断和一个捕获中断标志位,有中断相应位置位变成1,没中断变0,写1可以清零中断,写零无效。
位 | 对应名 | |
0 | MR0中断 | 中断标志 |
1 | MR1中断 | |
2 | MR2中断 | |
3 | MR3中断 | |
4 | CAP0中断 | |
31:5 | 保留 |
5.3.2 定时器控制寄存器 TMR32/16BnTCR
位 | 功能 |
0 | 1使能,0禁能 |
1 | 写1定时器/计数器和分频在PCLK下一个上升沿复位, 复位状态直到该位重新写0才会改变 |
31:2 | 保留 |
5.3.3 定时器/计数器当前计数值 TMR32/16BnTC
预分频计数器计数到上限时,TC计数值加一,TC到上限没复位则32位会计数到0xFFFFFFFF然后翻转到0x00000000,没中断啥的一些情况,然后继续去计数了。
5.3.4 预分频寄存器 TMR32/16BnPR
指定预分频计数器的最大计数值
PR为0,每1个PCLK(48MHz时钟一个周期)TC计数加一
PR为1,每2个PCLKTC计数加一
5.3.5 预分频计数器 TMR32/16BnPC
对输入时钟脉冲进行计数的计数值,不用理会
5.3.6 匹配控制寄存器 TMR32/16BnMCR
位 | 功能 (1 产生对应效果, 0 无该特性) |
0 | MR0匹配时产生中断 |
1 | MR0匹配时复位TC |
2 | MR0匹配时TC和PC计数都停止 TCR[0]置0(定时器禁能了) |
3 | MR1匹配时产生中断 |
4 | MR1匹配时复位TC |
5 | MR1匹配时TC和PC计数都停止 TCR[0]置0(定时器禁能了) |
6 | MR2匹配时产生中断 |
7 | MR2匹配时复位TC |
8 | MR2匹配时TC和PC计数都停止 TCR[0]置0(定时器禁能了) |
9 | MR3匹配时产生中断 |
10 | MR3匹配时复位TC |
11 | MR3匹配时TC和PC计数都停止 TCR[0]置0(定时器禁能了) |
31:12 | 保留 |
5.3.7 匹配寄存器 TMR32/16BnMR0/1/2/3
自动与TC值相比较的,相等触发对应效果,不用理会
5.3.8 捕获寄存器 TMR32/16BnCCR
位 | 功能 (1 产生对应效果, 0 无该特性) |
0 | CAP0上升沿捕获,使TC内容装入CR0 |
1 | CAP0下降沿捕获,使TC内容装入CR0 |
2 | CAP0事件导致的装载产生中断 |
31:3 | 保留 |
5.3.9 捕获寄存器 TMR32/16BnCR0
引脚发生特定事件时存储TC内容,只读
5.3.10 外部匹配寄存器 TMR32/16BnEMR
位 | 功能 |
0 | EM0外部匹配0输出MAT0的状态 即TC与MR0匹配时的输出 |
1 | EM1外部匹配1输出MAT1的状态 |
2 | EM2外部匹配0输出MAT2的状态 |
3 | EM3外部匹配0输出MAT3的状态 |
5:4 | EMC0 00 无操作 01 输出低电平0 10 输出高电平1 11 输出电平翻转 |
7:6 | EMC1 以下同EMC0 |
9:8 | EMC2 |
10:11 | EMC3 |
15:12 | 保留 |
5.3.11 计数控制寄存器 TMR32/16BnCTCR
用于定时器与计数器模式之间的选择
位 | 值 | 描述 |
1:0 | 00 | 定时器模式:TC在PCLK上升沿计数 |
01 | 计数器模式:TC在选择的CAP输入的上升沿递增 | |
10 | 计数器模式:TC在选择的CAP输入的下降沿递增 | |
11 | 计数器模式:TC在选择的CAP输入的双边沿递增 | |
3:2 | 00 | CAP0引脚 |
其他 | 保留(貌似条件有限没有其他CAP引脚,所以上边选择也是就选择CAP0) | |
31:4 | 保留 |
5.3.12 PWM控制寄存器 TMR32/16BnPWMC
用于将匹配的输出设置为PWM输出,
大致可整两个匹配,分别控制占空比和周期
一个匹配寄存器调占空比,出现匹配时,PWM输出置为高电平,匹配前是低电平
一个匹配作为PWM周期,匹配时复位,高电平清零
具体小细节见书P136页。
位 | 功能 |
0 | 1 MAT0的PWM模式使能 0 MAT0受EM0控制 |
1 | 1 MAT1的PWM模式使能 0 MAT1受EM1控制 |
2 | 1 MAT2的PWM模式使能 0 MAT2受EM2控制 |
3 | 1 MAT3的PWM模式使能 0 MAT3受EM3控制 |
32:4 | 保留 |
5.4 呼吸灯
目标:
(1)利用16位定时器1实现定时1s,控制LPC1114微控制器的GPIO引脚PIO1_9状态反转(可以用中断方式也可以用匹配输出功能),此时LED灯Blinky闪烁频率为0.5Hz;
(2)设置16位定时器1工作在PWM模式,PIO1_9设置为PWM输出引脚,利用另外一个定时器定时(例如32位定时器0,设置每隔0.01s,或者更小)增大或者减小16位定时器1输出PWM的占空比(占空比改变的步长与32位定时器0的定时时间相配合,确定呼吸频率),实现PIO1_9上的LED灯渐亮渐灭的呼吸灯效果。
思路:
主要是两部分内容,第一部分直接SysTick也能实现,但是使用定时器就是要熟悉一下定时器怎么用,第二部分就是定时器的PWM占空比不断升高降低,这个是使用两个定时器,一个定时器实现翻转,另一个定时器实现改变第一个定时器的占空比,按时间依次增加或者减小即可。
这两部分内容可以直接使用按键切换,相当于两种模式,即闪烁模式和PWM呼吸灯模式,将上章写的Button中断改一下就行了
Button.c
#include "Button.h"
#include "TIMER.h"
int flag1 = 0, flag2 = 0; // 判断botton 和 wakeup 按键上一次状态//延时ms函数 // 太粗糙了,而且要根据机器指令与时钟周期关系调整,也就防抖延时用一下
__inline void delay_ms(uint32_t a) //约1ms延时函数
{ uint32_t i;while( a -- != 0){for(i = 0; i<5500; i++);}
}void WAKEUP_Init(void)
{LPC_SYSCON -> SYSAHBCLKCTRL |= (1UL << 6) | (1UL << 16); // 使能GPIO时钟和IO时钟// PIO1_4LPC_IOCON->PIO1_4 &= ~(0x1F); // 清除之前的配置LPC_IOCON->PIO1_4 |= 0x00; // 配置为GPIO功能LPC_GPIO1->DIR &= ~(1UL << 4);// 设置GPIO方向为输入LPC_GPIO1->IS &= ~(0x1 << 4); // 清除第 4 位,设置为边沿触发LPC_GPIO1->IBE &= ~(0x1 << 4); // 清除第 4 位,设置为单边沿触发LPC_GPIO1->IEV &= ~(0x1 << 4); // 清除第 4 位,设置为低电平触发LPC_GPIO1 -> IE |= (0x1<<4); // 使能端口中断LPC_IOCON->PIO1_4 |= (1UL << 5); // 使能滞后模式LPC_GPIO1->IC |= (1UL << 4); // 清除中断标志位NVIC_EnableIRQ(EINT1_IRQn); // 使能GPIO1中断
}void Button_Init(void)
{LPC_SYSCON -> SYSAHBCLKCTRL |= (1UL << 6) | (1UL << 16); // 使能GPIO时钟和IO时钟// PIO3_5LPC_IOCON->PIO3_5 &= ~(0x1F); // 清除之前的配置LPC_IOCON->PIO3_5 |= 0x00; // 配置为GPIO功能LPC_GPIO3->DIR &= ~(1UL << 5);// 设置GPIO方向为输入LPC_GPIO3->IS &= ~(0x1 << 5); // 清除第 5 位,设置为边沿触发LPC_GPIO3->IBE &= ~(0x1 << 5); // 清除第 5 位,设置为单边沿触发LPC_GPIO3->IEV &= ~(0x1 << 5); // 清除第 5 位,设置为低电平触发LPC_GPIO3 -> IE |= (0x1<<5); // 使能端口中断LPC_IOCON->PIO3_5 |= (1UL << 5); // 使能滞后模式LPC_GPIO3->IC |= (1UL << 5); //清除中断标志NVIC_EnableIRQ(EINT3_IRQn);
}// GPIO3_5的中断服务函数,处理BUTTON按键按下事件
void PIOINT3_IRQHandler(void)
{if((LPC_GPIO3->MIS & (1UL << 5)) == (1UL << 5))// 检查是否是PIO3_5的中断{ delay_ms(20); // 消抖while((LPC_GPIO3->DATA & (1UL << 5)) == 0);delay_ms(20);LPC_TMR16B1->PWMC ^= 1; //PWM状态翻转if(LPC_TMR16B1->PWMC == 0x01) // 如果要进PWM 模式{NVIC_EnableIRQ(TIMER_32_0_IRQn);//使能32位定时器中断TMR16B1_PWM_Mode(); }else // 如果要进闪烁灯模式{NVIC_DisableIRQ(TIMER_32_0_IRQn);//禁32位定时器中断TMR16B1_Blinky_Mode();}LPC_GPIO3->IC |= (1UL << 5); // 清除中断标志}
}
// GPIO1_4的中断服务函数,处理WAKEUP按键按下事件
void PIOINT1_IRQHandler(void)
{if((LPC_GPIO1->MIS & (1UL << 4)) == (1UL << 4)) // 检查是否是PIO1_4的中断{delay_ms(20);while((LPC_GPIO1->DATA & (1UL << 4)) == 0);delay_ms(20);LPC_GPIO1->IC |= (1UL << 4); // 清除中断标志}
}
TIMER.c
#include "TIMER.h"int flag = 1; // 递增递减标志 1递增 -1递减void TMR32B0_Init(void)//32位定时器0初始化 设置中断时间 MR0/SystemCoreClock *(PR + 1) = 0.01s
{LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 9);//使能32位定时器0的时钟LPC_TMR32B0->IR = 0x1F;//清除所有中断标志位LPC_TMR32B0->PR = 0;//设置分频系数LPC_TMR32B0->MCR = 3;//设置MR0匹配后复位TC并产生中断LPC_TMR32B0->MR0 = SystemCoreClock / 100 ; // 计数值LPC_TMR32B0->TCR = 0x01;//启动定时器NVIC_DisableIRQ(TIMER_32_0_IRQn);//开中断
}void TMR16B1_Init(void)
{LPC_SYSCON->SYSAHBCLKCTRL |= (1UL << 8) | (1UL << 16); // 16位定时器1时钟使能 | IO配置块时钟使能LPC_IOCON->PIO1_9 |= 0x01; // MAT0匹配IO1_9
}void TMR16B1_PWM_Mode(void)// PWM呼吸灯模式 1s 占空比0 -> 1 or 1 -> 0
{LPC_TMR16B1->TCR = 0x02;//定时器复位LPC_TMR16B1->PR = 99; // 分频系数LPC_TMR16B1->PWMC = 0x01;//设置MAT0为PWM输出LPC_TMR16B1->MCR = 0x02 << 9; //设置MR3匹配后复位TC;LPC_TMR16B1->MR3 = SystemCoreClock / 10000; // PWM周期设置为0.01s,设置中断时间LPC_TMR16B1->MR0 = LPC_TMR16B1->MR3 / 100;//MAT0初始化输出亮度1%LPC_TMR16B1->TCR = 0x01; // 启动定时器
}// 匹配输出翻转
void TMR16B1_Blinky_Mode(void) // 闪烁灯模式 1s翻转一次
{ LPC_TMR16B1->TCR = 0x02;//定时器复位LPC_TMR16B1->PR = 999; // 分频系数;LPC_TMR16B1->MCR = 2; // 设置MR0匹配后复位TC不产生中断;LPC_TMR16B1->MR0 = SystemCoreClock / 1000; // 定时1sLPC_TMR16B1->PWMC = 0x00;//设置MAT0不为PWM输出LPC_TMR16B1->EMR |= (3UL << 4);// MAT0外部匹配翻转LPC_TMR16B1->TCR = 0x01; //定时器启动
}void TIMER32_0_IRQHandler(void)//32位定时器0中断子程序
{static int duty = 0;if(LPC_TMR32B0->IR & 0x01)//判断是否MR0中断{LPC_TMR32B0->IR = 0x01; // 清除第一中断标志位duty += 1 * flag; // 更新占空比if(duty >= 100) {flag = -flag; // 递减 渐灭duty = 100; // 防止越界}if(duty <= 0) {flag = -flag; // 递增 渐亮duty = 1; // 防止越界}LPC_TMR16B1->MR0 = (uint32_t)(LPC_TMR16B1->MR3 * duty /100); // 设置占空比}
}
TIMER.h
#ifndef _TIMER_H_
#define _TIMER_H_#include <LPC11xx.h>void TMR32B0_Init(void);
void TMR16B1_Init(void);
void TMR16B1_PWM_Mode(void);
void TMR16B1_Blinky_Mode(void);#endif
main.c
#include <LPC11xx.h>
#include "LED.h"
#include "Button.h"
#include "TIMER.h"int main(void)
{Button_Init(); // Button初始化TMR16B1_Init(); //初始化16位B1定时器TMR32B0_Init(); // 初始化32位B0定时器TMR16B1_Blinky_Mode(); // 初始闪烁灯模式while (1){}
}
实验效果就是烧录后按下复位键,Blinky开始闪烁,按下Button是PWM,之后再按就会在两种模式之间切换。
相关文章:
五、定时器实现呼吸灯
5.1 定时器与计数器简介 定时器是一种通过对内部时钟脉冲计数来测量时间间隔的模块。它的核心是一个递增或递减的寄存器(计数器值)。如果系统时钟为 1 MHz,定时器每 1 μs 计数一次。 计数器是一种对外部事件(如脉冲信号ÿ…...
顺序打印数字的进一步理解
之前博客写了篇博文,面试时要求使用多线程顺序打印ABC循环20次,这是我当时使用join函数实现代码: public class TestABCJoin {public static void main(String[] args) {// 创建任务Runnable taskA () -> {for (int i 0; i < 5; i) …...
使用React和Material-UI构建TODO应用的前端UI
使用React和Material-UI构建TODO应用的前端UI 引言环境准备代码解析1. 导入必要的模块2. 创建React组件3. 定义函数3.1 获取TODO列表3.2 创建TODO项3.3 更新TODO项3.4 删除TODO项3.5 处理编辑点击事件3.6 关闭编辑对话框3.7 保存编辑内容 4. 使用Effect钩子5. 渲染组件 功能实现…...
开屏广告-跳过神器
给大家介绍一款超实用的软件——SKIP,它堪称李跳跳的最佳平替!这款软件已经在Github开源免费,完全无需担心内置源问题,也无需导入任何规则。安装完成后,即可直接使用,非常便捷! 首次打开软件时…...
bat脚本实现自动化漏洞挖掘
bat脚本 BAT脚本是一种批处理文件,可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务,如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nuc…...
如何运行Composer安装PHP包 安装JWT库
1. 使用Composer Composer是PHP的依赖管理工具,它允许你轻松地安装和管理PHP包。对于JWT,你可以使用firebase/php-jwt这个库,这是由Firebase提供的官方库。 安装Composer(如果你还没有安装的话): 访问Co…...
(回溯递归dfs 电话号码的字母组合 remake)leetcode 17
只找边界条件和非边界条件,剩下的交给数学归纳法就行,考虑子问题的重复性 [class Solution {vector<string>str { "","","abc","def","ghi","jkl","mno","pqrs"…...
it基础使用--5---git远程仓库
文章目录 it基础使用--5---git远程仓库1. 按顺序看2. 什么是远程仓库3. Gitee操作3.1 新建远程仓库3.2 远程操作基础命令3.3 查看当前所有远程地址别名 git remote -v3.4 创建远程仓库别名 git remote add 别名 远程地址3.4 推送本地分支到远程仓库 git push 别名 分支3.5 拉取…...
Git 的起源与发展
序章:版本控制的前世今生 在软件开发的漫长旅程中,版本控制犹如一位忠诚的伙伴,始终陪伴着开发者们。它的存在,解决了软件开发过程中代码管理的诸多难题,让团队协作更加高效,代码的演进更加有序。 简单来…...
c++提取矩形区域图像的梯度并拟合直线
c提取旋转矩形区域的边缘最强梯度点,并拟合直线 #include <opencv2/opencv.hpp> #include <iostream> #include <vector>using namespace cv; using namespace std;int main() {// 加载图像Mat img imread("image.jpg", IMREAD_GRAYS…...
【PyQt】超级超级笨的pyqt计算器案例
计算器 1.QT Designer设计外观 1.pushButton2.textEdit3.groupBox4.布局设计 2.加载ui文件 导入模块: sys:用于处理命令行参数。 QApplication:PyQt5 应用程序类。 QWidget:窗口基类。 uic:用于加载 .ui 文件。…...
每日一题——小根堆实现堆排序算法
小根堆实现堆排序算法 堆排序的基本思想堆排序的步骤 实现步骤1. 构建小根堆2. 删除最小元素并调整堆 C语言实现输出示例代码解释1. percolateDown 函数2. buildMinHeap 函数3. heapSort 函数4. printArray函数 排序过程详解步骤1:构建小根堆步骤2:删除堆…...
k8s集群
文章目录 项目描述项目环境系统与软件版本概览项目步骤 环境准备IP地址规划关闭selinux和firewall配置静态ip地址修改主机名添加hosts解析 项目步骤一、使用kubeadm安装k8s单master的集群环境(1个master2个node节点)1、互相之间建立免密通道2.关闭交换分…...
数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done....
技术架构师成长路线(2025版)
目录 通用知识 计算机原理(1 - 2 个月) 数据结构(2 - 3 个月) 网络编程(1 - 2 个月) 软件工程(1 个月) 基础知识 Java 编程语言基础(2 - 3 个月) JVM&…...
NetLify账号无法登录解决办法
本文收录在【建站】专栏内,专栏目录:【建站】专栏目录 用github账号登录时,说校验失败 Authentication Error Authenticating failed due to the following error: Your account requires additional verification. Please check your email…...
linux本地部署deepseek-R1模型
国产开源大模型追平甚至超越了CloseAI的o1模型,大国崛起时刻!!! DeepSeek R1 本地部署指南 在人工智能技术飞速发展的今天,本地部署AI模型成为越来越多开发者和企业关注的焦点。本文将详细介绍如何在本地部署DeepS…...
集合通讯概览
集合通信概览 (1)通信的算法 是根据通讯的链路组成的 (2)因为通信链路 跟硬件强相关,所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练:多维并行(xxx并行在上一期已经讲述…...
如何解决云台重力补偿?
如何解决云台重力补偿? 最近在调试步兵云台的时候,由于枪管、图传、摄像头等重力的原因,pitch轴的参数尤其难以调整,又不想抬升和降低使用两套不同的参数,所以使用了重力补偿,效果也是比较理想的,于是整理为一篇文章记录一下 一、问题根源:枪管重力在“搞事情” 想象…...
【LeetCode 刷题】回溯算法(4)-排列问题
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为回溯算法排列问题相关的题目解析。 文章目录 46.全排列47.全排列 II 46.全排列 题目链接 class Solution:def permute(self, nums: List[int]) -> List[List[int]]:res, path [], []used [0] * len(n…...
FPGA|IP核PLL调用测试:建立工程
闲来无事,测试下FPGA的IP核调用 一、生成工程 1、打开软件新建工程 2、命名为PLL_test 3、选择芯片型号 4、生成工程如图...
数据的表示和运算
一-定点数的表示 1-定点数和浮点数 定点数:小数点的位置固定(常规计数) 浮点数:小数点的位置不固定(科学计数法) 2-定点数的表示 ①无符号数 整个机器字长的全部二进制位均为数值位,没有符号…...
文字显示省略号
多行文本溢出显示省略号...
22.Word:小张-经费联审核结算单❗【16】
目录 NO1.2 NO3.4 NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件,而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右:页边距→页码范围:多页:拼页光标处于→布局→分隔符:分节符…...
鲸鱼算法 matlab pso
算法原理 鲸鱼优化算法的核心思想是通过模拟座头鲸的捕食过程来进行搜索和优化。座头鲸在捕猎时会围绕猎物游动并产生气泡网,迫使猎物聚集。这一行为被用来设计搜索策略,使算法能够有效地找到全局最优解。 算法步骤 初始化:随机生成一…...
c++之模板进阶
在前面的文章中,我们已经简单的了解了模板的使用,在这篇文章中,我们将继续深入探讨模板 1.模板的特化 1.1 概念 通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果&a…...
C语言中的信号量
信号是操作系统中用来传递特定消息的机制。操作系统可以使用这种方式将程序运行过程中发生的各类特殊情况发送给程序,并按照其指定的逻辑进行处理。信号名称都以 “SIG” 作为前缀,如程序访问非法内存时,会产生名为 SIGSEGV 的信号。 程序需…...
AI主流大模型介绍和API价格比较
主流的大模型系列 ###1. OpenAI: GPT-4,GPT-4 Turbo, GPT-4o OpenAI 的介绍: 全称:Open Artificial Intelligence,简称OpenAI。性质:起初为非营利性组织,后转变为由营利性公司OpenAI LP及非营…...
自主Shell命令行解释器
什么是命令行 我们一直使用的"ls","cd","pwd","mkdir"等命令,都是在命令行上输入的,我们之前对于命令行的理解: 命令行是干啥的?是为我们做命令行解释的。 命令行这个东西实际上是我们…...
git笔记-简单入门
git笔记 git是一个分布式版本控制系统,它的优点有哪些呢?分为以下几个部分 与集中式的版本控制系统比起来,不用担心单点故障问题,只需要互相同步一下进度即可。支持离线编辑,每一个人都有一个完整的版本库。跨平台支持…...
重新刷题求职2-DAY1
DAY1 1.704. 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 最普通的二分查找,查用的习惯左闭右…...
浅析DDOS攻击及防御策略
DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…...
路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)
鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…...
SwiftUI 在 Xcode 预览修改视图 FetchedResults 对象的属性时为什么会崩溃?
概览 从 SwiftUI 诞生那天起,让秃头码农们又爱又恨的 Xcode 预览就在界面调试中扮演了及其重要的角色。不过,就是这位撸码中的绝对主角却尝尝在关键时刻“掉链子”。 比如当修改 SwiftUI 视图中 FetchedResults 对象的属性时,Xcode 预览可能…...
pytorch实现基于Word2Vec的词嵌入
PyTorch 实现 Word2Vec(Skip-gram 模型) 的完整代码,使用 中文语料 进行训练,包括数据预处理、模型定义、训练和测试。 1. 主要特点 支持中文数据,基于 jieba 进行分词 使用 Skip-gram 进行训练,适用于小数…...
MVC 文件夹:架构之美与实际应用
MVC 文件夹:架构之美与实际应用 引言 MVC(Model-View-Controller)是一种设计模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式不仅提高了代码的可维护性和可扩展性,而且使得开发流程更加清晰。本文将深入探讨MVC文…...
Python在线编辑器
from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...
The Simulation技术浅析(四):随机数生成
随机数生成技术 是 The Simulation 中的核心组成部分,广泛应用于蒙特卡洛模拟、密码学、统计建模等领域。随机数生成技术主要分为 伪随机数生成器(PRNG,Pseudo-Random Number Generator) 和 真随机数生成器(TRNG,True Random Number Generator)。 1. 伪随机数生成器(PR…...
centos stream 9 安装 libstdc++-static静态库
yum仓库中相应的镜像源没有打开,libstdc-static在CRB这个仓库下,但是查看/etc/yum.repos.d/centos.repo,发现CRB镜像没有开启。 解决办法 如下图开启CRB镜像, 然后执行 yum makecache yum install glibc-static libstdc-static…...
Java自定义IO密集型和CPU密集型线程池
文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…...
Shell $0
个人博客地址:Shell $0 | 一张假钞的真实世界 我们已经知道在Shell中$0表示Shell脚本的文件名,但在有脚本调用的情形中,子脚本中的$0会是什么值呢?我们通过下面的实例来看。 已测试系统列表: Mac OS X EI Capitan 1…...
C++ Primer 标准库类型string
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
51c嵌入式~电路~合集25
我自己的原文哦~ https://blog.51cto.com/whaosoft/13241709 一、“开关电源”和“普通电源”的区别 什么叫开关电源 随着电力电子技术的发展和创新,使得开关电源技术也在不断地创新。目前,开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电…...
Vue3学习笔记-Vue开发前准备-1
一、安装15.0或更高版本的Node.js node -v npm -v 二、创建Vue项目 npm init vuelatest 三、Vue项目结构 node_modules: Vue项目运行的依赖文件public:资源文件夹package.json:信息描述文件...
架构技能(四):需求分析
需求分析,即分析需求,分析软件用户需要解决的问题。 需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。 决定架构的是软件的所有需求吗?肯定不是,真正决定架构…...
51单片机 05 矩阵键盘
嘻嘻,LCD在RC板子上可以勉强装上,会有一点歪。 一、矩阵键盘 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式;采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。…...
服务SDK三方新版中央仓库和私服发布详解
预备信息Github仓库发布Gradle版本匹配Gradle项目构建全局变量定义Gradle项目Nexus仓库配置与发布过程Gradle项目发布至Sonatype中央仓库配置过程总结当我们在实现一个项目技术总结、工具类封装或SDK封装,通常是为了方便开发者使用特定服务或平台而提供的一组工具和API。您可能…...
jmeter响应数据编码设置
jmeter响应数据编码设置 如果查看结果树的响应数据存在中文乱码,可以尝试以下方法: 1、找到jmeter的bin目录下的 jmeter.properties 文件,修改如下配置: 去掉sampleresult.default.encodingUTF-8前面的#号 2、保存文件后&#x…...
FPGA学习篇——开篇之作
今天正式开始学FPGA啦,接下来将会编写FPGA学习篇来记录自己学习FPGA 的过程! 今天是大年初六,简单学一下FPGA的相关概念叭叭叭! 一:数字系统设计流程 一个数字系统的设计分为前端设计和后端设计。在我看来࿰…...
Leetcode:680
1,题目 2,思路 首先就是判断它不发生改变会不会是回文如果不是回文,那么俩个指针从前往后与从后往前做对比如果俩字符不同,那就俩种选择,一种是保留前面的字符去掉后面字符,另一种是其反然后俩种选择只要满…...