Smart210学习记录(六) 之中断

2023-10-08 16:40
文章标签 学习 记录 中断 smart210

本文主要是介绍Smart210学习记录(六) 之中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、向量中断控制器
    • 1、概述
    • 2、关键特性
    • 3、注意
  • 二、寄存器
  • 三、中断参考程序

 
 
 

一、向量中断控制器

1、概述

  主要有4个VIC,4个TZIC还有一个很特殊的ARM PrimeCell PL192。主要的VIC和TZIC可以支持93个中断源。其中TZIC是为TrustZone技术所准备的,ARM TrustZone® 技术是系统范围的安全方法,针对高性能计算平台上的大量应用,包括安全支付、数字版权管理 (DRM)、企业服务和基于 Web 的服务(援引官方的介绍)。TZIC提供了安全控制的nFIQ中断并且使该这类中断从传统的不安全中断VIC中屏蔽掉,从而达到应用在数据传输时的安全性和保密性。

2、关键特性

  • Supports 93 vectored IRQ interrupts (支持93个矢量IRQ中断)
  • Fixed hardware interrupts priority levels (固定硬件中断优先级)
  • Programmable interrupt priority levels (可编程中断优先级)
  • Supports Hardware interrupt priority level masking (支持硬件中断优先级的屏蔽)
  • Programmable interrupt priority level masking (可编程中断优先级屏蔽)
  • Generates IRQ and FIQ (产生IRQ和FIQ)
  • Generates Software interrupt (产生软件中断)
  • Test registers
  • Raw interrupt status (原中断状态,就是设置使能,屏蔽寄存器之前的各中断状态)
  • nterrupt request status (中断请求状态)
  • Supports Privileged mode for restricted access(支持限制访问特权模式)

3、注意

  当用户清除中断挂起时,用户必须将0写入所有的vicaddress(VIC0ADDRESS, VIC1ADDRESS, VIC2ADDRESS, and VIC3ADDRESS)。

 

二、寄存器

各中断寄存器请参考s5pv320用户手册。

 

三、中断参考程序

.global _start
.global IRQ_handle_start:// 关闭看门狗ldr r0, =0xE2700000        mov r1, #0str r1, [r0]// 设置栈,以便调用c函数ldr sp, =0x40000000    // 开中断mov r0, #0x53          msr CPSR_cxsf, r0  // 汇编初始化时钟     bl clock_init  // 调用main函数bl mainIRQ_handle:// 设置中断模式的栈ldr sp, =0xD0037F80// 保存现场sub lr, lr, #4             stmfd sp!, {r0-r12, lr}// 跳转到中断处理函数bl  irq_handler    // 恢复现场ldmfd sp!, {r0-r12, pc}^

  首先,关闭看门狗,设置栈,开中断,设置时钟,,,当一个中断源(不是一个中断)发生时执行中断服务程序IRQ_handle,设置中断模式的栈, 保存现场,跳转到中断处理函(irq_handler),中断处理函数首先判断是哪个中断组发生中断,然后进入相应的中断处理子程序(irq_xxx),在事先我们要设置中断处理子程序irq_xxx(如irq_key)在地址VICxVECTADDRx中,,,当有中断发生时,硬件上会将当前中断的中断处理子程序从寄存器 VICxVECTADDxR 自动拷贝到寄存器VICADDR 中,所以我们在 irq_handler()函数里会调用保存在寄存器 VICDDR 里的中断处理函数即可。

  一个中断组有32个中断源,为什么我们可以直接运行中断组的VICxINTADDR指定的函数而无需知道是具体哪个中断源触发了中断呢?这是由于中断组内的中断源在触发中断后硬件会自动把对应中断源的处理函数入口地址赋给所属组的VICADDR,这样我们就能省去检索中断源再跳转到对应中断函数入口的时间了,当然,前提是我们要把【按键中断】的服务程序入口地址赋给某个对应的寄存器(假设是VIC0INTADDR12,所属组是VIC0组,所对应入口是VIC0INTADDR)。 这一段真的有点难懂,需要花点时间

 
