Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录

概述

1  General PWM介绍

1.1 特性

1.2 定时器选择注意点

2 时钟配置

3 应用案例

3.1 基本定时器应用

3.2 定时器回调函数案例

3.3 输入捕捉功能案例

3.4 更新周期案例

3.5 更新占空比案例

3.6 单次触发脉冲案例

4 测试

4.1 代码介绍

4.2 验证


概述

本文主要介绍Renesas R7FA8D1BH (Cortex®-M85)的 General PWM各种模式的使用方法,包括PWM的特性介绍,并编写多个案例,详细介绍了各种模式下API函数的使用方法,还编写一个具体的案例,实现PWM的输出,并使用逻辑分析仪捕捉器波形。

1  General PWM介绍

1.1 特性

GPT模块可用于计数事件,测量外部输入信号,产生周期性中断,或输出周期性或PWM信号到GTIOC引脚。该模块支持GPT外设GPT32EH、GPT32E、GPT32和GPT16。GPT16是一个16位定时器。其他外设(GPT32EH、GPT32E和GPT32)是32位定时器。从API的角度来看,这个模块中的32位计时器都是一样的。

GPT模块具有以下特点:

1)支持周期模式、单次模式和PWM模式。
2)支持计数源的PCLK, gtegg引脚,GTIOC引脚,或ELC事件。
3)支持GTIOC引脚上的脱波滤波器。
4)信号可以输出到一个引脚。
5)可配置周期(每个计时器周期的计数)。
6)可配置占空比PWM模式。
7)支持运行时周期的重新配置。
8)支持在PWM模式下运行时重构占空比。
9)支持运行时比较匹配值的重新配置。
10)提供了用于启动、停止和重置计数器的api。
11)提供api来获取当前周期、源时钟频率和计数方向。
12)提供api来获取当前定时器状态和计数器值。
13)支持启动、停止、清除、向上计数、向下计数,并通过外部源从gtegg引脚、GTIOC引脚或ELC事件捕获。
14)支持对称和非对称PWM波形生成。
15)支持一次同步脉冲波形生成。
16)支持自动添加死区时间。
17)支持生成ELC事件,以比较匹配值启动ADC扫描(参见事件链接控制器(r_elc))并更新比较匹配值。
18)支持与POEG通道连接,当检测到错误条件时自动禁用GPT输出。
19)支持定时器停止时设置计数器值。
20)支持启用和禁用输出引脚。
21)支持一次跳过最多七个溢出/下流(波峰/波谷)中断
22)支持通过配置引脚的输出电平在每个比较匹配和周期结束产生自定义PWM波形。

1.2 定时器选择注意点

RA mcu有两个定时器外设:通用PWM定时器(GPT)和异步通用定时器(AGT)。在他们之间进行选择时,要考虑以下因素:

GPTAGT
Low Power ModesThe GPT can operate in sleep mode.The AGT can operate in all low power modes.
Available ChannelsThe number of GPT channels is device specific. All currently supported MCUs have at least 7 GPT channels.All MCUs have 2 AGT channels.
Timer ResolutionAll MCUs have at least one 32-bit GPT timer.The AGT timers are 16-bit timers.
Clock SourceThe GPT runs off PCLKD with a configurable divider up to 1024. It can also be configured to count ELC events or external pulses.The AGT runs off PCLKB, LOCO, or subclock.

2 时钟配置

GPT时钟基于PCLKD频率。您可以使用RA Configuration编辑器的Clocks选项卡或在运行时使用CGC接口来设置PCLKD频率。

该模块可以使用GTETRGA、GTETRGB、GTETRGC、GTETRGD、GTIOCA和GTIOCB引脚作为计数源。该模块可以使用GTIOCA和GTIOCB引脚作为周期性或PWM信号的输出引脚。该模块可以使用GTIOCA和GTIOCB作为输入引脚来测量输入信号。

3 应用案例

3.1 基本定时器应用

这是在应用程序中最少使用GPT的一个基本示例。

void gpt_basic_example (void)
{fsp_err_t err = FSP_SUCCESS;/* Initializes the module. */err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Start the timer. */(void) R_GPT_Start(&g_timer0_ctrl);
}

3.2 定时器回调函数案例

定时器回调函数的应用案例,范例代码如下:

/* Example callback called when timer expires. */
void timer_callback (timer_callback_args_t * p_args)
{if (TIMER_EVENT_CYCLE_END == p_args->event){/* Add application code to be called periodically here. */}
}

