RTC实时时钟实验(低功耗、纽扣电池供电)

目录

  • I.MX6U RTC 简介
  • 硬件原理分析
  • 实验程序编写
    • 修改文件MCIMX6Y2.h
    • 编写实验程序
  • 编译下载验证
    • 编写Makefile 和链接脚本
    • 编译下载

实时时钟是很常用的一个外设,通过实时时钟我们就可以知道年、月、日和时间等信息。因此在需要记录时间的场合就需要实时时钟,可以使用专用的实时时钟芯片来完成此功能,但是现在大多数的MCU 或者MPU 内部就已经自带了实时时钟外设模块。比如I.MX6U 内部的SNVS 就提供了RTC 功能,本章我们就学习如何使用I.MX6U 内部的RTC 来完成实时时钟功能。

I.MX6U RTC 简介

如果学习过STM32 的话应该知道,STM32 内部有一个RTC 外设模块,这个模块需要一个32.768KHz 的晶振,对这个RTC 模块进行初始化就可以得到一个实时时钟。I.MX6U 内部也有个RTC 模块,但是不叫作“RTC”,而是叫做“SNVS”,这一点要注意!本章我们参考《I.MX6UL参考手册》,而不是《I.MX6ULL 参考手册》,因为《I.MX6ULL 参考手册》很多SNVS 相关的
寄存器并没有给出来,不知道是为何?但是《I.MX6UL 参考手册》里面是完整的。所以本章我们使用《I.MX6UL 参考手册》,如果直接在《I.MX6UL 参考手册》的书签里面找“RTC”相关的字眼是找不到的。I.MX6U 系列的RTC 是在SNVS 里面,也就是《I.MX6UL 参考手册》的第46 章“Chapter 46 Secure Non-Volatile Storage(SNVS)”。

SNVS 直译过来就是安全的非易性存储,SNVS 里面主要是一些低功耗的外设,包括一个安全的实时计数器(RTC)、一个单调计数器(monotonic counter)和一些通用的寄存器,本章我们肯定只使用实时计数器(RTC)。SNVS 里面的外设在芯片掉电以后由电池供电继续运行,I.MX6U-ALPHA 开发板上有一个纽扣电池,这个纽扣电池就是在主电源关闭以后为SNVS 供电的,如图25.1.1 所示:
在这里插入图片描述
因为纽扣电池在掉电以后会继续给SNVS 供电,因此实时计数器就会一直运行,这样的话时间信息就不会丢失,除非纽扣电池没电了。在有纽扣电池作为后备电源的情况下,不管系统主电源是否断电,SNVS 都正常运行。SNVS 有两部分:SNVS_HP 和SNVS_LP,系统主电源断电以后SNVS_HP 也会断电,但是在后备电源支持下,SNVS_LP 是不会断电的,而且SNVS_LP是和芯片复位隔离开的,因此SNVS_LP 相关的寄存器的值会一直保存着。

SNVS 分为两个子模块:SNVS_HP 和SNVS_LP,也就是高功耗域(SNVS_HP)和低功耗域(SNVS_LP),这两个域的电源来源如下:
SNVS_LP:专用的always-powered-on 电源域,系统主电源和备用电源都可以为其供电。
SNVS_HP:系统(芯片)电源。
SNVS 的这两个子模块的电源如图25.1.2 所示:
在这里插入图片描述

图25.1.2 中各个部分功能如下:
①、VDD_HIGH_IN 是系统(芯片)主电源,这个电源会同时供给给SNVS_HP 和SNVS_LP。
②、VDD_SNVS_IN 是纽扣电池供电的电源,这个电源只会供给给SNVS_LP,保证在系
统主电源VDD_HIGH_IN 掉电以后SNVS_LP 会继续运行。
③、SNVS_HP 部分。
④、SNVS_LP 部分,此部分有个SRTC,这个就是我们本章要使用的RTC。

其实不管是SNVS_HP 还是SNVS_LP,其内部都有一个SRTC,但是因为SNVS_HP 在系统电源掉电以后就会关闭,所以我们本章使用的是SNVS_LP 内部的SRTC。毕竟我们肯定都不想开发板或者设备每次关闭以后时钟都被清零,然后开机以后先设置时钟。

