嵌入式Linux应用开发-第七章-RK3288和 RK3399的 LED驱动程序

嵌入式Linux应用开发-第七章-RK3288和 RK3399的 LED驱动程序

  • RK3288和 RK3399的 LED驱动程序
    • 7.3 RK3288和 RK3399的 LED驱动程序
      • 7.3.1 原理图
        • 7.3.1.1 fireflye RK3288的 LED原理图
        • 7.3.1.2 firefly RK3399的 LED原理图
      • 7.3.2 所涉及的寄存器操作
        • 7.3.2.1 RK3288的 GPIO8_A1引脚
        • 7.3.2.2 RK3399的 GPIO2_D3引脚
      • 7.3.3 写程序
        • 7.3.3.1 RK3288
        • 7.3.3.2 RK3399
      • 7.3.4 上机实验
        • 7.3.4.1 RK3288
        • 7.3.4.2 RK3399
      • 7.3.5 课后作业

RK3288和 RK3399的 LED驱动程序

在这里插入图片描述

7.3 RK3288和 RK3399的 LED驱动程序

7.3.1 原理图

7.3.1.1 fireflye RK3288的 LED原理图

RK3288开发板上有 2个 LED,原理图如下,其中的 WORK_LED使用引脚 GPIO8_A1:
在这里插入图片描述
这些 LED引脚输出低电平时,LED被点亮;输出高电平时,LED被熄灭。

7.3.1.2 firefly RK3399的 LED原理图

RK3399开发板上有 3个 LED,原理图如下,其中的 WORK_LED使用引脚 GPIO2_D3:
在这里插入图片描述
这些 LED引脚输出低电平时,LED被点亮;输出高电平时,LED被熄灭。

7.3.2 所涉及的寄存器操作

截图便于对比,后面有文字便于复制:
在这里插入图片描述

7.3.2.1 RK3288的 GPIO8_A1引脚

a. 使能 GPIO8
在这里插入图片描述
设置 CRU_CLKGATE14_CON的 b[8]为 0使能 GPIO8,要修改 b[8]的前提是把 b[24]设置为 1。

 /* rk3288 GPIO8_A1 *//* a. 使能 GPIO8  * set CRU to enable GPIO8  * CRU_CLKGATE14_CON 0xFF760000 + 0x198  * (1<<(8+16)) | (0<<8)  */ 

b. 设置 GPIO8_A1用于 GPIO
在这里插入图片描述
设置 GRF_GPIO8A_IOMUX的 b[3:2]为 0b00把 GPIO8_A1用作 GPIO,要修改 b[3:2]的前提是把 b[19:18]设置为 0b11。

 /* b. 设置 GPIO8_A1用于 GPIO  * set PMU/GRF to configure GPIO8_A1 as GPIO  * GRF_GPIO8A_IOMUX 0xFF770000 + 0x0080  *  bit[3:2] = 0b00  *  (3<<(2+16)) | (0<<2)  * / 

c. 设置 GPIO8_A1作为 output引脚
在这里插入图片描述
设置 GPIO_SWPORTA_DDR 寄存器 b[1]为 1,把 GPIO8_A1设置为输出引脚。 注意: GPIO_A0~A7 对应 bit0bit7;GPIO_B0B7 对应 bit8~bit15;
GPIO_C0~C7 对应 bit16bit23;GPIO_D0D7 对应 bit24~bit31

/* c. 设置 GPIO8_A1作为 output引脚  
* set GPIO_SWPORTA_DDR to configure GPIO8_A1 as output  
*  GPIO_SWPORTA_DDR 0xFF7F0000 + 0x0004  
* bit[1] = 0b1 
* / 

d. 设置 GPIO8_A1输出高电平
在这里插入图片描述
设置 GPIO_SWPORTA_DR 寄存器 b[1]为 1,让 GPIO8_A1输出高电平。
注意:
GPIO_A0~A7 对应 bit0bit7;GPIO_B0B7 对应 bit8~bit15;
GPIO_C0~C7 对应 bit16bit23;GPIO_D0D7 对应 bit24~bit31

/* d. 设置 GPIO8_A1输出高电平  
* set GPIO_SWPORTA_DR to configure GPIO8_A1 output 1  
*  GPIO_SWPORTA_DR 0xFF7F0000 + 0x0000  
*  bit[1] = 0b1 
* / 

e. 设置 GPIO8_A1输出低电平
同样是设置 GPIO_SWPORTA_DR 寄存器,把 b[1]设为 0,让 GPIO8_A1输出低电平。

/* e. 设置 GPIO8_A1输出低电平  
* set GPIO_SWPORTA_DR to configure GPIO8_A1 output 0  
*  GPIO_SWPORTA_DR 0xFF7F0000 + 0x0000  
*  bit[1] = 0b0  
* / 
7.3.2.2 RK3399的 GPIO2_D3引脚

a. 使能 GPIO2
在这里插入图片描述
设置 CRU_CLKGATE_CON31的 b[3]为 0使能 GPIO2,要修改 b[3]的前提是把 b[19]设置为 1。

 /* rk3399 GPIO2_D3 */ /* a. 使能 GPIO2  * set CRU to enable GPIO2  * CRU_CLKGATE_CON31 0xFF760000 + 0x037c  * (1<<(3+16)) | (0<<3) */ 

