TQ210 —— LCD

TQ210 —— LCD


一、LCD控制器
1、S5PV210 LCD控制器
      要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多的MCU内部都集成了LCD控制器,如S5PV210等。通过LCD控制器就可以产生LCD驱动器所需要的控制信号来控制STN/TFT屏了。
      LCD控制器可以通过编程支持不同LCD屏的要求,例如行和列像素数,数据总线宽度,接口时序和刷新频率等。
      LCD控制器的主要作用,是将定位在系统存储器中的显示缓冲区中的LCD图像数据传送到外部LCD驱动器,并产生必要的控制信号,例如RGB_VSYNC, RGB_HSYNC, RGB_VCLK等。
 
2、主要特性
(1)支持4种接口类型:RGB/i80/ITU 601(656)/YTU444 
(2)支持单色、4级灰度、16级灰度、256色的调色板显示模式 
(3)支持64K和16M色非调色板显示模式 
(4)支持多种规格和分辨率的LCD 
(5)虚拟屏幕最大可达16MB 
(6)5个256*32位调色板内存

(7)支持透明叠加


3、控制器子模块
(1)、主要由VSFR, VDMA, VPRCS , VTIME和视频时钟产生器几个模块组成:
(2)、VSFR由121个可编程控制器组,一套gamma LUT寄存器组(包括64个寄存器),一套i80命令寄存器组(包括12个寄存器)和5块256*32调色板存储器组成,主要用于对lcd控制器进行配置。
(3)、VDMA是LCD专用的DMA传输通道,可以自动从系统总线上获取视频数据传送到VPRCS,无需CPU干涉。
(4)、VPRCS收到数据后组成特定的格式(如16bpp或24bpp),然后通过数据接口(RGB_VD, VEN_VD, V656_VD or SYS_VD)传送到外部LCD屏上。 
(5)、VTIME模块由可编程逻辑组成,负责不同lcd驱动器的接口时序控制需求。VTIME模块产生 RGB_VSYNC, RGB_HSYNC, RGB_VCLK, RGB_VDEN, VEN_VSYNC等信号。

二、接口信号
FIMD显示控制器信号(我写的word表格怎么成这样了?)
Signal I/O Description LCD Type 
LCD_HSYNC O 水平同步信号 RGB I/F 
LCD_VSYNC O 垂直同步信号
LCD_VDEN O 数据使能
LCD_VCLK O 视频时钟
LCD_VD[23:0] O LCD像素数据输出
SYS_OE O 输出使能
VSYNC_LDI O Indirect i80接口,垂直同步信号 i80 I/F 
SYS_CS0 O Indirect i80接口,片选LCD0
SYS_CS1 O Indirect i80接口,片选LCD1
SYS_RS O Indirect i80接口,寄存器选择信号
SYS_WE O Indirect i80接口,写使能信号
SYS_VD[23:0] IO Indirect i80接口,视频数据输入输出
SYS_OE O Indirect i80接口,输出使能信号
VEN_HSYNC O 601接口水平同步信号 ITU 601/656 I/F 
VEN_VSYNC O 601接口垂直同步信号
VEN_HREF O 601接口数据使能
V601_CLK O 601接口数据时钟
VEN_DATA[7:0] O 601接口YUV422格式数据输出
V656_DATA[7:0] O 656接口YUV422格式数据输出
V656_CLK O 656接口数据时钟
VEN_FIELD O 601接口域信号
其中主要的RGB接口信号:
(1)、LCD_HSYNC: 行同步信号,表示一行数据的开始,LCD控制器在整个水平线(整行)数据移入LCD驱动器后,插入一个LCD_HSYNC信号; 
(2)、LCD_VSYNC:  帧同步信号,表示一帧数据的开始,LCD控制器在一个完整帧显示完成后立即插入一个LCD_VSYNC信号,开始新一帧的显示;VSYNC信号出现的频率表示一秒钟内能显示多少帧图像,称为“显示器的频率” 
(3)、LCD_VCLK:像素时钟信号,表示正在传输一个像素的数据;
(4)、LCD_VDEN: 数据使能信号;
(5)、LCD_VD[23:0]: LCD像素数据输出端口