四、测试源码
int.c

#include "int.h"
#include "stdio.h" Interrupt
#define VIC0_BASE                   (0xF2000000)
#define VIC1_BASE                   (0xF2100000)
#define VIC2_BASE                   (0xF2200000)
#define VIC3_BASE                   (0xF2300000)// VIC0
#define     VIC0IRQSTATUS           ( *((volatile unsigned long *)(VIC0_BASE + 0x00)) )
#define     VIC0FIQSTATUS           ( *((volatile unsigned long *)(VIC0_BASE + 0x04)) )
#define     VIC0RAWINTR             ( *((volatile unsigned long *)(VIC0_BASE + 0x08)) )
#define     VIC0INTSELECT           ( *((volatile unsigned long *)(VIC0_BASE + 0x0c)) )
#define     VIC0INTENABLE           ( *((volatile unsigned long *)(VIC0_BASE + 0x10)) )
#define     VIC0INTENCLEAR          ( *((volatile unsigned long *)(VIC0_BASE + 0x14)) )
#define     VIC0SOFTINT             ( *((volatile unsigned long *)(VIC0_BASE + 0x18)) )
#define     VIC0SOFTINTCLEAR        ( *((volatile unsigned long *)(VIC0_BASE + 0x1c)) )
#define     VIC0PROTECTION          ( *((volatile unsigned long *)(VIC0_BASE + 0x20)) )
#define     VIC0SWPRIORITYMASK      ( *((volatile unsigned long *)(VIC0_BASE + 0x24)) )
#define     VIC0PRIORITYDAISY       ( *((volatile unsigned long *)(VIC0_BASE + 0x28)) )
#define     VIC0VECTADDR            (VIC0_BASE + 0x100)
#define     VIC0VECPRIORITY         ( *((volatile unsigned long *)(VIC0_BASE + 0x200)) )
#define     VIC0ADDR                ( *((volatile unsigned long *)(VIC0_BASE + 0xf00)) )
#define     VIC0PERID0              ( *((volatile unsigned long *)(VIC0_BASE + 0xfe0)) )
#define     VIC0PERID1              ( *((volatile unsigned long *)(VIC0_BASE + 0xfe4)) )
#define     VIC0PERID2              ( *((volatile unsigned long *)(VIC0_BASE + 0xfe8)) )
#define     VIC0PERID3              ( *((volatile unsigned long *)(VIC0_BASE + 0xfec)) )
#define     VIC0PCELLID0            ( *((volatile unsigned long *)(VIC0_BASE + 0xff0)) )
#define     VIC0PCELLID1            ( *((volatile unsigned long *)(VIC0_BASE + 0xff4)) )
#define     VIC0PCELLID2            ( *((volatile unsigned long *)(VIC0_BASE + 0xff8)) )
#define     VIC0PCELLID3            ( *((volatile unsigned long *)(VIC0_BASE + 0xffc)) )// VIC1
#define     VIC1IRQSTATUS           ( *((volatile unsigned long *)(VIC1_BASE + 0x00)) )
#define     VIC1FIQSTATUS           ( *((volatile unsigned long *)(VIC1_BASE + 0x04)) )
#define     VIC1RAWINTR             ( *((volatile unsigned long *)(VIC1_BASE + 0x08)) )
#define     VIC1INTSELECT           ( *((volatile unsigned long *)(VIC1_BASE + 0x0c)) )
#define     VIC1INTENABLE           ( *((volatile unsigned long *)(VIC1_BASE + 0x10)) )
#define     VIC1INTENCLEAR          ( *((volatile unsigned long *)(VIC1_BASE + 0x14)) )
#define     VIC1SOFTINT             ( *((volatile unsigned long *)(VIC1_BASE + 0x18)) )
#define     VIC1SOFTINTCLEAR        ( *((volatile unsigned long *)(VIC1_BASE + 0x1c)) )
#define     VIC1PROTECTION          ( *((volatile unsigned long *)(VIC1_BASE + 0x20)) )
#define     VIC1SWPRIORITYMASK      ( *((volatile unsigned long *)(VIC1_BASE + 0x24)) )
#define     VIC1PRIORITYDAISY       ( *((volatile unsigned long *)(VIC1_BASE + 0x28)) )
#define     VIC1VECTADDR            (VIC1_BASE + 0x100)
#define     VIC1VECPRIORITY         ( *((volatile unsigned long *)(VIC1_BASE + 0x200)) )
#define     VIC1ADDR                ( *((volatile unsigned long *)(VIC1_BASE + 0xf00)) )
#define     VIC1PERID0              ( *((volatile unsigned long *)(VIC1_BASE + 0xfe0)) )
#define     VIC1PERID1              ( *((volatile unsigned long *)(VIC1_BASE + 0xfe4)) )
#define     VIC1PERID2              ( *((volatile unsigned long *)(VIC1_BASE + 0xfe8)) )
#define     VIC1PERID3              ( *((volatile unsigned long *)(VIC1_BASE + 0xfec)) )
#define     VIC1PCELLID0                ( *((volatile unsigned long *)(VIC1_BASE + 0xff0)) )
#define     VIC1PCELLID1                ( *((volatile unsigned long *)(VIC1_BASE + 0xff4)) )
#define     VIC1PCELLID2                ( *((volatile unsigned long *)(VIC1_BASE + 0xff8)) )
#define     VIC1PCELLID3                ( *((volatile unsigned long *)(VIC1_BASE + 0xffc)) )// VIC2
#define     VIC2IRQSTATUS           ( *((volatile unsigned long *)(VIC2_BASE + 0x00)) )
#define     VIC2FIQSTATUS           ( *((volatile unsigned long *)(VIC2_BASE + 0x04)) )
#define     VIC2RAWINTR             ( *((volatile unsigned long *)(VIC2_BASE + 0x08)) )
#define     VIC2INTSELECT           ( *((volatile unsigned long *)(VIC2_BASE + 0x0c)) )
#define     VIC2INTENABLE           ( *((volatile unsigned long *)(VIC2_BASE + 0x10)) )
#define     VIC2INTENCLEAR          ( *((volatile unsigned long *)(VIC2_BASE + 0x14)) )
#define     VIC2SOFTINT             ( *((volatile unsigned long *)(VIC2_BASE + 0x18)) )
#define     VIC2SOFTINTCLEAR        ( *((volatile unsigned long *)(VIC2_BASE + 0x1c)) )
#define     VIC2PROTECTION          ( *((volatile unsigned long *)(VIC2_BASE + 0x20)) )
#define     VIC2SWPRIORITYMASK      ( *((volatile unsigned long *)(VIC2_BASE + 0x24)) )
#define     VIC2PRIORITYDAISY       ( *((volatile unsigned long *)(VIC2_BASE + 0x28)) )
#define         VIC2VECTADDR            (VIC2_BASE + 0x100)
#define         VIC2VECPRIORITY         ( *((volatile unsigned long *)(VIC2_BASE + 0x200)) )
#define         VIC2ADDR                ( *((volatile unsigned long *)(VIC2_BASE + 0xf00)) )
#define         VIC2PERID0              ( *((volatile unsigned long *)(VIC2_BASE + 0xfe0)) )
#define         VIC2PERID1              ( *((volatile unsigned long *)(VIC2_BASE + 0xfe4)) )
#define         VIC2PERID2              ( *((volatile unsigned long *)(VIC2_BASE + 0xfe8)) )
#define         VIC2PERID3              ( *((volatile unsigned long *)(VIC2_BASE + 0xfec)) )
#define         VIC2PCELLID0                ( *((volatile unsigned long *)(VIC2_BASE + 0xff0)) )
#define         VIC2PCELLID1                ( *((volatile unsigned long *)(VIC2_BASE + 0xff4)) )
#define         VIC2PCELLID2                ( *((volatile unsigned long *)(VIC2_BASE + 0xff8)) )
#define         VIC2PCELLID3                ( *((volatile unsigned long *)(VIC2_BASE + 0xffc)) )// VIC3
#define     VIC3IRQSTATUS           ( *((volatile unsigned long *)(VIC3_BASE + 0x00)) )
#define     VIC3FIQSTATUS           ( *((volatile unsigned long *)(VIC3_BASE + 0x04)) )
#define     VIC3RAWINTR             ( *((volatile unsigned long *)(VIC3_BASE + 0x08)) )
#define     VIC3INTSELECT           ( *((volatile unsigned long *)(VIC3_BASE + 0x0c)) )
#define     VIC3INTENABLE           ( *((volatile unsigned long *)(VIC3_BASE + 0x10)) )
#define     VIC3INTENCLEAR          ( *((volatile unsigned long *)(VIC3_BASE + 0x14)) )
#define     VIC3SOFTINT             ( *((volatile unsigned long *)(VIC3_BASE + 0x18)) )
#define     VIC3SOFTINTCLEAR        ( *((volatile unsigned long *)(VIC3_BASE + 0x1c)) )
#define     VIC3PROTECTION          ( *((volatile unsigned long *)(VIC3_BASE + 0x20)) )
#define     VIC3SWPRIORITYMASK      ( *((volatile unsigned long *)(VIC3_BASE + 0x24)) )
#define     VIC3PRIORITYDAISY       ( *((volatile unsigned long *)(VIC3_BASE + 0x28)) )
#define         VIC3VECTADDR            (VIC3_BASE + 0x100)
#define         VIC3VECPRIORITY         ( *((volatile unsigned long *)(VIC3_BASE + 0x200)) )
#define         VIC3ADDR                ( *((volatile unsigned long *)(VIC3_BASE + 0xf00)) )
#define         VIC3PERID0              ( *((volatile unsigned long *)(VIC3_BASE + 0xfe0)) )
#define         VIC3PERID1              ( *((volatile unsigned long *)(VIC3_BASE + 0xfe4)) )
#define         VIC3PERID2              ( *((volatile unsigned long *)(VIC3_BASE + 0xfe8)) )
#define         VIC3PERID3              ( *((volatile unsigned long *)(VIC3_BASE + 0xfec)) )
#define         VIC3PCELLID0                ( *((volatile unsigned long *)(VIC3_BASE + 0xff0)) )
#define         VIC3PCELLID1                ( *((volatile unsigned long *)(VIC3_BASE + 0xff4)) )
#define         VIC3PCELLID2                ( *((volatile unsigned long *)(VIC3_BASE + 0xff8)) )
#define         VIC3PCELLID3                ( *((volatile unsigned long *)(VIC3_BASE + 0xffc)) )#define     _Exception_Vector           0xD0037400
#define      pExceptionRESET            ( *((volatile unsigned long *)(_Exception_Vector + 0x0)) )
#define      pExceptionUNDEF            ( *((volatile unsigned long *)(_Exception_Vector + 0x4)) )
#define      pExceptionSWI          ( *((volatile unsigned long *)(_Exception_Vector + 0x8)) )
#define         pExceptionPABORT            ( *((volatile unsigned long *)(_Exception_Vector + 0xc)) )
#define         pExceptionDABORT            ( *((volatile unsigned long *)(_Exception_Vector + 0x10)) )
#define      pExceptionRESERVED     ( *((volatile unsigned long *)(_Exception_Vector + 0x14)) )
#define         pExceptionIRQ               ( *((volatile unsigned long *)(_Exception_Vector + 0x18)) )
#define         pExceptionFIQ               ( *((volatile unsigned long *)(_Exception_Vector + 0x1c)) )void exceptionundef(void)
{printf("undefined instruction exception.\n");while(1);
}void exceptionswi(void)
{printf("swi exception.\n");while(1);
}void exceptionpabort(void)
{printf("pabort exception.\n");while(1);
}void exceptiondabort(void)
{printf("dabort exception.\n");while(1);
}// 中断相关初始化
void system_initexception( void)
{// 设置中断向量表pExceptionUNDEF   = (unsigned long)exceptionundef;pExceptionSWI     = (unsigned long)exceptionswi;pExceptionPABORT  = (unsigned long)exceptionpabort;pExceptionDABORT  = (unsigned long)exceptiondabort;pExceptionIRQ     = (unsigned long)IRQ_handle;pExceptionFIQ     = (unsigned long)IRQ_handle;// 初始化中断控制器intc_init();}// 初始化中断控制器
void intc_init(void)
{// 禁止所有中断VIC0INTENCLEAR = 0xffffffff;VIC1INTENCLEAR = 0xffffffff;VIC2INTENCLEAR = 0xffffffff;VIC3INTENCLEAR = 0xffffffff;// 选择中断类型为IRQVIC0INTSELECT = 0x0;VIC1INTSELECT = 0x0;VIC2INTSELECT = 0x0;VIC3INTSELECT = 0x0;// 清VICxADDRintc_clearvectaddr();}// 保存需要处理的中断的中断处理函数的地址
void intc_setvectaddr(unsigned long intnum, void (*handler)(void))
{//VIC0if(intnum<32){*( (volatile unsigned long *)(VIC0VECTADDR + 4*intnum) ) = (unsigned)handler;}//VIC1else if(intnum<64){*( (volatile unsigned long *)(VIC1VECTADDR + 4*(intnum-32)) ) = (unsigned)handler;}//VIC2else if(intnum<96){*( (volatile unsigned long *)(VIC2VECTADDR + 4*(intnum-64)) ) = (unsigned)handler;}//VIC3else{*( (volatile unsigned long *)(VIC3VECTADDR + 4*(intnum-96)) ) = (unsigned)handler;}return;
}// 清除需要处理的中断的中断处理函数的地址
void intc_clearvectaddr(void)
{// VICxADDR:当前正在处理的中断的中断处理函数的地址VIC0ADDR = 0;VIC1ADDR = 0;VIC2ADDR = 0;VIC3ADDR = 0;
}// 使能中断
void intc_enable(unsigned long intnum)
{unsigned long temp;if(intnum<32){temp = VIC0INTENABLE;temp |= (1<<intnum);VIC0INTENABLE = temp;}else if(intnum<64){temp = VIC1INTENABLE;temp |= (1<<(intnum-32));VIC1INTENABLE = temp;}else if(intnum<96){temp = VIC2INTENABLE;temp |= (1<<(intnum-64));VIC2INTENABLE = temp;}else if(intnum<NUM_ALL){temp = VIC3INTENABLE;temp |= (1<<(intnum-96));VIC3INTENABLE = temp;}// NUM_ALL : enable all interruptelse{VIC0INTENABLE = 0xFFFFFFFF;VIC1INTENABLE = 0xFFFFFFFF;VIC2INTENABLE = 0xFFFFFFFF;VIC3INTENABLE = 0xFFFFFFFF;}}// 禁止中断
void intc_disable(unsigned long intnum)
{unsigned long temp;if(intnum<32){temp = VIC0INTENCLEAR;temp |= (1<<intnum);VIC0INTENCLEAR = temp;}else if(intnum<64){temp = VIC1INTENCLEAR;temp |= (1<<(intnum-32));VIC1INTENCLEAR = temp;}else if(intnum<96){temp = VIC2INTENCLEAR;temp |= (1<<(intnum-64));VIC2INTENCLEAR = temp;}else if(intnum<NUM_ALL){temp = VIC3INTENCLEAR;temp |= (1<<(intnum-96));VIC3INTENCLEAR = temp;}// NUM_ALL : disable all interruptelse{VIC0INTENCLEAR = 0xFFFFFFFF;VIC1INTENCLEAR = 0xFFFFFFFF;VIC2INTENCLEAR = 0xFFFFFFFF;VIC3INTENCLEAR = 0xFFFFFFFF;}return;
}// 读中断状态
unsigned long intc_getvicirqstatus(unsigned long ucontroller)
{if(ucontroller == 0)return  VIC0IRQSTATUS;else if(ucontroller == 1)return  VIC1IRQSTATUS;else if(ucontroller == 2)return  VIC2IRQSTATUS;else if(ucontroller == 3)return  VIC3IRQSTATUS;else{}return 0;
}// 通用中断处理函数
void irq_handler(void)
{unsigned long vicaddr[4] = {VIC0ADDR,VIC1ADDR,VIC2ADDR,VIC3ADDR};int i=0;void (*isr)(void) = NULL;for(; i<4; i++){if(intc_getvicirqstatus(i) != 0){isr = (void (*)(void)) vicaddr[i];break;}}(*isr)();
}

main.c

#include "stdio.h"
#include "int.h"#define     GPH2CON     (*(volatile unsigned long *) 0xE0200C40)
#define     GPH2DAT     (*(volatile unsigned long *) 0xE0200C44)#define     GPH2_0_EINT16   (0xf<<(0*4))
#define     GPH2_1_EINT17   (0xf<<(1*4))
#define     GPH2_2_EINT18   (0xf<<(2*4))
#define     GPH2_3_EINT19   (0xf<<(3*4))#define     EXT_INT_0_CON           ( *((volatile unsigned long *)0xE0200E00) )
#define     EXT_INT_1_CON           ( *((volatile unsigned long *)0xE0200E04) )
#define     EXT_INT_2_CON           ( *((volatile unsigned long *)0xE0200E08) )
#define     EXT_INT_3_CON           ( *((volatile unsigned long *)0xE0200E0C) )#define     EXT_INT_0_MASK          ( *((volatile unsigned long *)0xE0200F00) )
#define     EXT_INT_1_MASK          ( *((volatile unsigned long *)0xE0200F04) )
#define     EXT_INT_2_MASK          ( *((volatile unsigned long *)0xE0200F08) )
#define     EXT_INT_3_MASK          ( *((volatile unsigned long *)0xE0200F0C) )#define     EXT_INT_0_PEND          ( *((volatile unsigned long *)0xE0200F40) )
#define     EXT_INT_1_PEND          ( *((volatile unsigned long *)0xE0200F44) )
#define     EXT_INT_2_PEND          ( *((volatile unsigned long *)0xE0200F48) )
#define     EXT_INT_3_PEND          ( *((volatile unsigned long *)0xE0200F4C) )void uart_init();// 延时函数
void delay(unsigned long count)
{volatile unsigned long i = count;while (i--);
}void isr_key(void)
{printf("we get company:EINT16_31\r\n");// clear VIC0ADDRintc_clearvectaddr();                  // clear pending bit   EXT_INT_2_PEND |= 1<<0;                  
}int main(void)
{int c = 0;// 初始化串口uart_init();// 中断相关初始化system_initexception();                    printf("**************Int test *************** \r\n");// 外部中断相关的设置// 1111 = EXT_INT[16]GPH2CON |= 0xF;                        // 010 = Falling edge triggeredEXT_INT_2_CON |= 1<<1;           // unmaskedEXT_INT_2_MASK &= ~(1<<0);// 设置中断EINT16_31的处理函数intc_setvectaddr(NUM_EINT16_31, isr_key);  // 使能中断EINT16_31intc_enable(NUM_EINT16_31);while (1){  printf("%d\r\n",c++);delay(0x100000);}
}

 
 
 
 
 
 
 
关注公众号"小败日记",搬砖过程遇到的问题,大家一起探讨,资源共享

小败日记公众号

这篇关于Smart210学习记录(六) 之中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qigaohua/article/details/102777366
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/166637

相关文章

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx