嵌入式Linux应用开发-第七章-野火-正点原子IMX6ULL的LED驱动程序

news2024/11/25 16:46:49

嵌入式Linux应用开发-第七章-野火-正点原子IMX6ULL的LED驱动程序

  • 野火IMX6ULL的LED驱动程序
    • 7.4 野火/正点原子 IMX6ULL的 LED驱动程序
      • 7.4.1 原理图
        • 7.4.1.1 野火 fire_imx6ull-pro开发板
        • 7.4.1.2 正点原子 Atk_imx6ull-alpha开发板
      • 7.4.2 所涉及的寄存器操作
        • 7.4.2.1 野火 fire_imx6ull-pro开发板
        • 7.4.2.2 正点原子 Atk_imx6ull-alpha开发板
      • 7.4.3 写程序
        • 7.4.3.1 野火 fire_imx6ull-pro开发板
      • 7.4.4 上机实验
        • 7.4.4.1 野火 fire_imx6ull-pro开发板
        • 7.4.4.2 正点原子 Atk_imx6ull-alpha开发板
      • 7.4.5 课后作业

野火IMX6ULL的LED驱动程序

在这里插入图片描述

7.4 野火/正点原子 IMX6ULL的 LED驱动程序

野火、正点原子用的内核版本是 4.1.15,
我们用的内核版本是 linux 4.9.88, 都是 4.x版本,在学习上没有任何差别。 你拿到板子后,可以使用他们出厂的系统, 也可以根据我们提供的高级用户手册更改为我们的系统。

7.4.1 原理图

7.4.1.1 野火 fire_imx6ull-pro开发板

LED原理图如下,它使用 GPIO5_IO03,引脚输出低电平时 LED被点亮,输出高电平时 LED被熄灭:
在这里插入图片描述

7.4.1.2 正点原子 Atk_imx6ull-alpha开发板

LED原理图如下,它使用 GPIO1_IO03,引脚输出低电平时 LED被点亮,输出高电平时 LED被熄灭:
在这里插入图片描述

7.4.2 所涉及的寄存器操作

GPIO模块图如下:
在这里插入图片描述
代码中对硬件的操作截图如下,截图便于对比,后面有文字便于复制:
在这里插入图片描述

7.4.2.1 野火 fire_imx6ull-pro开发板

步骤 1:使能 GPIO5
在这里插入图片描述
设置 b[31:30]就可以使能 GPIO5,设置为什么值呢?
注意:
在 imx6ullrm.pdf中,CCM_CCGR1的 b[31:30]是保留位;我以前写程序时错用了 imx6ul(不是imx6ull)的手册,导致程序中额外操作了这些保留位。不去设置 b[31:30],GPIO5也是默认使能的。 看下图,设置为 0b11:
在这里插入图片描述
① 00:该 GPIO模块全程被关闭
② 01:该 GPIO模块在 CPU run mode情况下是使能的;在 WAIT或 STOP模式下,关闭
③ 10:保留
④ 11:该 GPIO模块全程使能

/* GPIO5_IO03 */ 
/* a. 使能 GPIO5  
* set CCM to enable GPIO5  
 * CCM_CCGR1[CG15] 0x20C406C  
 *  bit[31:30] = 0b11  
 * / 

步骤 2:设置 GPIO5_IO03为 GPIO模式
设置如下寄存器:
在这里插入图片描述

/* b. 设置 GPIO5_IO03用于 GPIO  
* set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3  
*   to configure GPIO5_IO03 as GPIO  
*  IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 0x2290014  
*  bit[3:0] = 0b0101 alt5  
* / 

步骤 3:设置 GPIO5_IO03为输出引脚,
设置其输出电平 寄存器地址为:
在这里插入图片描述
设置数据寄存器,设置引脚的输出电平:
在这里插入图片描述

/* c. 设置 GPIO5_IO03作为 output引脚  
* set GPIO5_GDIR to configure GPIO5_IO03 as output  
*  GPIO5_GDIR  0x020AC000 + 0x4  
*  bit[3] = 0b1  
*/ 
/* d. 设置 GPIO5_DR输出低电平  
* set GPIO5_DR to configure GPIO5_IO03 output 0  
* GPIO5_DR 0x020AC000 + 0  
* bit[3] = 0b0  
* / 
/* e. 设置 GPIO5_IO3输出高电平  
* set GPIO5_DR to configure GPIO5_IO03 output 1  
*  GPIO5_DR 0x020AC000 + 0  
*  bit[3] = 0b1  
* / 
7.4.2.2 正点原子 Atk_imx6ull-alpha开发板

**步骤 1:**使能 GPIO1
在这里插入图片描述
设置 b[27:26]就可以使能 GPIO1,设置为什么值呢? 看下图,设置为 0b11:
在这里插入图片描述
① 00:该 GPIO模块全程被关闭
② 01:该 GPIO模块在 CPU run mode情况下是使能的;在 WAIT或 STOP模式下,关闭
③ 10:保留
④ 11:该 GPIO模块全程使能

/* GPIO1_IO03 */ 
/* a. 使能 GPIO1  
* set CCM to enable GPIO1  
* * CCM_CCGR1[CG13] 0x20C406C  
* * bit[27:26] = 0b11  
* */ 