b. 设置 GPIO2_D3用于 GPIO
在这里插入图片描述

设置 GRF_GPIO2D_IOMUX的 b[7:6]为 0b00把 GPIO2_D3用作 GPIO,要修改 b[7:6]的前提是把 b[23:22]设置为 0b11。

/* b. 设置 GPIO2_D3用于 GPIO  
* set PMU/GRF to configure GPIO2_D3 as GPIO  
*  GRF_GPIO2D_IOMUX 0xFF770000 + 0x0e00c  
*  bit[7:6] = 0b00  * (3<<(6+16)) | (0<<6)  
* /

c. 设置 GPIO2_D3作为 output引脚
在这里插入图片描述
设置 GPIO_SWPORTA_DDR 寄存器 b[27]为 1,把 GPIO2_D3设置为输出引脚。
注意:
GPIO_A0~A7 对应 bit0bit7;GPIO_B0B7 对应 bit8~bit15;
GPIO_C0~C7 对应 bit16bit23;GPIO_D0D7 对应 bit24~bit31

/* c. 设置 GPIO2_D3作为 output引脚  
* set GPIO_SWPORTA_DDR to configure GPIO2_D3 as output * GPIO_SWPORTA_DDR 0xFF780000 + 0x0004  *  bit[27] = 0b1  * /  

d. 设置 GPIO2_D3输出高电平
在这里插入图片描述
设置 GPIO_SWPORTA_DR 寄存器 b[27]为 1,让 GPIO2_D3输出高电平。
注意:
GPIO_A0~A7 对应 bit0bit7;GPIO_B0B7 对应 bit8~bit15;
GPIO_C0~C7 对应 bit16bit23;GPIO_D0D7 对应 bit24~bit31

  /* d. 设置 GPIO2_D3输出高电平  * set GPIO_SWPORTA_DR to configure GPIO2_D3 output 1  * GPIO_SWPORTA_DR 0xFF780000 + 0x0000  *  bit[27] = 0b1  */  