三、工作时序
下图是LCD RGB接口工作时序图:

 
上面时序图上各时钟延时参数的含义如下:(这些参数的值,LCD产生厂商会提供相应的数据手册) 
VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数
VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数
VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算
HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数
HFPD(horizontal front porth):表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数
HSPW(horizontal sync pulse width):表示水平同步信号的宽度,用VCLK计算
(1)帧的传输过程
<1>、VSYNC信号有效时,表示一帧数据的开始,   信号宽度为 (VSPW + 1)个HSYNC信号周期,即(VSPW + 1)个无效行;
< 2>、VSYNC信号脉冲之后,总共还要经过(VBPD + 1)个HSYNC信号周期,有效的行数据才出现; 所以,在VSYNC信号有效之后,还要经过(VSPW + 1  + VBPD + 1)个无效的行;
<3>、随即发出(LINEVAL + 1)行的有效数据;
<4>、最后是(VFPD + 1)个无效的行;
(2)行中像素数据的传输过程
<1>、HSYNC信号有效时,表示一行数据的开始,信号宽度为(HSPW + 1)个VCLK信号周期,即(HSPW + 1)个无效像素;
<2>、HSYNC信号脉冲之后,还要经过(HBPD + 1)个VCLK信号周期,有效的像素数据才出现;
<3>、随后发出(HOZVAL + 1)个像素的有效数据;
<4>、最后是(HFPD + 1)个无效的像素;
(3)将VSYNC、HSYNC、VCLK等信号的时间参数设置好之后,并将帧内存的地址告诉LCD控制器,它即可自动地发起DMA传输从帧内存中得到图像数据,最终在上述信号的控制下出现在数据总线VD[23:0]上。用户只需要把要显示的图像数据写入帧内存中。 

四、外部接口
S5PV210外部LCD控制器接口图如下:
 
下图是信号的引脚连接描述:
  
(1)16M(24BPP)色的显示模式 
用24位的数据来表示一个像素的颜色,每种颜色使用8位
 LCD控制器从内存中获得某个像素的24为颜色值后,直接通过VD[23:0]数据线发送给LCD;
在内存中,使用4个字节(32位)来表示一个像素,其中的3个字节从高到低分别表示红、绿、蓝,剩余的1个字节无效;   
 (2)64K(16BPP)色的显示模式 
用16位的数据来表示一个像素的颜色;
格式又分为两种:
          5:6:5 ——使用5位来表示红色,6位表示绿色,5位表示蓝色  ;
          5:5:5:1——分别使用5位来表示红、绿、蓝,最后一位表示透明度;  

每种bpp模式下的引脚定义:
   

五、寄存器
主要寄存器如下:(其它参照用户手册S5PV210X_UserManual.pdf)
(1)VIDCON0: 配置视频输出格式,显示使能(VIDCON0,R/W,ADDRESS=0XF800_0000)
     
VIDCON1: RGB 接口控制信号 
VIDCON2 : 输出数据格式控制 
VIDCON3 : 图像增强控制 
I80IFCONx: i80接口控制信号 
ITUIFCON : ITU接口控制信号 
VIDTCONx: 配置视频输出时序及显示大小
WINCONx: 每个窗口特性设置 
VIDOSDxA,B : 窗口位置设置 
VIDOSDxC,D: OSD大小设置

六、LCD配置步骤(S5PV210手册给出了)
1. VIDCON0: Configures video output format and displays enable/disable.
2. VIDCON1: Specifies RGB I/F control signal.
3. VIDCON2: Specifies output data format control.
4. VIDCON3: Specifies image enhancement control.
5. I80IFCONx: Specifies CPU interface control signal.
6. VIDTCONx: Configures video output timing and determines the size of display.
7. WINCONx: Specifies each window feature setting.
8. VIDOSDxA, VIDOSDxB: Specifies window position setting.
9. VIDOSDxC,D: Specifies OSD size setting.
10. VIDWxALPHA0/1: Specifies alpha value setting.
11. BLENDEQx: Specifies blending equation setting.
12. VIDWxxADDx: Specifies source image address setting.
13. WxKEYCONx: Specifies color key setting register.
14. WxKEYALPHA: Specifies color key alpha value setting.
15. WINxMAP: Specifies window color control.
16. GAMMALUT_xx: Specifies gamma value setting.
17. COLORGAINCON: Specifies color gain value setting.
18. HUExxx: Specifies Hue coefficient and offset value setting.
19. WPALCON: Specifies palette control register.
20. WxRTQOSCON: Specifies RTQoS control register.
21. WxPDATAxx: Specifies Window Palette Data of each Index.
22. SHDOWCON: Specifies Shadow control register.
23. WxRTQOSCON: Specifies QoS control register
实际中,我们还需要配置 LCD 相关信号引脚(GPIO),以及背光控制引脚。

关键点解析:
1、 LCD 时钟源的确定(参考 S5PV210 芯片手册时钟部分)
在 VIDCON0 寄存器中的 CLKSEL_F 域指定 LCD 的时钟源可以是 HCLK 和 SCLK_FIMD。S5PV210 由 3 个时钟域组成,其中 DSYS 域为 FIMD 提供时钟,FIMD 就是 Fully Interactive Mobile Display(完全交互式移动显示设备),即我们要操作的 LCD 控制器。所以上面的 HCLK 为 HCLK_DSYS,由 MOUT_DSYS 分频得到,freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) = 667 / (3 + 1) = 166MHz,而 SCLK_FIMD 由 MOUT_FIMD 分频得到,而 MOUT_FIMD 的时钟源由 SCLK_SRC1 寄存器中的 FIMD_SEL域确定。
2、在 S5PV210 芯片手册 1.3.1 BRIEF DESCRIPTION OF THE SUB-BLOCK 中提到
Using the display controller data, you can select one of the above data paths by setting DISPLAY_PATH_SEL[1:0] (0xE010_7008). For more information, refer to Chapter, "Section 02.03. Clock controller".我们需要配置这个寄存器
3、 VIDCON1 中配置 HSYNC、 VSYNC、 VDEN 的极性是否反转,这要对比 S5PV210 中的 LCD 时序图和LCD 芯片手册中的 LCD 时序图,如果有效信号的电平或上升沿或下降沿相同,则不反转,否则要反转。
4、 S5PV210 显示控制器有 5 个窗口,每个窗口有 3 个视频缓冲区,通过 WINCON0 寄存器 BUFSEL选择哪一个,这在配置帧缓存地址时用到。
添加 lcd 后,代码已经增大至 37kB,而 BL1 最大为 16KB,所以需要重定位, 
初始化时钟、串口、 DDR,设置栈,然后跳转到 DDR 中执行 bl2.bin, 在 bl2.bin 中进行 lcd 初始化,画线、画圆。

部分代码如下:

#ifndef LCD_H_
#define LCD_H_#include "types.h" // 重定义了一些类型#define RED	0xFF0000
#define GREEN	0x00FF00
#define BLUE	0x0000FFvoid lcd_init();
void backlight_ctl(u8 ctl);
void lcd_enable(u8 enable);
void draw_pixel(int x, int y, u32 color);
void clear_screen();
void draw_line(int x0, int y0, int x1, int y1, u32 color);
void draw_circle(int x, int y, int r, u32 color);#endif
#include "lcd.h"#define GPD0CON			*((volatile u32 *)0xE02000A0)	// 00000001
#define GPD0DAT			*((volatile u32 *)0xE02000A4)	// 00000001#define GPF0CON			*((volatile u32 *)0xE0200120)	// 22222222
#define GPF1CON			*((volatile u32 *)0xE0200140)	// 22222222
#define GPF2CON			*((volatile u32 *)0xE0200160)	// 22222222
#define GPF3CON			*((volatile u32 *)0xE0200180)	// 00002222#define DISPLAY_CONTROL	*((volatile u32 *)0xE0107008)	// 00000002#define VIDCON0			*((volatile u32 *)0xF8000000)	// 41b10133
#define VIDCON1			*((volatile u32 *)0xF8000004)	// 01b6c060
#define VIDCON2			*((volatile u32 *)0xF8000008)	// 00000000
#define VIDTCON0		*((volatile u32 *)0xF8000010)	// 0009150c
#define VIDTCON1		*((volatile u32 *)0xF8000014)	// 001a0d13
#define VIDTCON2		*((volatile u32 *)0xF8000018)	// 000efb1f
#define VIDTCON3		*((volatile u32 *)0xF800001C)	// 00000000
#define WINCON0			*((volatile u32 *)0xF8000020)	// 0000802d
#define SHODOWCON		*((volatile u32 *)0xF8000034)	// 00000001
#define VIDOSD0A		*((volatile u32 *)0xF8000040)	// 00000000
#define VIDOSD0B		*((volatile u32 *)0xF8000044)	// 003203bf
#define VIDOSD0C		*((volatile u32 *)0xF8000048)	// 000bb800
#define VIDW00ADD0B0	*((volatile u32 *)0xF80000A0)	// 28000000
#define VIDW00ADD1B0	*((volatile u32 *)0xF80000D0)	// 28177c80#define VBPD	23
#define VFPD	22
#define VSPW	2
#define HEIGHT	480#define HBPD	46
#define HFPD	210
#define HSPW	2
#define WIDTH	800
#define BPP		24static u32 bytes_per_line;
static u32 frame_buffer_size;
static u32 frame_buffer_addr = 0x28000000;void lcd_init()
{GPF0CON  = 0x22222222;						/* LCD_VD[3:0] LCD_VCLK LCD_VDEN LCD_VSYNC LCD_HSYNC */GPF1CON  = 0x22222222;						/* LCD_VD[11:4] */GPF2CON	 = 0x22222222;						/* LCD_VD[19:12] */GPF3CON	 = 0x00002222;						/* LCD_VD[23:20] */GPD0CON  = (GPD0CON & ~0xF) | (0x1 << 0);	/* LCD PWR(backlight) */DISPLAY_CONTROL = (2 << 0);					/* Display path selection:RGB=FIMD I80=FIMD ITU=FIMD */bytes_per_line = WIDTH;if (BPP > 16)bytes_per_line *= 32;elsebytes_per_line *= BPP;bytes_per_line /= 8;frame_buffer_size = bytes_per_line * HEIGHT;/* Configures video output format and displays enable/disable */VIDCON0  = 	(5 << 6) |				/* CLKVAL = 4, HCLK(166MHz) / (5 + 1) = 27MHz */(1 << 4) |				/* Selects the clock source as divide using CLKVAL_F */(0 << 2);				/* Selects the video clock source:HCLK=166MHz *//* Specifies RGB I/F control signal */VIDCON1  = 	(0 << 7) |				/* Video data is fetched at VCLK falling edge */(1 << 6) |				/* Inverted HSYNC pulse polarity */(1 << 5) |				/* Inverted VSYNC pulse polarity */(0 << 4);				/* Normal VDEN signal polarity ?????*//* Specifies output data format control */VIDCON2  = 	(0b000 << 19) |			/* RGB interface output order(Even line, line #2,4,6,8):RGB */(0b000 << 16);			/* RGB interface output order(Odd line, line #1,3,5,7):RGB *//* Configures video output timing and determines the size of display */VIDTCON0 =	(VBPD << 16) |			/* VBPD */(VFPD << 8) |			/* VFPD */(VSPW << 0);			/* VSPW */VIDTCON1 =	(HBPD << 16) |			/* HBPD */(HFPD << 8) |			/* HFPD */(HSPW << 0);			/* HSPW */VIDTCON2 = 	((HEIGHT - 1) << 11) |	/* vertical size of display(LINEVAL + 1) */(WIDTH - 1);			/* horizontal size of display(HOZVAL + 1) */VIDTCON3 =	(0b1 << 31);			/* Enables VSYNC Signal Output */WINCON0  =	(0 << 30) |				/* BUFSEL_H = 0 */(0 << 20) |				/* BUFSEL_L = 0, BUFSEL=0b00(Selects the Buffer set 0) */(1 << 15) |				/* the Word swap Enable */(0xB << 2);				/* Unpacked 24 bpp ( non-palletized R:8-G:8-B:8 ) *//* Specifies window position setting */VIDOSD0A = 	(0 << 11) | 0;			/* LeftTop */VIDOSD0B = 	((WIDTH - 1) << 11) |	/* RightBotX */(HEIGHT - 1);			/* RightBotY *//* Specifies the Window Size:Height * Width (Number of Word) */VIDOSD0C = frame_buffer_size / 4;/* the start address for Video frame buffer */VIDW00ADD0B0 =  frame_buffer_addr;VIDW00ADD1B0 =  VIDW00ADD0B0 + frame_buffer_size;SHODOWCON = 0x1;	/* Enables Channel 0 */
}void backlight_ctl(u8 ctl)
{if (ctl)GPD0DAT |= 1;elseGPD0DAT &= ~1;
}void lcd_enable(u8 enable)
{if (enable){	VIDCON0 |= 0x3;WINCON0 |= 1;}else{WINCON0 &= ~1;/* see the note in the framebuffer datasheet about why you** cannot take both of these bits down at the same time. */if (VIDCON0 & (1 << 1))VIDCON0 &= ~1;}
}void draw_pixel(int x, int y, u32 color)
{u32 *p = (u32 *)frame_buffer_addr;*(p + y * bytes_per_line / 4 + x) = color;
}void clear_screen()
{int x, y;for (y = 0; y < HEIGHT; y++){for (x = 0; x < WIDTH; x++)draw_pixel(x, y, 0);}
}void draw_line(int x0, int y0, int x1, int y1, u32 color)
{int x, y, dx, dy, Dx, Dy, e, i;Dx = x1 - x0;Dy = y1 - y0;dx = x1 - x0;if (dx < 0)dx *= -1;dy = y1 - y0;if (dy < 0)dy *= -1;x = x0;y = y0;if(dy > dx){e = -dy;for(i = 0; i < dy; i++){draw_pixel(x, y, color);if(Dy >= 0)y++;  elsey--;   e += 2 * dx;if(e >= 0){if(Dx >= 0)x++;elsex--; e -= 2 * dy;}}}else{e = -dx;for(i = 0; i < dx; i++){draw_pixel(x, y, color);if(Dx >= 0)x++;elsex--;e += 2 * dy;if(e >= 0){if(Dy >= 0)y++;elsey--;e -= 2 * dx;}}}
}void draw_circle(int x, int y, int r, u32 color)
{int a, b, num; a = 0; b = r; while(2 * b * b >= r * r) { draw_pixel(x + a, y - b,color); draw_pixel(x - a, y - b,color); draw_pixel(x - a, y + b,color); draw_pixel(x + a, y + b,color); draw_pixel(x + b, y + a,color); draw_pixel(x + b, y - a,color); draw_pixel(x - b, y - a,color); draw_pixel(x - b, y + a,color); a++; num = (a * a + b * b) - r*r; if(num > 0) { b--; a--; } } 
}

#include "lcd.h"int main()
{	lcd_init();backlight_ctl(1);lcd_enable(1);clear_screen();draw_line(10, 10, 750, 450, RED);draw_circle(150, 150, 150, BLUE);return 0;
}


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

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

相关文章

微信表情都戒烟了

昨天看到最新的微信表情是这样的原来的抽烟表情被替换成了这释放出一个信号&#xff0c;就是「抽烟不酷了」不过我想说&#xff0c;只戴着一个绿帽子&#xff0c;嘴巴里面什么都没有&#xff0c;好像也不酷啊。难道重点就是那个墨镜????&#xff1f;不过&#xff0c;在PC版…

Python 类的属性和实例属性 Python 的动态语言

#定义一下类, 含有类属性 aaa, >>> class Aa: ... aaa 10... #对类 Aa实例化出一个实例 a1>>> a1 Aa() >>> print(a1.__dict__)#查看实例并没有自己的方法和属性{}>>> a1.aaa #但是这个实例在调用属性的时候, 发现自己没有这个属性, 于…

高效KMP字符匹配算法就这么简单

1、聊一聊上一篇文章"暴力"字符匹配算法的C语言实现2、KMP算法介绍1KMP介绍KMP是一种字符匹配算法&#xff0c;为啥叫KMP呢&#xff1f;因为是由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt大佬提出来的。那一些小伙伴会问了怎么不叫"DJV算法"呢?因为老外…