步骤 2:
设置 GPIO1_IO03为 GPIO模式 设置如下寄存器:
在这里插入图片描述

/* b. 设置 GPIO1_IO03用于 GPIO  
* set IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03  
*   to configure GPIO1_IO03 as GPIO  
*  IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03  0x20E0068  
*  bit[3:0] = 0b0101 alt5  
*/ 

步骤 3:
设置 GPIO1_IO03为输出引脚,设置其输出电平 寄存器地址为:
在这里插入图片描述
设置方向寄存器,把引脚设置为输出引脚:

在这里插入图片描述
设置数据寄存器,设置引脚的输出电平:
在这里插入图片描述

/* c. 设置 GPIO1_IO03作为 output引脚  
* set GPIO1_GDIR to configure GPIO1_IO03 as output  
* GPIO1_GDIR  0x0209C000 + 0x4  
*  bit[3] = 0b1 
* / 
/* d. 设置 GPIO1_DR输出低电平  
* set GPIO1_DR to configure GPIO1_IO03 output 0  
*  GPIO1_DR 0x0209C000 + 0  
*  bit[3] = 0b0  
* / 
/* e. 设置 GPIO1_IO03输出高电平  
* set GPIO1_DR to configure GPIO1_IO03 output 1  
*  GPIO1_DR 0x0209C000 + 0  
*  bit[3] = 0b1  
* / 

7.4.3 写程序

7.4.3.1 野火 fire_imx6ull-pro开发板

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

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

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

100 static struct led_operations board_demo_led_opr = { 
101     .num  = 1, 
102     .init = board_demo_led_init, 
103     .ctl  = board_demo_led_ctl, 
104 }; 
105 

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

21 static volatile unsigned int *CCM_CCGR1                              ; 
22 static volatile unsigned int *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3; 
23 static volatile unsigned int *GPIO5_GDIR                             ; 
24 static volatile unsigned int *GPIO5_DR                               ; 
25 
26 static int board_demo_led_init (int which) /* 初始化 LED, which-哪个 LED */     
27 { 
28     unsigned int val; 
29 
30     //printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which); 
31     if (which == 0) 
32     { 
33         if (!CCM_CCGR1) 
34         { 
35             CCM_CCGR1  = ioremap(0x20C406C, 4); 
36         IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = ioremap(0x2290014, 4); 
37             GPIO5_GDIR  = ioremap(0x020AC000 + 0x4, 4); 
38             GPIO5_DR    = ioremap(0x020AC000 + 0, 4); 
39         } 
40 
41         /* GPIO5_IO03 */ 
42         /* a. 使能 GPIO5 
43          * set CCM to enable GPIO5 
44          * CCM_CCGR1[CG15] 0x20C406C 
45          * bit[31:30] = 0b11 
46          */ 
47         *CCM_CCGR1 |= (3<<30); 
48 
49         /* b. 设置 GPIO5_IO03用于 GPIO 
50          * set IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 
51          *      to configure GPIO5_IO03 as GPIO 
52          * IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3  0x2290014 
53          * bit[3:0] = 0b0101 alt5 
54          */ 
55         val = *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3; 
56         val &= ~(0xf); 
57         val |= (5); 
58         *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 = val; 
59 
60 
61         /* b. 设置 GPIO5_IO03作为 output引脚 
62          * set GPIO5_GDIR to configure GPIO5_IO03 as output 
63          * GPIO5_GDIR  0x020AC000 + 0x4 
64          * bit[3] = 0b1 
65          */ 
66         *GPIO5_GDIR |= (1<<3); 
67     } 
68 
69     return 0; 
70 } 
71 

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

