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

news2024/11/25 13:52:25

嵌入式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.coloradmin.cn/o/1049617.html

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

相关文章

探索ClickHouse——使用MaterializedView存储kafka传递的数据

在《探索ClickHouse——连接Kafka和Clickhouse》中&#xff0c;我们讲解了如何使用kafka engin连接kafka&#xff0c;并读取topic中的数据。但是遇到了一个问题&#xff0c;就是数据只能读取一次&#xff0c;即使后面还有新数据发送到该topic&#xff0c;该表也读不出来。 为了…

Ae 效果:CC Smear

扭曲/CC Smear Distort/CC Smear CC Smear &#xff08;CC 漩涡条纹&#xff09;可以将两点之间的源图像内容进行拉伸扭曲变形&#xff0c;形成一种类似油墨被涂抹或者柔体被拉扯之后的漩涡条纹效果。 ◆ ◆ ◆ 效果属性说明 From 从 漩涡条纹效果的起点。 默认为合成的中心。…

麒麟v10获取wwn

for i in cat /proc/partitions | awk {print $4} | grep sd do echo "Device: $i WWID: /usr/lib/udev/scsi_id --page0x83 --whitelisted --device/dev/$i" done | sort -k4

用于时间触发的嵌入式软件的IDE

TTE Systems的RapidiTTy IDE为希望创建“时间触发”微控制器软件以提高整体系统可靠性的开发人员提供了一个独立的环境。RapidiTTy&#xff08;下面的图1&#xff09;旨在解决深度嵌入的应用&#xff0c;包括医疗&#xff0c;国防&#xff0c;汽车和工业部门以及白色和棕色商品…

【Linux】Linux远程访问Windows下的MySQL数据库

1.建立Windows防火墙规则 首先需要开放windows防火墙&#xff0c;针对3306端口单独创建一条规则&#xff0c;允许访问。 打开windows安全中心防火墙与保护&#xff0c;点击高级设置 进入之后&#xff0c;点击入站规则&#xff0c;新建一条规则 新建端口入站规则 端口填写330…

【计算机网络】 基于TCP的简单通讯(客户端)

文章目录 流程伪代码代码实现加载库创建套接字连接服务端收发数据关闭套接字、卸载库 测试 流程伪代码 //1、加载库//2、创建套接字//3、连接服务端while(true){//4、发送数据//5、接收数据} //6、关闭套接字、卸载库代码实现 加载库 int err 0;WORD version MAKEWORD(2, 2…

表单控件拖拽平台都有哪些特点?

什么样的表单控件拖拽平台可以提升办公协作效率&#xff1f;在竞争激烈的当今社会&#xff0c;利用低代码技术平台的优势和特点&#xff0c;可以将企业内部的数据资源真正利用起来&#xff0c;帮助更多领域的客户朋友做出更有竞争优势的经营决策&#xff0c;实现数字化转型和流…

【Verilog 教程】6.3Verilog状态机

关键词&#xff1a;状态机&#xff0c;售卖机 有限状态机&#xff08;Finite-State Machine&#xff0c;FSM&#xff09;&#xff0c;简称状态机&#xff0c;是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具&#xff0c;而且…

0x23根据地址读取内存服务

诊断仪从ECU通过起始地址和内存大小空间来读取指定内存的数据&#xff0c;高地址范围未使用到的字节用0x00去填充。 请求报文格式 肯定响应报文形式

Makefile 优化编译速度

Makefile 优化编译速度 编写一个通用的 Makefile 模板&#xff0c;用来实现任意工程的编译管理架构搭建。 这里我主要有两种想法&#xff1a; 1. 用一个 Makefile 管理所有的文件。所有的文件都放到最顶层的 Makefile 中&#xff0c;一次性直接加载所有的 .c 文件完成编译。 …

使用ElementUI结合Mock完成主页的搭建

目录 一、Mock ( 1 ) 讲述 ( 2 ) 作用 二、引用 三、主页搭建 学习后带来的收获 一、Mock ( 1 ) 讲述 Mock.js是一个用于前端开发中模拟数据的库。它可以帮助开发人员在前端开发过程中模拟接口返回的数据&#xff0c;从而实现前后端分离开发。Mock.js提供了一套简单易…

优维产品最佳实践:实例视图

背 景 模型可以定义很多的字段&#xff0c;当这些字段越来越多的时候&#xff0c;直接打开实例页面&#xff0c;会杂乱无章的呈现出来&#xff0c;对于用户来说无法快速的找到想要的信息&#xff0c;也不便于查看数据。而且并不是所有的字段都一定会录入了数据&#xff0c;常常…

软件测试/测试开发丨结对编程助手 GitHubCopilot

点此获取更多相关资料 简介 GitHub Copilot 是一款 AI 结对程序员&#xff0c;可帮助您更快、更少地编写代码。GitHub Copilot 由 GitHub、OpenAI 和 Microsoft 开发的生成式 AI 模型提供支持。它可作为 Visual Studio Code、Visual Studio、Neovim 和 JetBrains 集成开发环境…

Vovsoft Text Edit Plus 专业文本编辑器工具软件:简洁高效的创作利器

作为一名专业软件评测人员&#xff0c;我有幸使用了一款备受赞誉的文本编辑器工具软件——Vovsoft Text Edit Plus。在这篇评测中&#xff0c;我将客观、细致地分析它的实用性和使用场景&#xff0c;同时揭示它的优缺点&#xff0c;帮助您更好地了解这款软件。 第一部分&#x…

ROS2 从头开始:第 4 部分 - 使用 ROS2 组合构建强大的机器人系统

一、说明 组件编程是软件规模庞大后,有限的程序个体不能满足系统的动态扩张的系统设计方案。组件编程的首要用途就是计算机操作系统。而ROS2也是操作系统,动态扩大或缩减是必然存在的,因此需要组件实现。 组件编程的其它参考资料: 【BOOST C++】组件编程(…

01-http概述

HTTP概述 HTTP使用的是可靠地数据传输协议。HTTP属于应用层协议 Web客户端和服务器 web服务器&#xff1a;又称http服务器&#xff0c;用于存储web内容&#xff0c;并向web客户端提供web内容web客户端&#xff1a;用于请求web服务器的应用软件&#xff0c;常见为浏览器 资源…

Java实现word excel ppt模板渲染与导出及预览 LibreOffice jodconverter

Java Office 一、文档格式转换 文档格式转换是office操作中经常需要进行一个操作&#xff0c;例如将docx文档转换成pdf格式。 java在这方面有许多的操作方式&#xff0c;大致可以分为内部调用&#xff08;无需要安装额外软件&#xff09;&#xff0c;外部调用&#xff08;需…

SW线光源是真实的(点光源)

点光源在渲染下真实 点光源地板反射是对的

uni-app:获取元素宽高

效果 代码 这里我定义的宽为500px,高为200排序,控制台输出的结果是502,202。原因是我设置了上下左右宽度各为1px的border边框导致 核心代码分析 // const query uni.createSelectorQuery();表示创建了一个选择器查询实例。通过这个实例&#xff0c;你可以使用不同的方法来选择…

MYSQL——二、理论基础

Mysql 一、什么是数据库二、数据库管理系统(DBMS)三、数据库与文件系统的区别四、数据库技术构成及发展史1、技术构成2、发展史 五、常见数据库1、关系型数据库2、ACID原则3、关系型数据库的优缺点4、非关系型数据库5、非关系数据库的优点6、DBMS支持的数据模型7、运维对数据库…