TQ210 —— NandFlash

TQ210 —— nandflashTQ210 开发板板载一片 1Gbyte 的 NAND FLASH——K9K8G08U0B&#xff0c;通过查询K9K8G08U0B 芯片手册可以得到如下信息&#xff1a;&#xff08;理论知识不再介绍&#xff09;K9K8G08U0B : (1G 32M) x 8bit 总大小Data Register : (2K 64) x 8bit 数据寄…

涂鸦赞助的500个开发套件,先到先得

来源 | 涂鸦跟涂鸦申请的福利&#xff0c;给喜欢开发的同学发放开发套件&#xff0c;只要是不是专门白嫖党&#xff0c;数量可以不做限制。去年疫情突发&#xff0c;封城、封小区以及人员隔离&#xff0c;让原本享受千般宠爱的主子们变成了靠吃猫砂、塑料袋度日的小可怜&#x…

Linux-C 编程 / 网络 / 超迷你的 web server

一、为生活寻找固定的支撑点1. 什么是生活的支撑点&#xff1f;让自己感到些许痛苦&#xff0c;但却会带来实实在在的充实感和成就感的事情。举个栗子&#xff0c;我的支点是运动、看书、研究技术。2. 固定的支撑点很重要&#xff1a;三个固定的要素&#xff1a;时间 / 空间 / …

20165326 java第四周学习笔记

第四周学习笔记 ch5 子类和父类子类只能有一个父类使用关键字extendsyclass 子类 extends 父类系统默认的祖先类Object&#xff08;java.lang包中&#xff09;继承&#xff1a;子类继承父类的方法可以直接作为实例方法调用&#xff0c;继承的成员变量和方法的访问权限不变&…

用VSTS进行网站压力测试

VSTS提供了一个丰富、强大的工具平台&#xff0c;融合了软件开发领域的各个角色&#xff0c;涵盖软件开发生命周期的各个阶段&#xff0c;包括设计&#xff0c;开发&#xff0c;测试&#xff0c;管理&#xff0c;而这一整套构件的融会贯通&#xff0c;让它可以有效地改善软件开…

第四周选做作业

相关知识点的总结 通过命令行引入参数递归循环课上内容的补做&#xff0c;结果截图 未完成内容:递归与循环 补做教材第二章&#xff0c;第三章编程题目 参考资料 2016-2017-2 《Java 程序设计》课堂实践项目编写一个Java应用程序,输出全部的希腊字母。_百度知道[]转载于:https:…

数据结构和算法,也就那么回事儿

金三银四来了&#xff0c;各大厂动静不小&#xff0c;都在储备人才&#xff0c;绝对是程序员面试的黄金时间了&#xff0c;不少同学也在后台反馈面试中遇到的一些问题&#xff0c;所以今天想跟大家说说算法。说起算法&#xff0c;那大厂面试是绝对必考的&#xff0c;可以说是一…

SecureCRT护眼设置