72 static int board_demo_led_ctl (int which, char status) /* 控制 LED, which-哪个 LED, status:1-亮,0-灭 */ 
73 { 
74     //printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off"); 
75     if (which == 0) 
76     { 
77         if (status) /* on: output 0*/ 
78         { 
79             /* d. 设置 GPIO5_DR输出低电平 
80              * set GPIO5_DR to configure GPIO5_IO03 output 0 
81              * GPIO5_DR 0x020AC000 + 0 
82              * bit[3] = 0b0 
83              */ 
84             *GPIO5_DR &= ~(1<<3); 
85         } 
86         else  /* off: output 1*/ 
87         { 
88             /* e. 设置 GPIO5_IO3输出高电平 
89              * set GPIO5_DR to configure GPIO5_IO03 output 1 
90              * GPIO5_DR 0x020AC000 + 0 
91              * bit[3] = 0b1 
92              */ 
93             *GPIO5_DR |= (1<<3); 
94         } 
95 
96     } 
97     return 0; 
98 } 
99 

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

106 struct led_operations *get_board_led_opr(void) 
107 { 
108     return &board_demo_led_opr; 
109 } 
110 

7.4.3.2 正点原子 Atk_imx6ull-alpha开发板
使用 GIT下载所有源码后,本节源码位于如下目录:

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

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

100 static struct led_operations board_demo_led_opr = { 
101     .num  = 1, 
102     .init = board_demo_led_init, 
103     .ctl  = board_demo_led_ctl, 
104 }; 
105 

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

26 static int board_demo_led_init (int which) /* 初始化 LED, which-哪个 LED */ 
27 { 
28     unsigned int val; 
29
30     //printk("%s %s line %d, led %d\n", __FILE__, __FUNCTION__, __LINE__, which); 
31     if (which == 0) 
32     { 
33         if (!CCM_CCGR1) 
34         { 
35             CCM_CCGR1 = ioremap(0x20C406C, 4); 
36             IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = ioremap(0x20E0068, 4); 
37             GPIO1_GDIR = ioremap(0x0209C000 + 0x4, 4); 
38             GPIO1_DR  = ioremap(0x0209C000 + 0, 4); 
39         } 
40 
41         /* GPIO1_IO03 */ 
42         /* a. 使能 GPIO1 
43          * set CCM to enable GPIO1 
44          * CCM_CCGR1[CG13] 0x20C406C 
45          * bit[27:26] = 0b11 
46          */ 
47         *CCM_CCGR1 |= (3<<26); 
48 
49         /* b. 设置 GPIO1_IO03用于 GPIO 
50          * set IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 
51          *      to configure GPIO1_IO03 as GPIO 
52          * IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03  0x20E0068 
53          * bit[3:0] = 0b0101 alt5 
54          */ 
55         val = *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03; 
56         val &= ~(0xf); 
57         val |= (5); 
58         *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = val; 
59 
60 
61         /* c. 设置 GPIO1_IO03作为 output引脚 
62          * set GPIO1_GDIR to configure GPIO1_IO03 as output 
63          * GPIO1_GDIR  0x0209C000 + 0x4 
64          * bit[3] = 0b1 65          */ 
66         *GPIO1_GDIR |= (1<<3); 
67     } 
68 
69     return 0; 
70 } 
71 

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

72 static int board_demo_led_ctl (int which, char status) /* 控制 LED, which-哪个 LED, status:1-亮,0-灭 */ 
73 { 
74     //printk("%s %s line %d, led %d, %s\n", __FILE__, __FUNCTION__, __LINE__, which, status ? "on" : "off"); 
75     if (which == 0) 
76     { 
77         if (status) /* on: output 0*/ 
78         { 
79             /* d. 设置 GPIO1_DR输出低电平 
80              * set GPIO1_DR to configure GPIO1_IO03 output 0 
81              * GPIO1_DR 0x0209C000 + 0 
82              * bit[3] = 0b0 
83              */ 
84             *GPIO1_DR &= ~(1<<3); 
85         } 
86         else  /* off: output 1*/ 
87         { 
88             /* e. 设置 GPIO1_IO03输出高电平 
89              * set GPIO1_DR to configure GPIO1_IO03 output 1 
90              * GPIO1_DR 0x0209C000 + 0 
91              * bit[3] = 0b1 
92              */
93             *GPIO1_DR |= (1<<3); 
94         } 
95 
96     } 
97     return 0; 
98 } 
99 

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

106 struct led_operations *get_board_led_opr(void) 
107 { 
108     return &board_demo_led_opr; 
109 } 
110 

7.4.4 上机实验

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

7.4.4.1 野火 fire_imx6ull-pro开发板

注意:如果要使用板子自带的系统,关闭原有 LED驱动的方法是类似的,也是进入开发板/sys/class/leds/目录,对于每一个 LED在该目录下都有一个子目录,假设某个子目录名为 XXX,则执行如下命令:

# echo none  >  /sys/class/leds/XXX/trigger 

使用我们的系统时,按如下操作。
要先禁止内核中原来的 LED驱动,把“heatbeat”功能关闭,执行以下命令即可:

# echo none > /sys/class/leds/cpu/trigger 

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

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

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

# echo heartbeat > /sys/class/leds/cpu/trigger  
7.4.4.2 正点原子 Atk_imx6ull-alpha开发板

注意:如果要使用板子自带的系统,关闭原有 LED驱动的方法是类似的,也是进入开发板/sys/class/leds/目录,对于每一个 LED在该目录下都有一个子目录,假设某个子目录名为 XXX,则执行如下命令:

 # echo none  >  /sys/class/leds/XXX/trigger 

使用我们的系统时,按如下操作。 要先禁止内核中原来的 LED驱动,把“heatbeat”功能关闭,执行以下命令即可:

 # echo none > /sys/class/leds/sys-led/trigger 

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

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

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

 # echo heartbeat > /sys/class/leds/sys-led/trigger 

7.4.5 课后作业

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

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

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

相关文章

2011 款宝马 318i 车发动机怠速游车、抖动

故障现象 一辆2011款宝马318i车&#xff0c;搭载N46B20E发动机&#xff0c;累计行驶里程约为9.5万km。该车因发动机怠速游车、抖动在其他维修厂维修&#xff0c;维修人员更换了火花塞、点火线圈、空气流量传感器、VANOS&#xff08;可变气门正时系统&#xff09;电磁阀、气门升…

竞赛无人机搭积木式编程(四)---2023年TI电赛G题空地协同智能消防系统(无人机部分)

竞赛无人机搭积木式编程&#xff08;四&#xff09; ---2023年TI电赛G题空地协同智能消防系统&#xff08;无人机部分&#xff09; 无名小哥 2023年9月15日 赛题分析与解题思路综述 飞控用户在学习了TI电赛往届真题开源方案以及用户自定义航点自动飞行功能方案讲解后&#x…

delphi 11 安装失败

delphi 11 安装遇到如下图&#xff1a; 解决方法&#xff1a; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 管理员身份&#xff01;&…

什么是数学建模(mooc笔记)

什么是数学建模 前提&#xff1a;我们数学建模国赛计划选择C题&#xff0c;故希望老师的教学中侧重与C题相关性大的模型及其思想进行培训。之后的学习内容中希望涉及以下知识点&#xff1a; logistic回归相关知识点。如&#xff1a;用法、适用、限制范围等。精学数学建模中常…

Kafka:介绍和内部工作原理

展示Kafka工作方式的简单架构。 什么是Kafka&#xff1f;为什么我们要使用它&#xff1f;它是消息队列吗&#xff1f; 它是一个分布式流处理平台或分布式提交日志。 Kafka通常用于实时流数据管道&#xff0c;即在系统之间传输数据&#xff0c;构建不断流动的数据转换系统和构…

WebPack5高级使用总结(三)

WebPack5高级使用总结 1、提升开发体检1.1、SourceMap1.2、使用 2、提升打包构建速度2.1、HotModuleReplacement2.2、oneOf2.3、Include/Exclude2.4、Cache2.5、Thead 3、减少代码体积3.1、Tree Shaking3.2、Babel3.3、Image Minimizer 4、优化代码运行性能4.1、Code Split4.1.…

038:mapboxGL 旋转地图(rotateTo)

第038个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中旋转地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhuan…

科技资讯|AirPods Pro基于定位控制的自适应音频功能

在接受 TechCrunch 媒体采访时&#xff0c;苹果高管 Ron Huang 和 Eric Treski 谈到了关于 AirPods Pro 自适应音频&#xff08;Adaptive Audio&#xff09;功能的轶事&#xff0c;曾考虑基于 GPS 信号来控制自适应音频级别。 Treski 表示在探索自适应音频功能初期&#xff0…