3.3 输入捕捉功能案例

这是一个使用GPT捕获脉冲宽度或脉冲周期测量的例子。

/* Example callback called when a capture occurs. */
uint64_t g_captured_time     = 0U;
uint32_t g_capture_overflows = 0U;
void timer_capture_callback (timer_callback_args_t * p_args)
{if ((TIMER_EVENT_CAPTURE_A == p_args->event) || (TIMER_EVENT_CAPTURE_B == p_args->event)){/* (Optional) Get the current period if not known. */timer_info_t info;(void) R_GPT_InfoGet(&g_timer0_ctrl, &info);uint64_t period = info.period_counts;/* The maximum period is one more than the maximum 32-bit number, but will be reflected as 0 in* timer_info_t::period_counts. */if (0U == period){period = UINT32_MAX + 1U;}g_captured_time     = (period * g_capture_overflows) + p_args->capture;g_capture_overflows = 0U;}if (TIMER_EVENT_CYCLE_END == p_args->event){/* An overflow occurred during capture. This must be accounted for at the application layer. */g_capture_overflows++;}
}
void gpt_capture_example (void)
{fsp_err_t err = FSP_SUCCESS;/* Initializes the module. */err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Enable captures. Captured values arrive in the interrupt. */(void) R_GPT_Enable(&g_timer0_ctrl);/* (Optional) Disable captures. */(void) R_GPT_Disable(&g_timer0_ctrl);
}

3.4 更新周期案例

#define GPT_EXAMPLE_MSEC_PER_SEC           (1000)
#define GPT_EXAMPLE_DESIRED_PERIOD_MSEC    (20)
/* This example shows how to calculate a new period value at runtime. */
void gpt_period_calculation_example (void)
{fsp_err_t err = FSP_SUCCESS;/* Initializes the module. */err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Start the timer. */(void) R_GPT_Start(&g_timer0_ctrl);/* Get the source clock frequency (in Hz). There are 3 ways to do this in FSP:*  - If the PCLKD frequency has not changed since reset, the source clock frequency is*    BSP_STARTUP_PCLKD_HZ >> timer_cfg_t::source_div*  - Use the R_GPT_InfoGet function (it accounts for the divider).*  - Calculate the current PCLKD frequency using R_FSP_SystemClockHzGet(FSP_PRIV_CLOCK_PCLKD) and right shift*    by timer_cfg_t::source_div.** This example uses the 3rd option (R_FSP_SystemClockHzGet).*/uint32_t pclkd_freq_hz = R_FSP_SystemClockHzGet(FSP_PRIV_CLOCK_PCLKD) >> g_timer0_cfg.source_div;/* Calculate the desired period based on the current clock. Note that this calculation could overflow if the* desired period is larger than UINT32_MAX / pclkd_freq_hz. A cast to uint64_t is used to prevent this. */uint32_t period_counts =(uint32_t) (((uint64_t) pclkd_freq_hz * GPT_EXAMPLE_DESIRED_PERIOD_MSEC) / GPT_EXAMPLE_MSEC_PER_SEC);/* Set the calculated period. */err = R_GPT_PeriodSet(&g_timer0_ctrl, period_counts);assert(FSP_SUCCESS == err);
}

3.5 更新占空比案例


#define GPT_EXAMPLE_DESIRED_DUTY_CYCLE_PERCENT    (25)
#define GPT_EXAMPLE_MAX_PERCENT                   (100)
/* This example shows how to calculate a new duty cycle value at runtime. */
void gpt_duty_cycle_calculation_example (void)
{fsp_err_t err = FSP_SUCCESS;/* Initializes the module. */err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Start the timer. */(void) R_GPT_Start(&g_timer0_ctrl);/* Get the current period setting. */timer_info_t info;(void) R_GPT_InfoGet(&g_timer0_ctrl, &info);uint32_t current_period_counts = info.period_counts;/* Calculate the desired duty cycle based on the current period. Note that if the period could be larger than* UINT32_MAX / 100, this calculation could overflow. A cast to uint64_t is used to prevent this. The cast is* not required for 16-bit timers. */uint32_t duty_cycle_counts =(uint32_t) (((uint64_t) current_period_counts * GPT_EXAMPLE_DESIRED_DUTY_CYCLE_PERCENT) /GPT_EXAMPLE_MAX_PERCENT);/* Set the calculated duty cycle. */err = R_GPT_DutyCycleSet(&g_timer0_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);assert(FSP_SUCCESS == err);
}