SecureCRT护眼设置Option —— Global Options —— Terminal —— Appearance —— ANSI COlor从左至右&#xff0c;从上至下值分别为&#xff08;RGB元组&#xff09;&#xff1a; 1&#xff1a;(0,43,53) (128,128,0) (0,160,0) (160,160,0) (255,128,128) (…

北美暴风雨,Linux5.12被延迟6天发布

上个月中旬&#xff0c;因为罕见的严寒天气和暴风雪&#xff0c;美国得州和俄勒冈州波特兰遭遇了持续多天的停电。Linux 创始人 Linus Torvalds 就生活在波特兰&#xff0c;多年来他一直在家中远程工作&#xff0c;并负责新内核的最终发布。之前我们报道过&#xff0c;内核社区…

C#复习笔记(3)--C#2:解决C#1的问题(可空值类型)

可空值类型 C#2推出可空类型来表示可以为null的值类型。这是一个呼声很高的需求&#xff0c;因为在常用的数据库中都是允许某些值类型可为空的。那么为什么值类型就不能为空呢&#xff1f;内存中用一个全0的值来表示null&#xff0c;但是全0的地址说明了这个内存空间是被清除了…

ISA之三种客户端访问

我们已经懂得怎么搭建ISA2006.我们今天来利用ISA访问外网&#xff01;顺便说声如果你IP&#xff0c;网关&#xff0c;DNS什么都没问题。那么你可以看看你的NAT处理&#xff01;下面我们看看我们的试验拓扑&#xff01;我们在ISA的服务器上做访问规则&#xff01;来允许我们可以…

面试官不讲武德,居然让我讲讲蠕虫和金丝雀!

1. 蠕虫病毒简介2. 缓冲区溢出3. 缓冲区溢出举例4. 缓冲区溢出的危害5. 内存在计算机中的排布方式6. 计算机中越界访问的后果7. 避免缓冲区溢出的三种方法7.1 栈随机化7.2 检测栈是否被破坏7.3 限制可执行代码区域8. 总结蠕虫病毒是一种常见的利用Unix系统中的缺点来进行攻击的…

asp.net core 拦击器制作的权限管理系统DEMO

效果图 没有登陆不会执行请求日期的方法&#xff0c;不管是否登陆都不允许访问请求时间方法 验证不通过是会进行转发到Home/error方法中&#xff0c; 代码附上&#xff1a; [Route("[controller]/[action]")]public class HomeController : BaseController{/// <s…

工程师姓什么很重要!别再叫我“X工”!!!

工程师之间都是这么互相打招呼的——“高工&#xff0c;你设计图通过了么&#xff1f;”“李工&#xff0c;工程画完了吗&#xff1f;”“王工&#xff0c;你真是越来越漂亮了&#xff01;”"张工&#xff0c;你的DFM整完了吗"“周公&#xff0c;Schedule 该更新了”…

说一下NFC,手机有NFC功能却不能模拟门禁卡?

img1、NFC是什么&#xff1f;NFC&#xff08;Near Field Communication&#xff09; 技术由Philips、Nokia和Sony主推的一种近距离无线通信技术&#xff08;NFCIP-1&#xff09;&#xff0c;是一种短距离非接触式的通信方式&#xff0c;通常有效通讯距离为4厘米以内。工作频率为…

小程序员的大梦想 与盖茨像哥们儿

小程序员的大梦想 与盖茨像哥们儿以10亿的天价转会新华都&#xff0c;让唐骏有机会开创其职业经理人生涯的新局面&#xff0c;但在此之前&#xff0c;他的成功已得到证明面前的唐骏温和得令人吃惊。仿佛“前微软中国区总裁”、“打工皇帝”、“10亿转会身价”这样的光环带给他的…

动态规划详解

个人见解&#xff1a;1.动态规划实现了把问题拆分成多个子问题&#xff0c;然后求解&#xff0c;子问题有解后&#xff0c;问题自然迎刃而解&#xff1b;2.动态规划实现了子问题的状态的迁移&#xff0c;保存每个状态值&#xff0c;递推出答案&#xff0c;但不记录每种状态的求…