e. 设置 GPIO2_D3输出低电平
同样是设置 GPIO_SWPORTA_DR 寄存器,把 b[27]设为 0,让 GPIO2_D3输出低电平。

 /* e. 设置 GPIO2_D3输出低电平  * set GPIO_SWPORTA_DR to configure GPIO2_D3 output 0  *  GPIO_SWPORTA_DR 0xFF780000 + 0x0000  *  bit[27] = 0b0  * / 

7.3.3 写程序

7.3.3.1 RK3288

使用 GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\ 
05_嵌入式 Linux驱动开发基础知识\source\02_led_drv\       
02_led_drv_for_boards\rk3288_src_bin 

硬件相关的文件是 board_rk3288.c,其他文件跟 LED框架驱动程序完全一样。 它首先构造了一个 led_operations结构体,用来表示 LED的硬件操作:

91 static struct led_operations board_demo_led_opr = { 
92      .num  = 1, 
93      .init = board_demo_led_init, 
94      .ctl  = board_demo_led_ctl, 
95 }; 
96 

led_operations结构体中有 init函数指针,它指向 board_demo_led_init函数,在里面将会初始化LED引脚:使能、设置为 GPIO模式、设置为输出引脚。
值得关注的是第 32~35行,对于寄存器要先使用 ioremap得到它的虚拟地址,以后使用虚拟地址访问寄存器:

 20 static volatile unsigned int *CRU_CLKGATE14_CON; 21 static volatile unsigned int *GRF_GPIO8A_IOMUX ; 22 static volatile unsigned int *GPIO8_SWPORTA_DDR; 23 static volatile unsigned int *GPIO8_SWPORTA_DR ; 24 25 static int board_demo_led_init (int which) /* 初始化 LED, which-哪个 LED */    26 { 27      //printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which); 28      if (which == 0) 29      { 30              if (!CRU_CLKGATE14_CON) 31              { 32                      CRU_CLKGATE14_CON = ioremap(0xFF760000 + 0x0198, 4); 33                      GRF_GPIO8A_IOMUX  = ioremap(0xFF770000 + 0x0080, 4); 34                      GPIO8_SWPORTA_DDR = ioremap(0xFF7F0000 + 0x0004, 4); 35                      GPIO8_SWPORTA_DR  = ioremap(0xFF7F0000 + 0x0000, 4); 36              } 37 38              /* rk3288 GPIO8_A1 */ 39              /* a. 使能 GPIO8 40               * set CRU to enable GPIO8 41               * CRU_CLKGATE14_CON 0xFF760000 + 0x198 42               * (1<<(8+16)) | (0<<8) 43               */ 44              *CRU_CLKGATE14_CON = (1<<(8+16)) | (0<<8); 45 46              /* b. 设置 GPIO8_A1用于 GPIO 47               * set PMU/GRF to configure GPIO8_A1 as GPIO 48               * GRF_GPIO8A_IOMUX 0xFF770000 + 0x0080 49               * bit[3:2] = 0b00 50               * (3<<(2+16)) | (0<<2) 51               */ 52              *GRF_GPIO8A_IOMUX =(3<<(2+16)) | (0<<2); 53 54              /* c. 设置 GPIO8_A1作为 output引脚 55               * set GPIO_SWPORTA_DDR to configure GPIO8_A1 as output 
56               * GPIO_SWPORTA_DDR 0xFF7F0000 + 0x0004 
57               * bit[1] = 0b1 
58               */ 
59              *GPIO8_SWPORTA_DDR |= (1<<1); 
60      } 
61              return 0; 
62 } 
63 

led_operations结构体中有 ctl函数指针,它指向 board_demo_led_ctl函数,在里面将会根据参数设置 LED引脚的输出电平:

64 static int board_demo_led_ctl (int which, char status) /* 控制 LED, which-哪个 LED, status:1-亮, 0-灭*/ 
65 { 
66      //printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off"); 
67      if (which == 0) 
68      { 
69              if (status) /* on: output 0 */ 
70              { 
71                      /* e. 设置 GPIO8_A1输出低电平 
72                       * set GPIO_SWPORTA_DR to configure GPIO8_A1 output 0 
73                       * GPIO_SWPORTA_DR 0xFF7F0000 + 0x0000 
74                       * bit[1] = 0b0 
75                       */ 
76                      *GPIO8_SWPORTA_DR &= ~(1<<1); 
77              } 
78              else /* off: output 1 */ 
79              { 
80                      /* d. 设置 GPIO8_A1输出高电平 
81                       * set GPIO_SWPORTA_DR to configure GPIO8_A1 output 1 
82                       * GPIO_SWPORTA_DR 0xFF7F0000 + 0x0000 
83                       * bit[1] = 0b1 
84                       */ 
85                      *GPIO8_SWPORTA_DR |= (1<<1); 
86              } 
87      } 
88      return 0; 
89 } 
90 

下面的 get_board_led_opr函数供上层调用,给上层提供 led_operations结构体:

97 struct led_operations *get_board_led_opr(void) 
98 { 
99      return &board_demo_led_opr; 
100 } 
101 
7.3.3.2 RK3399

使用 GIT下载所有源码后,本节源码位于如下目录:

01_all_series_quickstart\ 
05_嵌入式 Linux驱动开发基础知识\source\02_led_drv\       
02_led_drv_for_boards\rk3399_src_bin 

硬件相关的文件是 board_rk3399.c,其他文件跟 LED框架驱动程序完全一样。 它首先构造了一个 led_operations结构体,用来表示 LED的硬件操作:

91 static struct led_operations board_demo_led_opr = { 
92     .num  = 1, 
93     .init = board_demo_led_init, 
94     .ctl  = board_demo_led_ctl, 
95 }; 
96 

led_operations结构体中有 init函数指针,它指向 board_demo_led_init函数,在里面将会初始化LED引脚:使能、设置为 GPIO模式、设置为输出引脚。
值得关注的是第 32~35行,对于寄存器要先使用 ioremap得到它的虚拟地址,以后使用虚拟地址访问寄存器:

20 static volatile unsigned int *CRU_CLKGATE_CON31; 
21 static volatile unsigned int *GRF_GPIO2D_IOMUX ; 
22 static volatile unsigned int *GPIO2_SWPORTA_DDR; 
23 static volatile unsigned int *GPIO2_SWPORTA_DR ; 
24 
25 static int board_demo_led_init (int which) /* 初始化 LED, which-哪个 LED */     
26 { 
27     //printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which); 
28     if (which == 0) 
29     { 
30         if (!CRU_CLKGATE_CON31) 
31         { 
32             CRU_CLKGATE_CON31 = ioremap(0xFF760000 + 0x037c, 4); 
33             GRF_GPIO2D_IOMUX  = ioremap(0xFF770000 + 0x0e00c, 4); 
34             GPIO2_SWPORTA_DDR = ioremap(0xFF780000 + 0x0004, 4); 
35             GPIO2_SWPORTA_DR  = ioremap(0xFF780000 + 0x0000, 4); 
36         } 
37 
38         /* rk3399 GPIO2_D3 */ 
39         /* a. 使能 GPIO2 40          * set CRU to enable GPIO2 
41          * CRU_CLKGATE_CON31 0xFF760000 + 0x037c 
42          * (1<<(3+16)) | (0<<3) 
43          */ 
44         *CRU_CLKGATE_CON31 = (1<<(3+16)) | (0<<3); 
45 
46         /* b. 设置 GPIO2_D3用于 GPIO 
47          * set PMU/GRF to configure GPIO2_D3 as GPIO 
48          * GRF_GPIO2D_IOMUX 0xFF770000 + 0x0e00c 
49          * bit[7:6] = 0b00 
50          * (3<<(6+16)) | (0<<6) 
51          */ 
52         *GRF_GPIO2D_IOMUX = (3<<(6+16)) | (0<<6); 
53 
54         /* c. 设置 GPIO2_D3作为 output引脚 
55          * set GPIO_SWPORTA_DDR to configure GPIO2_D3 as output 
56          * GPIO_SWPORTA_DDR 0xFF780000 + 0x0004 
57          * bit[27] = 0b1 
58          */ 
59         *GPIO2_SWPORTA_DDR |= (1<<27); 
60     } 
61     return 0; 
62 } 
63 

led_operations结构体中有 ctl函数指针,它指向 board_demo_led_ctl函数,在里面将会根据参数设置 LED引脚的输出电平:

64 static int board_demo_led_ctl (int which, char status) /* 控制 LED, which-哪个 LED, status:1-亮, 0-灭*/ 
65 { 
66     //printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off"); 
67     if (which == 0) 
68     { 
69         if (status) /* on: output 1 */ 
70         { 
71             /* d. 设置 GPIO2_D3输出高电平 
72              * set GPIO_SWPORTA_DR to configure GPIO2_D3 output 1 
73              * GPIO_SWPORTA_DR 0xFF780000 + 0x0000 
74              * bit[27] = 0b1 
75              */ 
76             *GPIO2_SWPORTA_DR |= (1<<27); 
77         } 
78         else /* off : output 0 */ 
79         { 
80             /* e. 设置 GPIO2_D3输出低电平 
81              * set GPIO_SWPORTA_DR to configure GPIO2_D3 output 0 
82              * GPIO_SWPORTA_DR 0xFF780000 + 0x0000 
83              * bit[27] = 0b0 
84              */ 
85             *GPIO2_SWPORTA_DR &= ~(1<<27); 
86         } 
87     } 
88     return 0; 
89 } 
90 

下面的 get_board_led_opr函数供上层调用,给上层提供 led_operations结构体:

97 struct led_operations *get_board_led_opr(void) 
98 { 
99     return &board_demo_led_opr; 
100 } 
101 