其实不管是SNVS_HP 里面的RTC,还是SNVS_LP 里面的SRTC,其本质就是一个定时器,和我们在第八章讲的EPIT 定时器一样,只要给它提供时钟,它就会一直运行。SRTC 需要外界提供一个32.768KHz 的时钟,I.MX6U-ALPHA 核心板上的32.768KHz 的晶振就是提供这个时钟的。寄存器SNVS_LPSRTCMR 和SNVS_LPSRTCLR 保存着秒数,直接读取这两个寄存器的值就知道过了多长时间了。一般以1970 年1 月1 日为起点,加上经过的秒数即可得到现在的时间和日期,原理还是很简单的。SRTC 也是带有闹钟功能的,可以在寄存器SNVS_LPAR 中写入闹钟时间值,当时钟值和闹钟值匹配的时候就会产生闹钟中断,要使用时钟功能的话还需要进行一些设置,本章我们就不使用闹钟了。

接下来我们看一下本章要用到的与SRTC 相关的部分寄存器,首先是SNVS_HPCOMR 寄存器,这个寄存器我们只用到了位:NPSWA_EN(bit31),这个位是非特权软件访问控制位,如果非特权软件要访问SNVS 的话此位必须为1。

接下来看一下寄存器SNVS_LPCR寄存器,此寄存器也只用到了一个位:SRTC_ENV(bit0),此位为1 的话就使能STC 计数器。

最后来看一下寄存器SNVS_SRTCMR 和SNVS_SRTCLR,这两个寄存器保存着RTC 的秒数,按照NXP 官方的《6UL 参考手册》中的说法,SNVS_SRTCMR 保存着高15 位,SNVS_SRTCLR保存着低32 位,因此SRTC 的计数器一共是47 位。

但是!我在编写驱动的时候发现按照手册上说的去读取计数器值是错误的!具体表现就是时间是混乱的,因此我在查找了NXP 提供的SDK 包中的fsl_snvs_hp.c 以及Linux 内核中的rtc-snvs.c 这两个驱动文件以后发现《6UL 参考手册》上对SNVS_SRTCMR 和SNVS_SRTCLR 的
解释是错误的,经过查阅这两个文件,得到如下结论:

①、SRTC计数器是32位的,不是47位!
②、SNVS_SRTCMR的bit14:0这15位是SRTC计数器的高15位。
③、SNVS_SRTCLR的bit31:bit15这17位是SRTC计数器的低17位。

按照上面的解释去读取这两个寄存器就可以得到正确的时间,如果要调整时间的话也是向这两个寄存器写入要设置的时间值对应的秒数就可以了,但是要修改这两个寄存器的话要先关闭SRTC。

关于SNVS 中和RTC 有关的寄存器就介绍到这里,关于这些寄存器详细的描述,请参考《I.MX6UL 参考手册》第2931 页的46.7 小节。本章我们使用I.MX6U 的SNVS_LP 的SRTC,配置步骤如下:
1、初始化SNVS_SRTC
初始化SNVS_LP 中的SRTC。
2、设置RTC 时间
第一次使用RTC 肯定要先设置时间。
3、使能RTC
配置好RTC 并设置好初始时间以后就可以开启RTC 了。

硬件原理分析

本试验用到的资源如下:
①、指示灯LED0。
②、RGB LCD 接口。
③、SRTC。

SRTC 需要外接一个32.768KHz 的晶振,在I.MX6U-ALPHA 核心板上就有这个32.768KHz的晶振,原理图如图25.2.1 所示:
在这里插入图片描述

实验程序编写

本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 16_rtc。

修改文件MCIMX6Y2.h

在第十三章移植的NXP 官方SDK 包是针对I.MX6ULL 编写的,因此文件MCIMX6Y2.h中的结构体SNVS_Type 里面的寄存器是不全的,我们需要在其中加入本章实验所需要的寄存器,修改SNVS_Type 为如下所示:

1 typedef struct {
2 __IO uint32_t HPLR;
3 __IO uint32_t HPCOMR;
4 __IO uint32_t HPCR;
5 __IO uint32_t HPSICR;
6 __IO uint32_t HPSVCR;
7 __IO uint32_t HPSR;
8 __IO uint32_t HPSVSR;
9 __IO uint32_t HPHACIVR;
10 __IO uint32_t HPHACR;
11 __IO uint32_t HPRTCMR;
12 __IO uint32_t HPRTCLR;
13 __IO uint32_t HPTAMR;
14 __IO uint32_t HPTALR;
15 __IO uint32_t LPLR;
16 __IO uint32_t LPCR;
17 __IO uint32_t LPMKCR;
18 __IO uint32_t LPSVCR;
19 __IO uint32_t LPTGFCR;
20 __IO uint32_t LPTDCR;
21 __IO uint32_t LPSR;
22 __IO uint32_t LPSRTCMR;
23 __IO uint32_t LPSRTCLR;
24 __IO uint32_t LPTAR;
25 __IO uint32_t LPSMCMR;
26 __IO uint32_t LPSMCLR;
27 }SNVS_Type;

编写实验程序

本章实验在上一章例程的基础上完成,更改工程名字为“rtc”,然后在bsp 文件夹下创建名为“rtc”的文件夹,然后在bsp/rtc 中新建bsp_rtc.c 和bsp_rtc.h 这两个文件。在bsp_rtc.h 中输入如下内容:

1 #ifndef _BSP_RTC_H
2 #define _BSP_RTC_H
3 /***************************************************************
4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
5 文件名: bsp_rtc.h
6 作者: 左忠凯
7 版本: V1.0
8 描述: RTC驱动头文件。
9 其他: 无
10 论坛: www.openedv.com
11 日志: 初版V1.0 2019/1/3 左忠凯创建
12 ***************************************************************/
13 #include "imx6ul.h"
14
15 /* 相关宏定义*/
16 #define SECONDS_IN_A_DAY (86400) /* 一天86400秒*/
17 #define SECONDS_IN_A_HOUR (3600) /* 一个小时3600秒*/
18 #define SECONDS_IN_A_MINUTE (60) /* 一分钟60秒*/
19 #define DAYS_IN_A_YEAR (365) /* 一年365天*/
20 #define YEAR_RANGE_START (1970) /* 开始年份1970年*/
21 #define YEAR_RANGE_END (2099) /* 结束年份2099年*/
22
23 /* 时间日期结构体*/
24 struct rtc_datetime
25 {
26 unsigned short year; /* 范围为:1970 ~ 2099 */
27 unsigned char month; /* 范围为:1 ~ 12 */
28 unsigned char day; /* 范围为:1 ~ 31 (不同的月,天数不同).*/
29 unsigned char hour; /* 范围为:0 ~ 23 */
30 unsigned char minute; /* 范围为:0 ~ 59 */
31 unsigned char second; /* 范围为:0 ~ 59 */
32 };
33
34 /* 函数声明*/
35 void rtc_init(void);
36 void rtc_enable(void);
37 void rtc_disable(void);
38 unsigned int rtc_coverdate_to_seconds(struct rtc_datetime
*datetime);
39 unsigned int rtc_getseconds(void);
40 void rtc_setdatetime(struct rtc_datetime *datetime);
41 void rtc_getdatetime(struct rtc_datetime *datetime);
42
43 #endif

第16 到21 行定义了一些宏,比如一天多少秒、一小时多少秒等等,这些宏将用于将秒转换为时间,或者将时间转换为秒。第24 行定义了一个结构体rtc_datetime,此结构体用于描述日期和时间参数。剩下的就是一些函数声明了,很简单。

在文件bsp_rtc.c 中输入如下内容:

/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名: bsp_rtc.c
作者: 左忠凯
版本: V1.0
描述: RTC驱动文件。
其他: 无
论坛: www.openedv.com
日志: 初版V1.0 2019/1/3 左忠凯创建
***************************************************************/
1 #include "bsp_rtc.h"
2 #include "stdio.h"
3
4 /*
5 * @description :初始化RTC
6 */
7 void rtc_init(void)
8 {
9 /*
10 * 设置HPCOMR寄存器
11 * bit[31] 1 : 允许访问SNVS寄存器,一定要置1
12 */
13 SNVS->HPCOMR |= (1 << 31);
14
15 #if 0
16 struct rtc_datetime rtcdate;
17
18 rtcdate.year = 2018U;
19 rtcdate.month = 12U;
20 rtcdate.day = 13U;
21 rtcdate.hour = 14U;
22 rtcdate.minute = 52;
23 rtcdate.second = 0;
24 rtc_setDatetime(&rtcdate); /* 初始化时间和日期*/
25 #endif
26 rtc_enable(); /* 使能RTC */
27 }
28
29 /*
30 * @description : 开启RTC
31 */

文件bsp_rtc.c 里面一共有9 个函数,依次来看一下这些函数的意义。函数rtc_init 明显是初始化rtc 的,主要是使能RTC,也可以在rtc_init 函数里面设置时间。函数rtc_enable 和rtc_disable分别是RTC 的使能和禁止函数。函数rtc_isleapyear 用于判断某一年是否为闰年。函数rtc_coverdate_to_seconds 负责将给定的日期和时间信息转换为对应的秒数。函数rtc_setdatetime
用于设置时间,也就是设置寄存器SNVS_LPSRTCMR 和SNVS_LPSRTCLR 。函数rtc_convertseconds_to_datetime 用于将给定的秒数转换为对应的时间值。函数rtc_getseconds 获取SRTC 当前秒数,其实就是读取寄存器SNVS_LPSRTCMR 和SNVS_LPSRTCLR,然后将其结合成32 位的值。最后一个函数rtc_getdatetime 是获取时间值。

我们在main 函数里面先初始化RTC,然后进入3S 倒计时,如果这3S 内按下了KEY0 按键,那么就设置SRTC 的日期。如果3S 倒计时结束以后没有按下KEY0,也就是没有设置SRTC时间的话就进入while 循环,然后读取RTC 的时间值并且显示在LCD 上,在文件main.c 中输入如下所示内容:

1 #include "bsp_clk.h"
2 #include "bsp_delay.h"
3 #include "bsp_led.h"
4 #include "bsp_beep.h"
5 #include "bsp_key.h"
6 #include "bsp_int.h"
7 #include "bsp_uart.h"
8 #include "bsp_lcd.h"
9 #include "bsp_lcdapi.h"
10 #include "bsp_rtc.h"
11 #include "stdio.h"
12
13 /*
14 * @description : main函数
15 * @param : 无
16 * @return : 无
17 */
18 int main(void)
19 {
20 unsigned char key = 0;
21 int t = 0;
22 int i = 3; /* 倒计时3S */
23 char buf[160];
24 struct rtc_datetime rtcdate;
25 unsigned char state = OFF;
26
27 int_init(); /* 初始化中断(一定要最先调用!) */
28 imx6u_clkinit(); /* 初始化系统时钟*/
29 delay_init(); /* 初始化延时*/
30 clk_enable(); /* 使能所有的时钟*/
31 led_init(); /* 初始化led */
32 beep_init(); /* 初始化beep */
33 uart_init(); /* 初始化串口,波特率115200 */
34 lcd_init(); /* 初始化LCD */
35 rtc_init(); /* 初始化RTC */
36
37 tftlcd_dev.forecolor = LCD_RED;
38 lcd_show_string(50, 10, 400, 24, 24, /* 显示字符串*/
(char*)"ALPHA-IMX6UL RTC TEST");
39 tftlcd_dev.forecolor = LCD_BLUE;
40 memset(buf, 0, sizeof(buf));
41
42 while(1)
43 {
44 if(t==100) /* 1s时间到了*/
45 {
46 t=0;
47 printf("will be running %d s......\r", i);
48
49 lcd_fill(50, 40,370, 70, tftlcd_dev.backcolor); /* 清屏*/
50 sprintf(buf, "will be running %ds......", i);
51 lcd_show_string(50, 40, 300, 24, 24, buf);
52 i--;

第35 行调用函数rtc_init 初始化RTC。

第42 到73 行是倒计时3S,如果在这3S 内按下了KEY0 按键就会调用函数rtc_setdatetime设置当前的时间。如果3S 倒计时结束以后没有按下KEY0 那就表示不需要设置时间,跳出循环,执行下面的代码。

第79 到89 行就是主循环,此循环每隔1S 调用函数rtc_getdatetime 获取一次时间值,并且通过串口打印给SecureCRT 或者在LCD 上显示。

编译下载验证

编写Makefile 和链接脚本

修改Makefile 中的TARGET 为rtc,然后在在INCDIRS 和SRCDIRS 中加入“bsp/rtc”,修改后的Makefile 如下:

1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= rtc
3
4 /* 省略掉其它代码...... */
5
6 INCDIRS := imx6ul \
7 stdio/include \
8 bsp/clk \
9 bsp/led \
10 bsp/delay \
11 bsp/beep \
12 bsp/gpio \
13 bsp/key \
14 bsp/exit \
15 bsp/int \
16 bsp/epittimer \
17 bsp/keyfilter \
18 bsp/uart \
19 bsp/lcd \
20 bsp/rtc
21
22 SRCDIRS := project \
23 stdio/lib \
24 bsp/clk \
25 bsp/led \
26 bsp/delay \
27 bsp/beep \
28 bsp/gpio \
29 bsp/key \
30 bsp/exit \
31 bsp/int \
32 bsp/epittimer \
33 bsp/keyfilter \
34 bsp/uart \
35 bsp/lcd \
36 bsp/rtc
37
38 /* 省略掉其它代码...... */
39
40 clean:
41 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

第2 行修改变量TARGET 为“rtc”,也就是目标名称为“rtc”。
第20 行在变量INCDIRS 中添加RTC 驱动头文件(.h)路径。
第36 行在变量SRCDIRS 中添加RTC 驱动驱动文件(.c)路径。

链接脚本保持不变。

编译下载

使用Make 命令编译代码,编译成功以后使用软件imxdownload 将编译完成的rtc.bin 文件下载到SD 卡中,命令如下:

chmod 777 imxdownload //给予imxdownload 可执行权限,一次即可
./imxdownload rtc.bin /dev/sdd //烧写到SD 卡中,不能烧写到/dev/sda 或sda1 设备里面!

烧写成功以后将SD 卡插到开发板的SD 卡槽中,然后复位开发板。程序一开始进入3S倒计时,如图25.4.2.1 所示:
在这里插入图片描述
如果在倒计数结束之前按下KEY0,那么RTC 就会被设置为我们代码中设置的时间和日期值,RTC 运行如图24.4.2.2 所示:
在这里插入图片描述
我们在main 函数中设置的时间是2018 年1 月15 日,16 点23 分0 秒,在倒计数结束之前按下KEY0 按键设置RTC,图24.4.2.2 中的时间就是我们设置以后的时间。

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

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

相关文章

Python(21)_input用户交互

name input("请输入你的名字&#xff1a;") age input("请输入你的年龄&#xff1a;") print("我的名字是&#xff1a;"name" 年龄是&#xff1a;"age) #print(name) #print(age) 这是在本地调试的结果。因为程序是在远程服务器上执…

多点电容触摸屏实验

目录多点电容触摸简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载随着智能手机的发展&#xff0c;电容触摸屏也得到了飞速的发展。相比电阻触摸屏&#xff0c;电容触摸屏有很多的优势&#xff0c;比如支持多点触控、不需要按压&#xff0c;只需要轻轻…

博客园自动添加版权说明,自动添加文章链接

功能&#xff1a; 1.给每一篇文章开头加上版权说明&#xff1b; 2.自动获取当前文章地址&#xff1b; 3.做了装饰。 将以下代码放在页首Html代码内即可&#xff1a; <script type"text/javascript"> var setMyBlog {setCopyright: function() {//设置版权信息…

如何添加地图控件到Windows Phone 8的页面中

原文 如何添加地图控件到Windows Phone 8的页面中 本主题介绍了各种方法来添加一个地图控件到Windows Phone 8的项目。该地图控件在Windows Phone的SDK 8.0的库的一部分。因为地图的控制是不是在内存中的核心控制&#xff0c;它必须被正确引用&#xff0c;然后才能使用它。您还…

LCD背光调节实验

目录LCD 背光调节简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载不管是使用显示器还是手机&#xff0c;其屏幕背光都是可以调节的&#xff0c;通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕&#xff0c;在光线…

Mercurial(Hg)基本操作

Mercurial(Hg)基本操作 来源 https://www.cnblogs.com/gb2013/archive/2012/05/18/Mercurial_Basic.html Mercurial简介 Mercurial是一款非常优秀的分布式版本控制系统(DCVS)&#xff0c;具有高效率、跨平台、可扩展、使用简便且开源等优点&#xff0c;是目前最为流行的版本控制…

SPI实验

目录SPI & ICM-20608 简介SPI 简介SPI四线SPI四种工作模式SPI时序图I.MX6U ECSPI 简介ICM-20608 简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载同I2C 一样&#xff0c;SPI 是很常用的通信接口&#xff0c;也可以通过SPI 来连接众多的传感器。相…

ADC实验(读取引脚电压值)

目录ADC 简介什么是ADCI.MX6ULL ADC 简介ADC寄存器介绍配置步骤硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载ADC 是一种常见的外设&#xff0c;你可以在STM32 上见到它&#xff0c;在I.MX 6ULL 上依然能看到它的存在。通过读取GPIO 引脚的高低电平我们…

Linux CAN 驱动实验

目录CAN 协议简析何为CANCAN 电气属性显隐性电平接线端接电阻速度距离CAN 协议1、数据帧2、遥控帧3、错误帧4、过载帧5、帧间隔CAN 速率I.MX6ULL FlexCAN 简介硬件原理图分析实验程序编写修改设备树使能Linux 内核自带的FlexCAN 驱动FlexCAN 测试检查CAN 网卡设备是否存在移植i…

MySQL存储引擎MyISAM和 InnoDB

2019独角兽企业重金招聘Python工程师标准>>> 区别 事务处理MyISAM强调性能,但是不提供事务支持InnoDB提供事务支持,外部键等CURD操作如果执行大量SELECT,MyISAM更合适(读)如果执行大量INSERT/UPDATE,InnoDB更合适(写)DELETE FROM table时&#xff0c;InnoDB不会重新…

Luogu 4721 【模板】分治 FFT

还不会这题的多项式求逆的算法。 发现每一项都是一个卷积的形式&#xff0c;那么我们可以使用$NTT$来加速&#xff0c;直接做是$O(n^2logn)$的&#xff0c;我们考虑如何加速转移。 可以采用$cdq$分治的思想&#xff0c;对于区间$[l, r]$中的数&#xff0c;先计算出$[l, mid]$中…

根文件系统构建(Buildroot 方式)

目录何为buildroot&#xff1f;buildroot 简介buildroot 下载buildroot 构建根文件系统配置buildroot编译buildrootbuildroot 根文件系统测试buildroot 第三方软件和库的配置buildroot 下的busybox 配置busybox 配置busybox 中文字符的支持编译busybox根文件系统测试前面我们学…

Jquery weui picker 支持label和value

万年没更新了. 最近用jquery weui. 在使用picker时需要一些问题. 就是让picker 显示label, 但是取值的时候取value用于存储. 官网例子如下 Jquery-weui 官网 : 点这里 写这篇文章时&#xff0c;用的版本是1.2.1版本 $("#picker-name").picker({title: "请选择您…

Linux—任务计划

1、周期性任务计划&#xff1a;管理系统的过程中&#xff0c;我们并不是每次都直接执行脚本或者命令&#xff0c;有时候需要让脚本、命令以及系统等在指定的时间按照我们的意愿执行我们设定好的脚本或者命令&#xff0c;这时候就需要使用到Linux任务计划的功能了&#xff0c;但…

计算机网络第1章(概述)

B站视频&#xff1a;计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09; 网址&#xff1a;https://www.bilibili.com/video/BV1c4411d7jb?p61 目录图示说明1.1、计算机网络在信息时代的作用我国互联网发展状况1.2、因特网概述1、网络、互连网&#xff08;互联网&…

Linux命令(七)Linux用户管理和修改文件权限

1. 用户管理 1.1 创建用户/设置密码/删除用户 &#xff08;-m很重要&#xff0c;自动添加用户家目录&#xff09; 创建用户组dev, 给用户组dev新建xiaoqin用户&#xff0c;给新用户设置密码&#xff01; 1.2 查看用户信息 1.3 设置用户主组/附加组 &#xff08;常使用修改用户附…

元模型驱动

感谢徐昊给我们传授这么好的思想。虽然我现在还没有全部弄明白——————————在网上查到了元数据的解释是关于数据的数据。那么元模型就是关于模型的模型。抽象的过程就是形成元模型的过程。建模的过程就是抽象的过程。我们要形成object的模型&#xff0c;所以建立了的是…

2月末周全球域名解析商Top15:万网DNSPod份额均上涨

IDC评述网&#xff08;idcps.com&#xff09;03月11日报道&#xff1a;据域名统计机构WebHosting.info最新数据&#xff0c;在2月末周&#xff08;截至3月3日&#xff09;期间&#xff0c;我国仍是两名域名解析服务商跻身进全球前十五强。其中&#xff0c;中国万网排名第9&…

计算机网络第4章(网络层)

B站视频&#xff1a;计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09; 网址&#xff1a;https://www.bilibili.com/video/BV1c4411d7jb?p61 目录4.1、网络层概述简介总结4.2、网络层提供的两种服务面向连接的虚电路服务无连接的数据报服务虚电路服务与数据报服务的…

Struts2中action接受参数方法

Struts2中Action接收参数的方法主要有以下三种&#xff1a;1.使用Action的属性接收参数&#xff1a; a.定义&#xff1a;在Action类中定义属性&#xff0c;创建get和set方法&#xff1b; b.接收&#xff1a;通过属性接收参数&#xff0c;如&#xff1a;userName&#xff…