3.6 单次触发脉冲案例

/* Example callback called when timer overflows. */
void gpt_overflow_callback (timer_callback_args_t * p_args)
{if (TIMER_EVENT_CYCLE_END == p_args->event){/* Use R_GPT_DutyCycleSet() API to set new values for each cycle.* - Use GPT_IO_PIN_ONE_SHOT_LEADING_EDGE to set the leading edge transition match value (GTCCRC or GTCCRE register).* - Use GPT_IO_PIN_ONE_SHOT_TRAILING_EDGE to set the trailing edge transition match value (GTCCRD or GTCCRF register).*/}
}
#define GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRD_GTCCRF    (0x1000U)
#define GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRC           (0x800U)
#define GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRE           (0x100U)
void gpt_one_shot_pulse_mode_example (void)
{fsp_err_t err = FSP_SUCCESS;/* Initializes the module. */err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Set the duty cycle for One-Shot-Pulse mode *//* GPT_IO_PIN_ONE_SHOT_LEADING_EDGE sets the initial value for the GTCCRC register if GTIOCnA is the selected pin for output. */err = R_GPT_DutyCycleSet(&g_timer0_ctrl,GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRC,GPT_IO_PIN_GTIOCA | GPT_IO_PIN_ONE_SHOT_LEADING_EDGE);assert(FSP_SUCCESS == err);/* GPT_IO_PIN_ONE_SHOT_LEADING_EDGE sets the initial value for the GTCCRE register if GTIOCnB is the selected pin for output. */err = R_GPT_DutyCycleSet(&g_timer0_ctrl,GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRE,GPT_IO_PIN_GTIOCB | GPT_IO_PIN_ONE_SHOT_LEADING_EDGE);assert(FSP_SUCCESS == err);/* GPT_IO_PIN_ONE_SHOT_TRAILING_EDGE sets the initial value for the GTCCRD register if GTIOCnA is the selected pin for output. */err = R_GPT_DutyCycleSet(&g_timer0_ctrl,GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRD_GTCCRF,GPT_IO_PIN_GTIOCA | GPT_IO_PIN_ONE_SHOT_TRAILING_EDGE);assert(FSP_SUCCESS == err);/* GPT_IO_PIN_ONE_SHOT_TRAILING_EDGE sets the initial value for the GTCCRF register if GTIOCnB is the selected pin for output.* GPT_BUFFER_FORCE_PUSH pushes set values to temporary registers to prepare for the initial output cycle. This must be done* when setting the duty cycle before starting the timer. */err = R_GPT_DutyCycleSet(&g_timer0_ctrl,GPT_ONE_SHOT_EXAMPLE_DUTY_CYCLE_GTCCRD_GTCCRF,GPT_IO_PIN_GTIOCB | GPT_IO_PIN_ONE_SHOT_TRAILING_EDGE | GPT_BUFFER_FORCE_PUSH);assert(FSP_SUCCESS == err);/* Start the timer. */(void) R_GPT_Start(&g_timer0_ctrl);/* (Optional) Stop the timer. */(void) R_GPT_Stop(&g_timer0_ctrl);
}
GPT Compare Match Set Example
This example demonstrates the configuration and use of compare match with GPT timer./* Example callback called when compare match occurs. */
void gpt_compare_match_callback (timer_callback_args_t * p_args)
{if (TIMER_EVENT_COMPARE_A == p_args->event){/* Add application code to be called periodically here. */}
}
#define GPT_COMPARE_MATCH_EXAMPLE_VALUE    (0x2000U)
void gpt_compare_match_set_example (void)
{fsp_err_t err = FSP_SUCCESS;/* Initializes the module. */err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);/* Set the compare match value (GPT_COMPARE_MATCH_EXAMPLE_VALUE). This value must be less than or equal to period value. */err = R_GPT_CompareMatchSet(&g_timer0_ctrl, GPT_COMPARE_MATCH_EXAMPLE_VALUE, TIMER_COMPARE_MATCH_A);assert(FSP_SUCCESS == err);/* Start the timer. */(void) R_GPT_Start(&g_timer0_ctrl);/* (Optional) Stop the timer. */(void) R_GPT_Stop(&g_timer0_ctrl);
}

4 测试

4.1 代码介绍

编写一个Demo实现4路PWM信号输出,其详细代码如下:

 /*FILE NAME  :  bsp_pwm.cDescription:  pwm interfaceAuthor     :  tangmingfei2013@126.comDate       :  2024/06/03*/
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "bsp_pwm.h"
#include "hal_data.h"void GPT_PWM_SetDuty3(uint8_t duty, uint32_t pin);
void GPT_PWM_SetDuty2(uint8_t duty, uint32_t pin);
void GPT_PWM_SetDuty1(uint8_t duty, uint32_t pin);void pwm_init( void )
{// timer 1   GPT_IO_PIN_GTIOCAR_GPT_Open(&g_timer1_ctrl, &g_timer1_cfg);R_GPT_Start(&g_timer1_ctrl);/* Set the calculated duty cycle. */GPT_PWM_SetDuty1(60, GPT_IO_PIN_GTIOCA);// timer 2   GPT_IO_PIN_GTIOCBR_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg);R_GPT_Start(&g_timer2_ctrl);// set duty GPT_PWM_SetDuty2(80, GPT_IO_PIN_GTIOCB); // timer 6   GPT_IO_PIN_GTIOCA & GPT_IO_PIN_GTIOCBR_GPT_Open(&g_timer3_ctrl, &g_timer3_cfg);R_GPT_Start(&g_timer3_ctrl);// set duty GPT_PWM_SetDuty3( 50, GPT_IO_PIN_GTIOCA);// set duty GPT_PWM_SetDuty3( 20, GPT_IO_PIN_GTIOCB);
}void GPT_PWM_SetDuty3(uint8_t duty, uint32_t pin)
{fsp_err_t  err;timer_info_t info;uint32_t current_period_counts;uint32_t duty_cycle_counts;if (duty > 100)duty = 100; R_GPT_InfoGet(&g_timer3_ctrl, &info);current_period_counts = info.period_counts;duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);err = R_GPT_DutyCycleSet(&g_timer3_ctrl, duty_cycle_counts, pin);assert(FSP_SUCCESS == err);
}void GPT_PWM_SetDuty2(uint8_t duty, uint32_t pin)
{fsp_err_t  err;timer_info_t info;uint32_t current_period_counts;uint32_t duty_cycle_counts;if (duty > 100)duty = 100; R_GPT_InfoGet(&g_timer2_ctrl, &info);current_period_counts = info.period_counts;duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);err = R_GPT_DutyCycleSet(&g_timer2_ctrl, duty_cycle_counts, pin);assert(FSP_SUCCESS == err);
}void GPT_PWM_SetDuty1(uint8_t duty, uint32_t pin)
{fsp_err_t  err;timer_info_t info;uint32_t current_period_counts;uint32_t duty_cycle_counts;if (duty > 100)duty = 100; R_GPT_InfoGet(&g_timer1_ctrl, &info);current_period_counts = info.period_counts;duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);err = R_GPT_DutyCycleSet(&g_timer1_ctrl, duty_cycle_counts, pin);assert(FSP_SUCCESS == err);
}/* End of this file */

4.2 验证

编译和下载代码到板卡中,运行结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

算法练习题25——leetcode3279统计重新排列后包含另一个字符串的子字符串的数目(滑动窗口 双指针 哈希)

题目描述 解题思路 本题用到了滑动窗口 双指针 哈希 刚开始我是没读懂题的因为我笨 我想把我的思路说一下 左端不轻易缩小 只有找到跟word2匹配了 比如说abbcdd 遍历到c的时候才能匹配这个word2 对吧 那么之后加上以一个d或者俩d 都符合了 然后我们算完了 才能缩小左端 扩大…

python爬虫案例——异步加载网站数据抓取,post请求(6)

文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…

STM32篇:按键点亮LED灯

输入&#xff08;按键&#xff09;&#xff1a;KEY1---PA0 KEY2---PA1 输出&#xff08;LED灯&#xff09;&#xff1a;LED1---PB8 LED2---PB9

【M-LOAM学习】

M-LOAM(INITIALIZATION) Article Analysis Scan-Based Motion Estimation 通过在consecutive frame (each LiDAR)&#xff08;因为omp parallel&#xff09;中寻找correspondences然后通过最小化所有考虑feature之间residual error的transformation between frame to frame 针…

(done) 声音信号处理基础知识(7) (Understanding Time Domain Audio Features)