7.3.4 上机实验

首先设置工具链,然后修改驱动程序 Makefile指定内核源码路径,就可以编译驱动程序和测试程序了。 启动开发板,挂载 NFS文件系统,这样就可以访问到 Ubuntu中的文件。 最后,就可以在开发板上进行下列测试。

7.3.4.1 RK3288
# insmod  xxxxxx_led.ko 
# ./ledtest  /dev/xxxxxx_led0  on 
# ./ledtest  /dev/xxxxxx_led0  off 
7.3.4.2 RK3399

要先禁止内核中原来的 LED驱动,把“heatbeat”功能关闭,执行以下命令即可:

# echo none > /sys/class/leds/firefly\:yellow\:heartbeat/trigger 
# echo none > /sys/class/leds/firefly\:yellow\:user/trigger 
# echo none > /sys/class/leds/firefly\:red\:power/trigger 

这样就可以使用我们的驱动程序做实验了:

 # insmod  xxxxxx_led.ko # ./ledtest  /dev/xxxxxx_led0  on # ./ledtest  /dev/xxxxxx_led0  off

如果想恢复原来的心跳功能,可以执行:

# echo heartbeat > /sys/class/leds/firefly\:yellow\:heartbeat/trigger 
# echo heartbeat > /sys/class/leds/firefly\:yellow\:user/trigger 
# echo heartbeat > /sys/class/leds/firefly\:red\:power/trigger 

7.3.5 课后作业

a. 在驱动里有 ioremap,什么时候执行 iounmap?请完善程序
b. 视频里我们只实现了点一个 LED,请修改代码实现操作所有 LED

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

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

相关文章

Docker 容器技术 (上) 环境安装和部署、容器镜像、使用IDEA构建Springboot程序镜像、远程仓库、容器网络管理

Docker容器技术 文章目录 Docker容器技术容器技术入门环境安装和部署从虚拟机到容器容器工作机制简述 容器与镜像初识容器镜像镜像结构介绍构建镜像发布镜像到远程仓库实战&#xff1a;使用IDEA构建SpringBoot程序镜像 容器网络管理容器网络类型用户自定义网络容器间网络容器外…

在亚马逊云科技Amazon SageMaker上部署构建聊天机器人的开源大语言模型

开源大型语言模型&#xff08;LLM&#xff09;已经变得流行起来&#xff0c;研究人员、开发人员和组织都可以使用这些模型来促进创新和实验。这促进了开源社区开展合作&#xff0c;从而为LLM的开发和改进做出贡献。开源LLM提供了模型架构、训练过程和训练数据的透明度&#xff…

k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD

测试环境使用的jenkins 正式环境使用的gitlab-ci 测试环境 创建yaml文件 apiVersion: v1 kind: ConfigMap metadata:name: dtk-go-tiktok-admin-configlabels:app.kubernetes.io/name: dtk-go-tiktok-adminapp.kubernetes.io/business: infrastructureapp.kubernetes.io/run…

定时任务管理平台青龙 QingLong

一、关于 QingLong 1.1 QingLong 介绍 青龙面板是支持 Python3、JavaScript、Shell、Typescript 多语言的定时任务管理平台&#xff0c;支持在线管理脚本和日志等。其功能丰富&#xff0c;能够满足大部分需求场景&#xff0c;值得一试。 主要功能 支持多种脚本语言&#xf…

Python接口自动化之unittest单元测试

以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是单元测试&#xff1f; 按照阶段来分&#xff0c;一般就是单元测试&#xff0c;集成测试&#xff0c;系统测试&#xff0c;验收测试。单元测试是对单个模块、单个类或者单个函数进行测试。 将访…

【网络协议】TCP

TCP协议全称为传输控制协议(Transmission Control Protocol).要理解TCP就要从他的特性开始说&#xff0c;这些特性各自之间或多或少各有联结&#xff0c;需要以宏观视角来看待。 目录&#xff1a; 1.TCP报文格式 因为报文解释过于繁琐&#xff0c;具体内容请看这篇文章TCP报文…

大模型lora微调-chatglm2

