为保证网络协议栈的顺利移植,选用了LPC2220作为主控芯片,RTL8019AS作为网卡芯片,使用HR901170A进行电平转换、滤波。
LPC2220是Philips公司推出的微处理器,片上有64K的RAM空间,通过总线很容易再扩展ROM和RAM。芯片还拥有丰富的IO接口以及多种中断源,还集成了多种定时器、PWM等,另外,该芯片内部集成了很多串行通讯协议,如SPIUART等。
RTL8019AS是由台湾Realtek公司生产的以太网控制器。他符合EthernetII与IEEE802.3标准,100脚的PQFP封装,采用全双工收发并可同时达到10Mb/s的速率,内置16kB的SRAM,支持8/16位数据总线,8个中断申请线以及16个I/O基地址选择。
HR901170A是汉仁电子有限公司生产的RJ45接口连接器(带网络变压器/滤波器),该连接器满足IEEES02.3和IEEE902.3ab标准,能够较好地抑制电磁干扰。通过HR901170A系统就可以连接到以太网上。
基于LPC2220和RTL8019AS的上述特点,我们使用此款芯片可以设计出满足移植Lwip网络协议栈所需要的硬件运行环境。
图1.2-1硬件电路连接图1
图1.2-2硬件电路连接图2
RTL8019AS芯片工作方式分为3种:①跳线方式,网卡的i/o和中断由跳线决定。②即插即用方式,由软件进行自动配置plug and play。③免跳线方式,网卡的i/o和中断由外接的93c46里的内容决定。在嵌入式应用场合,为了节约成本,一般不使用93c46的,可以降低成本,同时又减少连线。我们选择使用跳线模式,使用此模式的硬件设置方式为第65引脚(JP)接高电平,如图1.2-2硬件电路连接图2所示。
硬件复位引脚33(RSTDRV),此引脚为网卡芯片硬件复位引脚,RSTDRV为高电平有效,至少需要800ns的宽度。由硬件电路图可知,此引脚连接到LPC2220的P0.8上。
中断引脚(INT7-0)为97-100,1-4 共有8个中断引脚,但使用时只是用一个中断引脚,选择哪个引脚作为中断信号是根据[80-78][IRQS2-0]来决定的,根据电路图可IRQS2-0这三个引脚悬空,RTL8019AS内部有下拉电阻,故IRQS2-0这三个引脚电平都为0,根据手册可知,选择的是INT0作为中断源引脚,此引脚连接到LPC2220的P0.9引脚。
64脚(AUI),该引脚决定使用aui还是bnc接口。我们用的网卡的接口一般是bnc的,很少用aui。bnc接口方式支持8线双绞或同轴电缆。高电平时使用aui接口,悬空为低电平,使用bnc接口。我们将该引脚悬空即可。
网络接口类型由74,77(PL0,PL1)引脚决定,我们使用第一种自动检测就可以了。会自动检测接口类型然后进行工作。自动检测是用同轴还是双绞线。这两个引脚内部存在下拉电阻,悬空即可。
芯片的brom地址由以下引脚72,71,69,68,67(BS4..BS0)决定,在嵌入式领域一般都不用该brom。brom是bootrom的缩写。在电脑里用来做无盘工作站时候用到,可以从网卡进行引导,而不是从a盘,c盘等引导系统。故悬空即可。
RTL8019AS支持3支可编程LED灯,电路连接见原理图。
RTL8019AS与主控芯片间通讯的输入/输出地址共有32个,地址偏移量为00H-1FH。
RTL8019AS的IO基地址在跳线模式下由[85-84,82-81] [IOS3-0]这四个引脚状态决定,电路图中这四个引脚悬空,故这四个引脚状态都为0,根据数据手册可知RTL8019AS的IO基地址为300H,将300H化成二进制数值00110000 0000,很明显地址中第8、9为地址为1,第6、7位和10-19位全部为0。我们仅需要控制第0-4位地址,就可以产生00H-1FH这32个偏移量。电路原理图中SA8、SA9接+5v,SA10-SA19接的是地。
电路图中SA0-SA4分别接的是LPC2220的A1-A5引脚,而SA5接的是NET_nCS引脚。
图1.2-2硬件电路连接图3
NET_nCS的信号是根据nCS3(BANK3的片选信号)和A22地址线信号产生的。
数据总线SD0-SD15连接到LPC2220的D0-D15,组成16bit总线。
产生00H-1FH的偏移量需要NET_nCS信号为低。我们总结一下,我们的RTL8019AS需要的地址是300H-301FH,硬件连线决定了这个地址偏移量。我们将RTL8019AS接到LPC2220的BANK3上。对LPC2220来说,只产生00H-1FH的偏移量就可以。LPC2220的BANK3起始地址是0X83000000,也就是说当访问这个地址时才会产生nCS3为低的信号,如果BANK3只需要连接网卡的话,我们就可以直接利用nCS3信号作为选通网卡芯片的信号即可,但我们硬件设计时将BANK3又分成了几个独立的访问空间用于挂接不同的总线器件。我们利用地址线A21、A22、A23将BANK3分为0X834000000、0x83100000、0x83800000这几个独立空间。我们只分析利用A22地址线信号和nCS3
产生的NET_nCS信号,此信号线硬件上连接到RTL8019AS的SA5上,A22地址线上信号为高电平并且nCS3产生低电平信号,这种情况下NET_nCS才是低电平,而只有NET_nCS为低电平时,才能产生RTL8019AS需要的300H-301FH地址偏移量。现在通过LPC2220访问地址空间0x83400000,这个时候根据上面分析NET_nCS为低电平,也即RTL8019AS的SA5为低电平,第四位地址线SA0-SA4连接的是LPC2220的A1-A5,
访问0x83400000、0x83400001对应的RTL8019AS地址即为300H,同理0x83400010、0x83400011对应的RTL8019AS地址即为301H。我们访问LPC2220的0x83400000-0x8340003F即访问了RTL8019AS的32个偏移量。
图2.4-1 ARM Image映像文件结构
ZI段表示初始化为0的变量区域,RW段表示已经初始化的变量区域,RO段表示代码区域。
因ZI段只是初始化为0的变量区域,所以在Image文件中并不占空间,映像文件中只是包含实际地址和大小。我们一般将image映像文件下载到ROM中,系统启动时从ROM中读取第一条需要执行的指令,但RW段下载到了ROM中,ROM是不可写的。因此出现了装载地址和运行地址不一致的情况。我们要保证程序正常运行就必须保证变量在访问之前放到了正确的地址。一个简单的装载地址到运行地址的转换见图2.4-2 简单的分散装载内存映像图。
图2.4-2 简单的分散装载内存映像图
在KeilMDK工程中使用分散装载文件scf文件来设置映像文件的转载地址和运行地址,当我们设置的转载地址和运行地址不一致时,KeilMDK会自动产生搬运代码,在使用RW、ZI段之前将代码搬运到正确的地址。
我们工程使用的分散加载文件内容:
ROM_LOAD 0x80000000
{
ROM_EXEC 0x80000000
{
Startup.o (vectors, +First)
* (+RO)
}
IRAM 0x40000000
{
Startup.o (MyStacks)
}
STACKS_BOTTOM +0 UNINIT
{
Startup.o (StackBottom)
}
STACKS 0x40004000 UNINIT
{
Startup.o (Stacks)
}
ERAM 0x81000000
{
* (+RW,+ZI)
}
HEAP +0 UNINIT
{
Startup.o (Heap)
}
HEAP_BOTTOM 0x81080000 UNINIT
{
Startup.o (HeapTop)
}
}
此分散加载文件只有一个装载域ROM_LOAD,装载地址是0x80000000,这个地址是ARM芯片外的一个NorFlash芯片的起始地址。存在ROM_EXEC、IRAM、STACKS_BOTTOM、STACKS、ERAM、HEAP、HEAP_BOTTOM共8个运行域,每个运行域都有自己的运行地址。其中ROM_EXEC运行域和装载域地址一样,此运行域包含系统的启动代码和所有RO段代码。剩余其他运行域的地址和装载域都不同,都需要根据分散加载文件进行代码搬运工作,这个工作是由KeilMDK工具自动完成。
系统启动代码主要完成的工作如下:
1. 中断向量表
2. 初始化总线频率和存储器系统
3. 初始化堆栈
4. 呼叫主应用程序
中断向量表是当外部中或系统异常发生时中断服务程序的入口地址或存放中断服务程序的首地址。此工程中将中断向量表定位在0x80000000这个地址开始的地方。
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
初始化总线频率以满足各个BANK外接的设备正常使用,一个复杂的系统可能存在多种存储器类型的接口,需要根据实际的系统设计对此加以正确配置。对同一种存储器类型来说,也因为访问速度的差异,需要不同的时序设置。工程中我们使用的存储器包括NorFlash和SRAM,设置的访问总线宽度都为16bit。
堆栈空间是C语言正常运行所需要的基本环境,函数调用参数、返回值、函数调用关系都需要使用堆栈。因此,需要设置ARM各个运行模式的堆栈空间。
InitStack
MOV R0, LR
;Build the SVC stack
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;Build the FIQ stack
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;Build the DATAABORT stack
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;Build the UDF stack
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;Build the SYS stack
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
BX R0
调用__main()函数,此函数主要工作流程如图2.4-3 __main 函数执行流程。
图2.4-3 __main 函数执行流程
From main(),your program might call, among other things, library functions.
调用用户main函数,在main函数里,你可以调用其他用户函数,也可以调用库函数。
UCOS是一个可裁剪、支持抢占式调度的实时嵌入式操作系统。提供基本的任务管理功能,支持信号量、邮箱、队列等任务间同步、通讯机制。
Ucos移植主要是实现保存、恢复ARM芯片执行程序所需要的寄存器环境和实现系统时钟接口需要的硬件定时器的设置及启动。需要移植实现的主要有任务级任务切换、中断级任务切换、任务堆栈初始化、系统时钟。
C语言经过编译器编译、链接后生成的二进制指令是能在ARM芯片上直接执行的指令代码。这些指令执行是依赖于各种寄存器的,保护程序运行环境其实就是保护这些寄存器。
ARM芯片有7种运行模式:
1. 用户模式(user模式),运行应用的普通模式。
2. 快速中断模式(fiq模式),用于支持数据传输或通道处理。
3. 中断模式(irq模式),用于普通中断处理。
4. 超级用户模式(svc模式),操作系统的保护模式。
5. 异常中断模式(abt模式),输入数据后登入或预取异常中断指令。
6. 系统模式(sys模式),是操作系统使用的一个有特权的用户模式。
7. 未定义模式(und模式),执行了未定义指令时进入该模式。
外部中断,异常操作或软件控制都可以改变中断模式。大多数应用程序都时是在用户模式下运行。进入特权模式是为了处理中断或异常请求或操作保护资源服务的。
些工作模式是芯片硬件提供的程序运行的不同环境,不同的模式有不同的硬件访问权限,使用不同的寄存器。这就给不同的程序提供了不同的权限机制,你比如说你的操作系统代码运行在权限比较高的模式下,而你的应用程序运行在权限比较低的模式下。这样就起到了对操作系统代码的保护作用。
寄存器,各个模式下可见的寄存器以及各个寄存器的功能:
ARM共有37个32位的寄存器,其中31个是通用寄存器,6个是状态寄存器。但在同一时间,对程序员来说并不是所有的寄存器都可见。在某一时刻存储器是否可见(可被访问),是处理器当前的工作状态和工作模式决定的。其各个模式下的寄存器如图3.3-1 ARM各种运行模式:
图3.3-1 ARM各种运行模式
其中系统模式和用户模式所用的寄存器是一样的。画三角阴影的寄存器表示在不同模式下有不同的物理寄存器。
以下对其进行分类说明。
通用寄存器:
ARM的通用寄存器包括R0~R15,其中R0~R7是属于未分组寄存器,各个模式下都使用同样的寄存器。R8~R14在FIQ模式下是有独立的物理寄存器,其目的是加快中断响应速度,从硬件上保存程序执行现场。R13和R14这两个寄存器在每种模式下都有自己的独立寄存器。R15只有一个,所有模式公用。
下对这些寄存器中的比较有特殊功能的做一下介绍:
寄存器R13:在ARM指令中,常用R13做堆栈指针用。每种运行模式都有自己独立的堆栈,用于保存中断发生时的程序运行环境和C语言执行时进行过程控制。
寄存器R14:专职持有返回点的地址,在系统执行一条“跳转并链接(link)”(BL)指令
的时候,R14将收到一个R15的拷贝。其他的时候,它可以用作一个通用寄存器。相应的它在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und都同样用来保存在中断或异常发生时,或时在中断和异常中执行了BL指令时,R15的返回值。
寄存器R15是程序计数器(PC)。在ARM状态下,R15的bits[1:0]为0,bits[31:2]保存了PC的值。在Thumb状态下,bits[0]为0同时bits[31:1]保存了PC值。
FIQ模式拥有7个私有寄存器R8-14(R8_fiq-R14_fiq)。在ARM状态下,多数FIQ处理都不需要保存任何寄存器。用户、中断、异常中止,超级用户和未定义模式都拥有2个私有寄存器,R13和R14。允许这些模式都可拥有1个私有堆栈指针和链接(link)寄存器。
程序状态寄存器。
ARM920T具有一个当前程序状态寄存器(CPSR),另外还有5个保存程序状态寄存器(SPSRs)用于异常中断处理。这些寄存器的功能有:
1. 保留最近完成的ALU操作的信息。
2. 控制中断的使能和禁止。
3. 设置处理器的操作模式。
状态寄存器各位定义见图3.3-2 ARM状态寄存器:
图3.3-2 ARM状态寄存器
当产生外部中断或者系统异常时,ARM会进入相应的模式,各种运行模式均有其独立的堆栈空间。UCOS中的任务是调度的最小单元,每个任务都有自己独立的堆栈空间,当任务运行时,它用来保存一些局部变量,当任务挂起时,它负责保存任务的运行现场,也就是CPU寄存器的值。
系统时钟是UCOS管理任务延时的基本依据,要求有一个周期性的定时器产生固定间隔时间。我们使用LPC2220的定时器0产生固定时间间隔事件,时间间隔设置为10ms,定时时间到产生中断。UCOS系统时钟处理函数是OSTimeTick(),时间中断服务程序里调用此函数即可。
UCOS的用户调用一些系统服务时(比如,OSTimeDly、OSSemPend),就会产生任务级任务切换。其切换的实质是保存正在执行任务的执行现场,然后恢复应该运行的任务的运行现场。
本工程中使用软中断的方式实现任务级任务切换的目的。
任务级切换函数的底层接口是使用的软中断技术,用__swi来声明一个不存在的函数,则调用这个函数就在调用这个函数的地方插入一条SWI指令,并且可以指定功能号。定义如下:__swi(0x00) void OS_TASK_SW(void); /* 任务级任务切换函数 */
调用OS_TASK_SW()这个函数时就会产生一个软中断,产生软中断后执行软中断服务程序。服务程序主要代码分析如下:
SoftwareInterrupt
LDR SP, StackSvc ; 重新设置堆栈指针
STMFD SP!, {R0-R3, R12, LR}
MOV R1, SP ; R1指向参数存储位置
MRS R3, SPSR
TST R3, #T_bit ; 中断前是否是Thumb状态
LDRNEH R0, [LR,#-2] ; 是: 取得Thumb状态SWI号
BICNE R0, R0, #0xff00
LDREQ R0, [LR,#-4] ; 否: 取得arm状态SWI号
BICEQ R0, R0, #0xFF000000
; r0 = SWI号,R1指向参数存储位置
CMP R0, #1
LDRLO PC, =OSIntCtxSw
LDREQ PC, =__OSStartHighRdy ; SWI 0x01为第一次任务切换
BL SWI_Exception
LDMFD SP!, {R0-R3, R12, PC}^
代码难点分析:
软中断指令使处理器进入管理模式,而用户程序处于系统/用户模式,其它异常也有自己的处理器模式,都有各自的堆栈指针,不会因为给堆栈指针赋值而破坏其它处理器模式的堆栈而影响其它程序的执行。返回的地址已经存储在连接寄存器LR中而不是存储在堆栈中。由于进人管理模式自动关中断,所以这段程序不会被其它程序同时调用。
因为ARM处理器核具有两个指令集,在执行Thumb指令的状态时不是所有寄存器都可见(参考ARM的相关资料),而且任务又可能不在特权模式(不能改变CPSR)。为了兼容任意一种模式,本移植使用软中断指令SWI使处理器进入管理模式和ARM指令状态,并使用功能0实现OS_TASK_SW()的功能。
因任务级任务切换使用的是软中断技术,我们把osctxsw()与osintctxsw()合二为一了,统一采用osintctxsw()来实现。之所以这样搞的原因是任务进行切换的时候,都必须进入软中断的状态,而对于软中断的异常响应代码已经将任务的环境变量进行了保存,从而也不需要像osctxsw()里面规定的那样对将环境变量进行保存。osintctxsw()函数的移植分析见3.7中断级任务切换。
当系统任务延时时间到或者在中断服务程序里抛出信号量、邮箱等可以产生系统调度的操作时,会执行任务切换,但这种切换是在中断模式下进行的。但底层切换函数是一致的,只不过任务级任务切换时是在SVC模式下进行,中断级任务切换是在中断模式下进行。
下面我们分析中断级任务切换的主要流程和代码:
SUB LR, LR, #4 ; 计算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任务环境
MRS R3, SPSR ; 保存状态
STMFD SP, {R3,SP, LR}^; 保存用户状态的R3,SP,LR,注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
LDR R2, =OSIntNesting ; OSIntNesting++
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt :OR: SYS32Mode) ; 切换到系统模式
CMP R1, #1
LDREQ SP, =StackUsr
BL $IRQ_Exception_Function ; 调用c语言的中断处理程序
MSR CPSR_c, #(NoInt :OR: SYS32Mode) ; 切换到系统模式
LDR R2, =OsEnterSum; OsEnterSum,使OSIntExit退出时中断关闭
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum; 因为中断服务程序要退出,
;所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt :OR: IRQ32Mode) ; 切换回irq模式
LDMFD SP, {R3,SP, LR }^ ; 恢复用户状态的R3,SP,LR,
;注意不能回写
; 如果回写的是用户的SP,所以后面要调整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不进行任务切换
LDR PC, =OSIntCtxSw ; 进行任务切换
代码主要功能分析:
实现在中断模式下保存系统模式下正在运行任务的各个寄存器到中断模式堆栈,然后执行相应的中断服务程序,中断退出时做任务切换。
下面我们分析实现任务切换的函数OSIntCtxSw。
OSIntCtxSw
;下面为保存任务环境
LDR R2, [SP, #20] ;获取PC
LDR R12, [SP, #16] ;获取R12
MRS R0, CPSR
MSR CPSR_c, #(NoInt :OR: SYS32Mode)
MOV R1, LR
STMFD SP!, {R1-R2} ;保存LR,PC
STMFD SP!, {R4-R12} ;保存R4-R12
MSR CPSR_c, R0
LDMFD SP!, {R4-R7} ;获取R0-R3
ADD SP, SP, #8 ;出栈R12,PC
MSR CPSR_c, #(NoInt :OR: SYS32Mode)
STMFD SP!, {R4-R7} ;保存R0-R3
LDR R1, =OsEnterSum ;获取OsEnterSum
LDR R2, [R1]
STMFD SP!, {R2, R3} ;保存CPSR,OsEnterSum
;保存当前任务堆栈指针到当前任务的TCB
LDR R1, =OSTCBCur
LDR R1, [R1]
STR SP, [R1]
BL OSTaskSwHook ;调用钩子函数
;OSPrioCur <= OSPrioHighRdy
LDR R4, =OSPrioCur
LDR R5, =OSPrioHighRdy
LDRB R6, [R5]
STRB R6, [R4]
;OSTCBCur <= OSTCBHighRdy
LDR R6, =OSTCBHighRdy
LDR R6, [R6]
LDR R4, =OSTCBCur
STR R6, [R4]
上述函数实现了保存上一个被中断任务运行时各个寄存器到任务的堆栈空间里,然后将系统中优先级最高且就绪的任务堆栈里保存的各个寄存器内容恢复到系统模式的各个寄存器中,使任务正常运行。
图4.5-1 ping测试
图4.6-1 简单WEB服务器
文章浏览阅读1w次,点赞2次,收藏27次。来源:机器人小妹 很多时候企业拥有重复,乏味且困难的工作流程,这些流程往往会减慢生产速度并增加运营成本。为了降低生产成本,企业别无选择,只能自动化某些功能以降低生产成本。 通过数字化..._人工智能平台
文章浏览阅读2.2k次。热加载能够在每次保存修改的代码后自动刷新 electron 应用界面,而不必每次去手动操作重新运行,这极大的提升了开发效率。安装 electron 热加载插件热加载虽然很方便,但是不是每个 electron 项目必须的,所以想要舒服的开发 electron 就只能给 electron 项目单独的安装热加载插件[electron-reloader]:// 在项目的根目录下安装 electron-reloader,国内建议使用 cnpm 代替 npmnpm install electron-relo._electron-reloader
文章浏览阅读942次。在11.0 进行定制化开发,会根据需要去掉recovery模式的一些选项 就是在device.cpp去掉一些选项就可以了。_android recovery 删除 部分菜单
文章浏览阅读3.7k次。https://www.yuque.com/mnn/cn/cvrt_linux_mac基础依赖这些依赖是无关编译选项的基础编译依赖• cmake(3.10 以上)• protobuf (3.0 以上)• 指protobuf库以及protobuf编译器。版本号使用 protoc --version 打印出来。• 在某些Linux发行版上这两个包是分开发布的,需要手动安装• Ubuntu需要分别安装 libprotobuf-dev 以及 protobuf-compiler 两个包•..._mnn 编译linux
文章浏览阅读1.8k次。CSS3新增动画属性“@-webkit-keyframes”,从字面就可以看出其含义——关键帧,这与Flash中的含义一致。利用CSS3制作动画效果其原理与Flash一样,我们需要定义关键帧处的状态效果,由CSS3来驱动产生动画效果。下面讲解一下如何利用CSS3制作淡入淡出的动画效果。具体实例可参考刚进入本站时的淡入效果。1. 定义动画,名称为fadeIn@-webkit-keyf_css3入场效果淡入淡出
文章浏览阅读2.8k次。计算机系统应包括硬件和软件两个子系统,硬件和软件又必须依次分别包括中央处理器和系统软件。按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。计算机是脑力的延伸和扩充,是近代科学的重大成就之一。计算机系统由硬件(子)系统和软件(子)系统组成。前者是借助电、磁、光、机械等原理构成的各种物理部件的有机组合,是系统赖以工作的实体。后者是各种程序和文件,用于指挥全系统按指定的要求进行..._计算机系统包括硬件系统和软件系统 软件又必须包括
文章浏览阅读7.9k次,点赞3次,收藏22次。一 定义这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO 算法并不能保证这些页面不被淘汰。这里,我_进程调度fifo算法代码
文章浏览阅读133次。rownum是oracle才有的写法,rownum在oracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等mysql取第一条数据写法SELECT * FROM t order by id LIMIT 1;oracle取第一条数据写法SELECT * FROM t where rownum =1 order by id;ok,上面是mysql和oracle取第一条数据的写法对比,不过..._mysql 替换@rownum的写法
文章浏览阅读790次,点赞3次,收藏4次。官网下载下载链接:http://www.eclipse.org/downloads/点击Download下载完成后双击运行我选择第2个,看自己需要(我选择企业级应用,如果只是单纯学习java选第一个就行)进入下一步后选择jre和安装路径修改jvm/jre的时候也可以选择本地的(点后面的文件夹进去),但是我们没有11版本的,所以还是用他的吧选择接受安装中安装过程中如果有其他界面弹出就点accept就行..._ecjelm
文章浏览阅读245次。原文链接:https://linux.cn/article-7801-1.htmlifconfigping <IP地址>:发送ICMP echo消息到某个主机traceroute <IP地址>:用于跟踪IP包的路由路由:netstat -r: 打印路由表route add :添加静态路由路径routed:控制动态路由的BSD守护程序。运行RIP路由协议gat..._ifconfig 删除vlan
文章浏览阅读224次。reduxredux里要求把数据都放在公共的存储区域叫store里面,组件中尽量少放数据,假如绿色的组件要给很多灰色的组件传值,绿色的组件只需要改变store里面对应的数据就行了,接着灰色的组件会自动感知到store里的数据发生了改变,store只要有变化,灰色的组件就会自动从store里重新取数据,这样绿色组件的数据就很方便的传到其它灰色组件里了。redux就是把公用的数据放在公共的区域去存..._redux redis
文章浏览阅读2.2k次,点赞3次,收藏6次。unzip版本不支持4G以上的压缩包所以要使用p7zip:Linux一个高压缩率软件wget http://sourceforge.net/projects/p7zip/files/p7zip/9.20.1/p7zip_9.20.1_src_all.tar.bz2tar jxvf p7zip_9.20.1_src_all.tar.bz2cd p7zip_9.20.1make && make install 如果安装失败,看一下报错是不是因为没有下载gcc 和 gcc ++(p7_linux 7za解压中文乱码