参考&#xff1a;https://www.youtube.com/watch?vSRrQ_v-OOSg&t1s 时域特征包括&#xff1a; 1.幅度包络 2.均方根能量 3.过零率 振幅包络的定义&#xff1a;一个 frame 里&#xff0c;所有采样点中最大的振幅值 一个形象的关于振幅包络的可视化解释如下&#xff1a;…

MateBook 16s 2023在Deepin下开启性能模式,调节风扇转速到最大,全网首发!

方法 在Deepin下按住Fnp快捷键&#xff0c;开启性能模式。 验证 首先去debian下载acpi-call-dkms https://packages.debian.org/sid/all/acpi-call-dkms/download 然后使用root用户执行&#xff1a; apt install --simulate ./acpi-call-dkms_1.2.2-2.1_all.deb apt inst…

C++入门——(类的默认成员函数)析构函数

文章目录 一、析构函数二、析构函数的特点总结 一、析构函数 析构函数与构造函数功能相反&#xff0c;析构函数不是完成对对象本⾝的销毁&#xff0c;⽐如局部对象是存在栈帧的&#xff0c;函数结束栈帧销毁&#xff0c;他就释放了&#xff0c;不需要我们管&#xff0c;C规定对…

【ChatGPT】提示词助力广告文案、PPT制作与书籍推荐的高效新模式

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;高效广告推销文案提示词使用方法 &#x1f4af;AI自动生成PPT全流程提示词使用方法 &#x1f4af;精选书籍推荐爆款文案提示词使用方法 &#x1f4af;小结 &#x1f4af;…

第一个NDK项目

新建项目 选择Native C的项目&#xff0c;我这里给项目的命名是NDKTest。 目录分析 新增了一个cpp目录&#xff0c;里面有一个CMakeLists和.cpp文件。 CMakeLists 文件是用来配置C编译过程的。 # Sets the minimum CMake version required for this project. cmake_minimum_…

【解密 Kotlin 扩展函数】命名参数和默认值(十三)

导读大纲 1.0.1 命名参数1.0.2 默认参数值 上一节讲述如何自定义 joinToString 函数来代替集合的默认字符串表示 文末遗留下几个待优化问题–传送门 1.0.1 命名参数 我们要解决的第一个问题涉及函数调用的可读性 例如,请看下面的joinToString调用: joinToString(collection,&…

循环中用sleep

echo <pre>;for ($i0;$i<10000000;$i){var_dump($i);} 没有用sleep,快速消耗cpu和内存 使用sleep后效果 echo <pre>;for ($i0;$i<10000000;$i){var_dump($i);usleep(1000);//php 暂停0.001秒} 总结&#xff1a;sleep能释放资源(cpu和内存)&#xff0c;但是运…

2025校招内推-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…

LeetCode 面试经典150题 191.位1的个数

Java中的算术右移和逻辑右移的区别 题目&#xff1a;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数&#xff08;也被称为汉明重量&#xff09;。 设置位的个数即二进制中1的个数。 思路&#xff1a;方法一&#xff1a;因为正数的原…

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机&#xff08;PMSM&#xff09;】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…

java反射基础知识

1.java的反射机制 Java 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射…

学生管理系统1.0版本

学生管理系统1.0版本有5个功能&#xff0c;即添加学生、删除学生、修改学生、查看全部学生、退出系统。 里面对添加重复学号、删除和修改不存在的学号等问题都有相应的解决办法。 代码区&#xff1a; Student.java package student;//快捷键Altinsert public class Student …

Machine Learning Specialization 学习笔记(4)

文章目录 前言一、模型评估训练集常规训练集线性回归逻辑回归 交叉验证集 偏差与方差正则化 学习曲线数据集的添加&#xff08;数据增强&#xff09;迁移学习精确率与召回率 二、决策树基本概念决策树的工作原理决策树的优点决策树的缺点决策树算法的变体决策树在Python中的实现…

Shell 脚本学习

Shell学习 Shell 脚本 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…

ArcGIS核密度分析(栅格处理范围与掩膜分析)

多时候我们在进行栅格分析的时候&#xff0c;处理的结果不能完全覆盖我们需要的范围。 比如&#xff0c;我们对点数据进行密度分析、栅格插值等。比如下图 为什么会如此呢&#xff1f; 那是因为在做这个密度分析或者栅格插值的时候&#xff0c;默认是以点的四至范围来生成的&am…