通义千问大模型微调源码&#xff08;chatglm2 微调失败&#xff0c;训练通义千问成功&#xff09;&#xff1a;GitHub - hiyouga/LLaMA-Efficient-Tuning: Easy-to-use LLM fine-tuning framework (LLaMA-2, BLOOM, Falcon, Baichuan, Qwen, ChatGLM2)Easy-to-use LLM fine-tun…

pytorch的pixel_shuffle转tflite文件

torch.pixel_shuffle()是pytorch里面上采样比较常用的方法&#xff0c;但是和tensoflow的depth_to_space不是完全一样的&#xff0c;虽然看起来功能很像&#xff0c;但是细微是有差异的 def tf_pixelshuffle(input, upscale_factor):temp []depth upscale_factor *upscale_f…

项目集成七牛云存储sdk

以PHP为例 第一步&#xff1a;下载sdk PHP SDK_SDK 下载_对象存储 - 七牛开发者中心 sdk下载成功之后&#xff0c;将sdk放入项目中&#xff0c;目录选择以自己项目实际情况而定。 注意&#xff1a;在examples目录中有各种上传文件的参考示例&#xff0c;这里我们主要参考的是…

朴素贝叶斯深度解码:从原理到深度学习应用

目录 一、简介贝叶斯定理的历史和重要性定义例子 朴素贝叶斯分类器的应用场景定义例子常见应用场景 二、贝叶斯定理基础条件概率定义例子 贝叶斯公式定义例子 三、朴素贝叶斯算法原理基本构成定义例子 分类过程定义例子 不同变体定义例子 四、朴素贝叶斯的种类高斯朴素贝叶斯&a…

[Framework] Android Binder 工作原理

Binder 是 Android 系统中主要的 IPC 通信方式&#xff0c;其性能非常优异。但是包括我在内的很多开发者都对它望而却步&#xff0c;确实比较难&#xff0c;每次都是看了忘&#xff0c;忘了看&#xff0c;但是随着工作的时间约来越长&#xff0c;每次看也都对 Binder 有新的认识…

Machine Learning(study notes)

There is no studying without going crazy Studying alwats drives us crazy 文章目录 DefineMachine LearningSupervised Learning&#xff08;监督学习&#xff09;Regression problemClassidication Unspervised LearningClustering StudyModel representation&#xff08…

IntelliJ IDEA 左侧Commit栏不见了

1.点击File->Settings->Version Control->Commit 2.勾选Use non-modal commit interface

Git 学习(2)

Git 学习&#xff08;2&#xff09; 版本号 Git 中文件的版本号是 40 位十六进制的数字字符串&#xff0c;采用 SHA-1 加密算法计算获得 这样一方面可避免在合并时的冲突问题 另一方面可以用于文件定位&#xff0c;其中前两位表示文件夹&#xff0c;后 38 位表示文件 指令介…

阿里云网络、数据中心和服务器技术创新优势说明

阿里云服务器技术创新、网络技术创新、数据中心技术创新和智能运维&#xff1a;云服务器方升架构、自研硬件、自研存储硬件AliFlash和异构计算加速平台&#xff0c;以及全自研网络系统技术创新和数据中心巴拿马电源、液冷技术等技术创新说明&#xff0c;阿里云百科aliyunbaike.…

游戏设计模式专栏(一):工厂方法模式

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华&#xff0c;欢迎大家关注分享收藏订阅。 在游戏开发中&#xff0c;代码的组织和结构对于项目的可…

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository

Java 实现前端数据的导出操作

前端 <el-button class"export" type"primary" icon"el-icon-download" click"exportData()">导出</el-button>exportData() {//data 操作data 变成后端需要的格式let data {capacityVos: resultVo}this.$confirm("…

服务器补丁管理软件

随着漏洞的不断上升&#xff0c;服务器修补是增强企业网络安全的典型特征。作为业务关键型机器&#xff0c;计划服务器维护的停机时间无疑是一件麻烦事。但是&#xff0c;借助高效的服务器补丁管理软件&#xff08;如 Patch Manager Plus&#xff09;&#xff0c;管理员可以利用…

FileManager/本地文件增删改查, Cache/图像缓存处理 的操作

1. FileManager 本地文件管理器&#xff0c;增删改查文件 1.1 实现 // 本地文件管理器 class LocalFileManager{// 单例模式static let instance LocalFileManager()let folderName "MyApp_Images"init() {createFolderIfNeeded()}// 创建特定应用的文件夹func cr…