电脑技巧:推荐一款桌面增强工具AquaSnap

目录 一、软件介绍 二、功能介绍 2.1 窗口边缘停靠 2.2、 窗口平铺 2.3、 窗口对齐 2.4 窗口自动拉伸 2.5、同时移动多个窗口 2.6 、支持窗口置顶 2.7、 鼠标快捷方式 2.8、 键盘快捷键 三、软件特色 四、软件获取 一、软件介绍 AquaSnap(界面增强软件)是一款功能…

Vue中自定义实现类似el-table的表格效果实现行颜色根据数据去变化展示

主要使用div布局实现表格效果&#xff0c;并使用渐变实现行背景渐变的效果 页面布局 <div class"table-wrap"><div class"table-title"><divv-for"(item, index) in tableColumn":key"index":prop"item.prop&qu…

嵌入式Linux应用开发-第七章-IMX6ULL-QEMU的LED驱动程序

嵌入式Linux应用开发-第七章-IMX6ULL-QEMU的LED驱动程序 IMX6ULL-QEMU的 LED驱动程序7.5 IMX6ULL-QEMU的 LED驱动程序7.5.1 看原理图确定引脚及操作方法7.5.2 所涉及的寄存器操作7.5.3 写程序7.5.4 上机实验7.5.5 课后作业 IMX6ULL-QEMU的 LED驱动程序 7.5 IMX6ULL-QEMU的 LED驱…

简化任务调度与管理:详解XXL-Job及Docker Compose安装

在现代应用程序开发中&#xff0c;任务调度和管理是至关重要的一部分。XXL-Job是一个强大的分布式任务调度平台&#xff0c;它使得任务的调度和管理变得更加轻松和高效。本文将介绍XXL-Job的基本概念&#xff0c;并详细演示如何使用Docker Compose进行快速安装和配置。 什么是X…

【大模型和智能问答系统】

大模型和智能问答系统 大模型前的智能问答系统传统管道式架构存在的问题 大模型前的智能问答系统 大模型统一代指以ChatGPT为代表的&#xff0c;参数量相比以前模型有明显量级变化的生成模型。 智能问答系统&#xff0c;按照应用可以划分*任务型 *和 非任务型。 任务型问答系…

Java集成Onlyoffice以及安装和使用示例,轻松实现word、ppt、excel在线编辑功能协同操作,Docker安装Onlyoffice

安装Onlyoffice 拉取onlyoffice镜像 docker pull onlyoffice/documentserver 查看镜像是否下载完成 docker images 启动onlyoffice 以下是将本机的9001端口映射到docker的80端口上&#xff0c;访问时通过服务器ip&#xff1a;9001访问&#xff0c;并且用 -v 将本机机/data/a…

容器启动报错

容器启动报错 docker: Error response from daemon: driver failed programming external connectivity on endpoint XXX 如下&#xff1a; 据百度&#xff1a; 在docker启动后在&#xff0c;再对防火墙firewalld进行操作&#xff0c;就会发生上述报错 详细原因&#xff1a…

flutter 【iOS】App Store介绍页中显示的语言列表如何设置

【iOS】App Store介绍页中显示的语言列表如何设置 iOS实现语言本地化

git新建仓库上传项目步骤

1、git init 2、git add . 3、git commit -m "first commit" 4、git remote add origin https://gitee.com... 5、git push origin master --force 为方式踩坑&#xff0c;浪费不必要的时间&#xff0c;以上步骤必须依次执行

京东大型API网关实践之路

概述 1、背景 京东作为电商平台&#xff0c;近几年用户、业务持续增长&#xff0c;访问量持续上升&#xff0c;随着这些业务的发展&#xff0c;API网关应运而生。 API网关&#xff0c;就是为了解放客户端与服务端而存在的。对于客户端&#xff0c;使开放给客户端的接口标准统…

时间复杂度、空间复杂度 O(1)和 O(logN)

时间复杂度&#xff08;time complexity&#xff09;&#xff1a;估算程序指令的执行次数&#xff08;执行时间&#xff09; 空间复杂度&#xff08;space complexity&#xff09;&#xff1a;估算所需占用的存储空间 public static void test1(int n) {// 确定的执行次数if …

AI创作系统ChatGPT商业运营版源码+AI绘画/支持GPT联网提问/支持Midjourney绘画+Prompt应用+支持国内AI提问模型

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…