- 浏览: 984474 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
Channel接口定义:http://donald-draper.iteye.com/blog/2369111
AbstractInterruptibleChannel接口定义:http://donald-draper.iteye.com/blog/2369238
SelectableChannel接口定义:http://donald-draper.iteye.com/blog/2369317
SelectionKey定义:http://donald-draper.iteye.com/blog/2369499
SelectorProvider定义:http://donald-draper.iteye.com/blog/2369615
AbstractSelectableChannel定义:http://donald-draper.iteye.com/blog/2369742
NetworkChannel接口定义:http://donald-draper.iteye.com/blog/2369773
Selector定义:http://donald-draper.iteye.com/blog/2370015
AbstractSelector定义:http://donald-draper.iteye.com/blog/2370138
SelectorImpl分析 :http://donald-draper.iteye.com/blog/2370519
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper):
http://donald-draper.iteye.com/blog/2370811
WindowsSelectorImpl解析二(选择操作,通道注册,通道反注册,选择器关闭等):
http://donald-draper.iteye.com/blog/2370862
MembershipKey定义:http://donald-draper.iteye.com/blog/2372947
MulticastChanne接口定义:http://donald-draper.iteye.com/blog/2373009
MembershipKeyImpl 简介:http://donald-draper.iteye.com/blog/2373066
DatagramChannel定义:http://donald-draper.iteye.com/blog/2373046
引言:
先来回顾一下报文通道相关的概念。MembershipKeyImpl内部有一个多播关系key关联的多播通道和多播分组地址,及多播报文源地址,及一个地址阻塞集。MembershipKeyImpl主要操作为drop关系key,直接委托个多播通道drop方法;block地址,首先判断多播关系key中的阻塞Set中是否包含对应的地址,有,则直接返回,否则委托给DatagramChannelImpl的block方法,完成实际的阻塞工作,然后添加地址的多播关系key阻塞set;unblock,首先判断多播关系key中的阻塞Set中是否包含对应的地址,无,则直接返回,有则委托给DatagramChannelImpl的unblock方法,完成实际的的解除阻塞工作,并从多播关系key中的阻塞Set移除对应的地址。
MulticastChanne定义一个通道加入多播组的接口方法join。DatagramChannel的send和receive方法是不需要进行网络连接的,而read和write方法有与不能接受和返回socket地址。
通道必须建立连接。
在上面一篇DatagramChannel文章中我们看了一下报文通道抽象类的方法的定义,
今天这篇我们来看报文通道的具体实现我们需要关注的方法为drop,block,unblock,join,
send,receive,read和write。
我们从DatagramChannel的open方法看起
SelectorProvider.provider()这个过程我们就不详说了实际是加载系统默认的SelectorProvider实例,则个我们在SelectorProvider定义有提过,简单看一下:
//SelectorProviderImpl
从上面可以看出报文通道的具体实现为DatagramChannelImpl,下面来看DatagramChannelImpl
//DatagramChannelImpl
我们来看一下多播关系注册器
//MembershipRegistry
从上可以看出多播关系注册器MembershipRegistry主要是通过一个Map-HashMap<InetAddress,LinkedList<MembershipKeyImpl>>来管理多播组和多播组成员关系key的映射(关系)。
再来看构造
这个构造我们需要关注的是
我们来看一下ResourceManager
//ResourceManager
我们再看其他两个构造方法:
从上面三个构造方法可以看出,主要是初始化读写线程,及读写锁和状态锁,初始化网络协议family,及报文通道描述符和文件描述id。
总结:
DatagramChannelImpl主要成员有报文socket分发器,这个与SocketChannleImpl中的socket分发器原理基本相同,报文socket分发器可以理解为报文通道的静态代理;网络协议family表示当前报文通道的网络协议family;多播关系注册器MembershipRegistry,
主要是通过一个Map-HashMap<InetAddress,LinkedList<MembershipKeyImpl>>来管理多播组和多播组成员关系key的映射(关系);通道本地读写线程记录器,及读写锁控制通道读写,一个状态锁,当通道状态改变时,需要获取状态锁。DatagramChannelImpl构造方法,主要是初始化读写线程,及读写锁和状态锁,初始化网络协议family,及报文通道描述符和文件描述id。DatagramChannelImpl(SelectorProvider selectorprovider)与其他两个不同的是构造时更新当前报文socket的数量。
DatagramChannelImpl 解析二(报文发送与接收):http://donald-draper.iteye.com/blog/2373281
AbstractInterruptibleChannel接口定义:http://donald-draper.iteye.com/blog/2369238
SelectableChannel接口定义:http://donald-draper.iteye.com/blog/2369317
SelectionKey定义:http://donald-draper.iteye.com/blog/2369499
SelectorProvider定义:http://donald-draper.iteye.com/blog/2369615
AbstractSelectableChannel定义:http://donald-draper.iteye.com/blog/2369742
NetworkChannel接口定义:http://donald-draper.iteye.com/blog/2369773
Selector定义:http://donald-draper.iteye.com/blog/2370015
AbstractSelector定义:http://donald-draper.iteye.com/blog/2370138
SelectorImpl分析 :http://donald-draper.iteye.com/blog/2370519
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper):
http://donald-draper.iteye.com/blog/2370811
WindowsSelectorImpl解析二(选择操作,通道注册,通道反注册,选择器关闭等):
http://donald-draper.iteye.com/blog/2370862
MembershipKey定义:http://donald-draper.iteye.com/blog/2372947
MulticastChanne接口定义:http://donald-draper.iteye.com/blog/2373009
MembershipKeyImpl 简介:http://donald-draper.iteye.com/blog/2373066
DatagramChannel定义:http://donald-draper.iteye.com/blog/2373046
引言:
先来回顾一下报文通道相关的概念。MembershipKeyImpl内部有一个多播关系key关联的多播通道和多播分组地址,及多播报文源地址,及一个地址阻塞集。MembershipKeyImpl主要操作为drop关系key,直接委托个多播通道drop方法;block地址,首先判断多播关系key中的阻塞Set中是否包含对应的地址,有,则直接返回,否则委托给DatagramChannelImpl的block方法,完成实际的阻塞工作,然后添加地址的多播关系key阻塞set;unblock,首先判断多播关系key中的阻塞Set中是否包含对应的地址,无,则直接返回,有则委托给DatagramChannelImpl的unblock方法,完成实际的的解除阻塞工作,并从多播关系key中的阻塞Set移除对应的地址。
MulticastChanne定义一个通道加入多播组的接口方法join。DatagramChannel的send和receive方法是不需要进行网络连接的,而read和write方法有与不能接受和返回socket地址。
通道必须建立连接。
在上面一篇DatagramChannel文章中我们看了一下报文通道抽象类的方法的定义,
今天这篇我们来看报文通道的具体实现我们需要关注的方法为drop,block,unblock,join,
send,receive,read和write。
我们从DatagramChannel的open方法看起
//DatagramChannel public static DatagramChannel open() throws IOException { return SelectorProvider.provider().openDatagramChannel(); }
SelectorProvider.provider()这个过程我们就不详说了实际是加载系统默认的SelectorProvider实例,则个我们在SelectorProvider定义有提过,简单看一下:
//SelectorProviderImpl
public abstract class SelectorProviderImpl extends SelectorProvider { public DatagramChannel openDatagramChannel() throws IOException { return new DatagramChannelImpl(this); } public DatagramChannel openDatagramChannel(ProtocolFamily protocolfamily) throws IOException { return new DatagramChannelImpl(this, protocolfamily); } }
从上面可以看出报文通道的具体实现为DatagramChannelImpl,下面来看DatagramChannelImpl
//DatagramChannelImpl
package sun.nio.ch; import java.io.FileDescriptor; import java.io.IOException; import java.net.*; import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.channels.spi.SelectorProvider; import java.util.*; import sun.net.ResourceManager; // Referenced classes of package sun.nio.ch: // DatagramDispatcher, DatagramSocketAdaptor, DirectBuffer, IOStatus, // IOUtil, MembershipKeyImpl, MembershipRegistry, NativeDispatcher, // NativeThread, Net, SelChImpl, SelectionKeyImpl, // SelectorImpl, Util class DatagramChannelImpl extends DatagramChannel implements SelChImpl { private static NativeDispatcher nd = new DatagramDispatcher();//报文分发器 private final FileDescriptor fd;//报文通道的文件描述 private final int fdVal;//文件描述值 private final ProtocolFamily family;//网络协议 private volatile long readerThread;//读线程 private volatile long writerThread;//写线程 private InetAddress cachedSenderInetAddress;//缓存的发送者InetAddress private int cachedSenderPort;//缓存的发送者port private final Object readLock;//读锁 private final Object writeLock;//写锁 private final Object stateLock;//状态锁 private static final int ST_UNINITIALIZED = -1;//未初始化 private static final int ST_UNCONNECTED = 0;//未连接 private static final int ST_CONNECTED = 1;//已连接 private static final int ST_KILLED = 2;//关闭 private int state;//状态 private SocketAddress localAddress;//本地SocketAddress private SocketAddress remoteAddress;//远端SocketAddress private DatagramSocket socket;//报文Sockeet private MembershipRegistry registry;//多播关系注册器 private SocketAddress sender;//报文发送者的SocketAddress static final boolean $assertionsDisabled = !sun/nio/ch/DatagramChannelImpl.desiredAssertionStatus(); static { //加载net和nio资源库 Util.load(); initIDs(); } } //初始化ID private static native void initIDs();
我们来看一下多播关系注册器
//MembershipRegistry
class MembershipRegistry { private Map groups;//HashMap<InetAddress,LinkedList<MembershipKeyImpl>> MembershipRegistry() { groups = null; } //注册多播关系到注册器 void add(MembershipKeyImpl membershipkeyimpl) { InetAddress inetaddress = membershipkeyimpl.group(); Object obj; //从当前注册器获取多播地址对应的obj-LinkedList<membershipkeyimpl> if(groups == null) { groups = new HashMap(); obj = null; } else { obj = (List)groups.get(inetaddress); } //如果obj为null,则创建LinkedList,并将多播地址与obj的映射关系添加到注册器的Group中 if(obj == null) { obj = new LinkedList(); groups.put(inetaddress, obj); } //添加多播关系key到多播地址对应的多播关系key集合中 ((List) (obj)).add(membershipkeyimpl); } //移除多播关系key void remove(MembershipKeyImpl membershipkeyimpl) { //根据多播关系key的多播组地址,获取对应的多播关系key集合 InetAddress inetaddress = membershipkeyimpl.group(); List list = (List)groups.get(inetaddress); if(list != null) { Iterator iterator = list.iterator(); //遍历多播关系key集合,找多播关系key,则移除 do { if(!iterator.hasNext()) break; if(iterator.next() != membershipkeyimpl) continue; iterator.remove(); break; } while(true); //多播关系key集合为空,则从注册器中移除对应的多播组地址映射 if(list.isEmpty()) groups.remove(inetaddress); } } //使注册器中的所有多播组中的多播关系key无效 void invalidateAll() { if(groups != null) { //遍历多播组 for(Iterator iterator = groups.keySet().iterator(); iterator.hasNext();) { InetAddress inetaddress = (InetAddress)iterator.next(); Iterator iterator1 = ((List)groups.get(inetaddress)).iterator(); //遍历多播关系key集合 while(iterator1.hasNext()) { MembershipKeyImpl membershipkeyimpl = (MembershipKeyImpl)iterator1.next(); //使多播关系key无效 membershipkeyimpl.invalidate(); } } } } //检查多播关系注册器中是否有,多播组地址为inetaddress,源地址为inetaddress1,网络接口为networkinterface的MembershipKey MembershipKey checkMembership(InetAddress inetaddress, NetworkInterface networkinterface, InetAddress inetaddress1) { label0: { if(groups == null) break label0; //获取多播组对应的多播关系集合 List list = (List)groups.get(inetaddress); if(list == null) break label0; Iterator iterator = list.iterator(); MembershipKeyImpl membershipkeyimpl; //遍历多播关系集合中源地址为inetaddress1的多播关系key do { //遍历源地址为inetaddress1的多播关系key,找到网络接口为networkinterface的MembershipKeyImpl do { if(!iterator.hasNext()) break label0; membershipkeyimpl = (MembershipKeyImpl)iterator.next(); } while(!membershipkeyimpl.networkInterface().equals(networkinterface)); if(inetaddress1 == null) if(membershipkeyimpl.sourceAddress() == null) return membershipkeyimpl; else throw new IllegalStateException("Already a member to receive all packets"); if(membershipkeyimpl.sourceAddress() == null) throw new IllegalStateException("Already have source-specific membership"); } while(!inetaddress1.equals(membershipkeyimpl.sourceAddress())); return membershipkeyimpl; } return null; } }
从上可以看出多播关系注册器MembershipRegistry主要是通过一个Map-HashMap<InetAddress,LinkedList<MembershipKeyImpl>>来管理多播组和多播组成员关系key的映射(关系)。
再来看构造
//根据选择器提供者创建报文通道 public DatagramChannelImpl(SelectorProvider selectorprovider) throws IOException { super(selectorprovider); readerThread = 0L; writerThread = 0L; readLock = new Object(); writeLock = new Object(); stateLock = new Object(); state = -1; //更新socket计数器,自增1 ResourceManager.beforeUdpCreate(); try { //确定网络协议 family = Net.isIPv6Available() ? ((ProtocolFamily) (StandardProtocolFamily.INET6)) : ((ProtocolFamily) (StandardProtocolFamily.INET)); //获取文件描述 fd = Net.socket(family, false); //获取文件描述的id fdVal = IOUtil.fdVal(fd); state = 0; } catch(IOException ioexception) { //更新socket计数器,自减1 ResourceManager.afterUdpClose(); throw ioexception; } }
这个构造我们需要关注的是
//更新socket计数器,自增1 ResourceManager.beforeUdpCreate(); //更新socket计数器,自减1 ResourceManager.afterUdpClose();
我们来看一下ResourceManager
//ResourceManager
package sun.net; import java.net.SocketException; import java.security.AccessController; import java.util.concurrent.atomic.AtomicInteger; import sun.security.action.GetPropertyAction; public class ResourceManager { private static final int DEFAULT_MAX_SOCKETS = 25;//默认最大socket数量 private static final int maxSockets;//最大socket数量 private static final AtomicInteger numSockets = new AtomicInteger(0);//当前socket数量 static { //获取虚拟机最大报文socket配置 String s = (String)AccessController.doPrivileged(new GetPropertyAction("sun.net.maxDatagramSockets")); int i = 25; try { if(s != null) i = Integer.parseInt(s); } catch(NumberFormatException numberformatexception) { } maxSockets = i; } public ResourceManager() { } public static void beforeUdpCreate() throws SocketException { //如果系统安全检查器不为空,同时当前socket数量自增后大于最大Socket数量,则抛出SocketException if(System.getSecurityManager() != null && numSockets.incrementAndGet() > maxSockets) { numSockets.decrementAndGet(); throw new SocketException("maximum number of DatagramSockets reached"); } else { return; } } //更新当前报文socket计数器,自减1 public static void afterUdpClose() { if(System.getSecurityManager() != null) numSockets.decrementAndGet(); } }
我们再看其他两个构造方法:
public DatagramChannelImpl(SelectorProvider selectorprovider, ProtocolFamily protocolfamily) throws IOException { super(selectorprovider); readerThread = 0L; writerThread = 0L; readLock = new Object(); writeLock = new Object(); stateLock = new Object(); state = -1; if(protocolfamily != StandardProtocolFamily.INET && protocolfamily != StandardProtocolFamily.INET6) if(protocolfamily == null) throw new NullPointerException("'family' is null"); else throw new UnsupportedOperationException("Protocol family not supported"); if(protocolfamily == StandardProtocolFamily.INET6 && !Net.isIPv6Available()) { throw new UnsupportedOperationException("IPv6 not available"); } else { family = protocolfamily; fd = Net.socket(protocolfamily, false); fdVal = IOUtil.fdVal(fd); state = 0; return; } } public DatagramChannelImpl(SelectorProvider selectorprovider, FileDescriptor filedescriptor) throws IOException { super(selectorprovider); readerThread = 0L; writerThread = 0L; readLock = new Object(); writeLock = new Object(); stateLock = new Object(); state = -1; family = Net.isIPv6Available() ? ((ProtocolFamily) (StandardProtocolFamily.INET6)) : ((ProtocolFamily) (StandardProtocolFamily.INET)); fd = filedescriptor; fdVal = IOUtil.fdVal(filedescriptor); state = 0; //初始化报文socket本地地址 localAddress = Net.localAddress(filedescriptor); }
从上面三个构造方法可以看出,主要是初始化读写线程,及读写锁和状态锁,初始化网络协议family,及报文通道描述符和文件描述id。
总结:
DatagramChannelImpl主要成员有报文socket分发器,这个与SocketChannleImpl中的socket分发器原理基本相同,报文socket分发器可以理解为报文通道的静态代理;网络协议family表示当前报文通道的网络协议family;多播关系注册器MembershipRegistry,
主要是通过一个Map-HashMap<InetAddress,LinkedList<MembershipKeyImpl>>来管理多播组和多播组成员关系key的映射(关系);通道本地读写线程记录器,及读写锁控制通道读写,一个状态锁,当通道状态改变时,需要获取状态锁。DatagramChannelImpl构造方法,主要是初始化读写线程,及读写锁和状态锁,初始化网络协议family,及报文通道描述符和文件描述id。DatagramChannelImpl(SelectorProvider selectorprovider)与其他两个不同的是构造时更新当前报文socket的数量。
DatagramChannelImpl 解析二(报文发送与接收):http://donald-draper.iteye.com/blog/2373281
发表评论
-
文件通道解析二(文件锁,关闭通道)
2017-05-16 23:17 1075文件通道解析一(读写操作,通道数据传输等):http://do ... -
文件通道解析一(读写操作,通道数据传输等)
2017-05-16 10:04 1172Reference定义(PhantomRefere ... -
文件通道创建方式综述
2017-05-15 17:39 1074Reference定义(PhantomReference,Cl ... -
文件读写方式简单综述后续(文件,流构造)
2017-05-14 23:04 1493Java Socket通信实例:http://donald-d ... -
文件读写方式简单综述
2017-05-14 11:13 1142Java Socket通信实例:http://donald-d ... -
FileChanne定义
2017-05-12 23:28 948文件读写方式简单综述:http://donald-draper ... -
SeekableByteChannel接口定义
2017-05-11 08:43 1244ByteChannel,分散聚集通道接口的定义(SocketC ... -
FileChannel示例
2017-05-11 08:37 1003前面我们看过socket通道,datagram通道,以管道Pi ... -
PipeImpl解析
2017-05-11 08:41 941ServerSocketChannel定义:http://do ... -
Pipe定义
2017-05-10 09:07 916Channel接口定义:http://donald-drape ... -
NIO-Pipe示例
2017-05-10 08:47 914PipeImpl解析:http://donald-draper ... -
DatagramChannelImpl 解析四(地址绑定,关闭通道等)
2017-05-10 08:27 792DatagramChannelImpl 解析一(初始化):ht ... -
DatagramChannelImpl 解析三(多播)
2017-05-10 08:20 1927DatagramChannelImpl 解析一(初始化):ht ... -
NIO-UDP实例
2017-05-09 12:32 1593DatagramChannelImpl 解析一(初始化):ht ... -
DatagramChannelImpl 解析二(报文发送与接收)
2017-05-09 09:03 1418DatagramChannelImpl 解析一(初始化):ht ... -
MembershipKeyImpl 简介
2017-05-08 09:11 932MembershipKey定义:http://donald-d ... -
DatagramChannel定义
2017-05-07 23:13 1238Channel接口定义:http://donald-drape ... -
MulticastChanne接口定义
2017-05-07 13:45 1147NetworkChannel接口定义:ht ... -
MembershipKey定义
2017-05-06 16:20 927package java.nio.channels; i ... -
SocketChannelImpl 解析四(关闭通道等)
2017-05-05 08:38 2550SocketChannelImpl 解析一(通道连接,发送数据 ...
相关推荐
- **堆内存初始化**:主线程申请堆内存,使用clib_mem_init_thread_safe初始化一个内存区域,然后创建mspace结构来管理内存,并通过clib_mem_set_heap将其设置为全局变量clib_per_cpu_mheap的一部分。 - **vlib_...
描述中提到的“混沌映射sin映射初始化种群”是指在PSO算法的初始阶段,通过SIN映射生成一组随机但分布均匀的粒子位置。与传统的随机数生成相比,混沌映射生成的序列具有更好的遍历性和无规律性,可以避免粒子群陷入...
初始化BAR寄存器是建立这种映射关系的第一步。 3. **资源分配的必要条件**:通过初始化BAR寄存器,系统软件可以为每个PCI设备分配特定的地址空间,这是实现资源共享和避免地址冲突的重要步骤。 #### 三、初始化...
Java 数组初始化是 Java 编程语言中的一种基本概念,它允许开发者创建和初始化数组,以便于存储和操作数据。在本文中,我们将对 Java 数组初始化进行详细的介绍,包括一维数组和二维数组的声明、初始化和使用。 一...
《深入解析 ORACLE 数据库的初始化》是由知名数据库专家盖国强编著的一本专业书籍,专注于探讨 Oracle 数据库在启动、配置和管理过程中的各项技术细节。这本书以丰富的实例和深入的理论相结合,旨在帮助读者全面理解...
深入解析Oracle-数据库的初始化,适用于kindle的mobi版本
本文将深入解析Velocity的初始化过程,帮助开发者更好地理解和使用这一工具。 Velocity的核心是`VelocityEngine`,它是整个模板引擎的入口。初始化过程主要涉及以下几个步骤: 1. **创建VelocityContext对象** ...
本篇文章将围绕“类继承的初始化顺序”这一主题展开,详细解析初始化过程中涉及的关键概念和技术细节。 ### 类继承的初始化顺序概述 在面向对象语言中(如Java、C#等),当创建一个继承自某个基类的子类对象时,会...
时钟系统初始化函数解析,stm32的时钟嵌入式系统初始化函数剖析。
这个过程包括加载、验证、准备、解析和初始化五个步骤。这里我们主要关注初始化阶段,也就是执行静态初始化块(如果有的话)。 2. **静态初始化**: 静态初始化块(也称为静态初始化器)是在类被加载并初始化时...
本篇将围绕`mmc_attach_sdio(host)`这一核心函数展开详细讨论,深入解析SDIO设备在Linux环境下的初始化流程。 ### 一、CMD5命令的发送 首先,在`mmc_attach_sdio(host)`函数的执行过程中,会向SDIO设备发送CMD5...
比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC;好像是六部十层;;比赛工程2,初始化上行至10层;电梯PLC...
C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
### 新唐NUC977开发板U-Boot代码解析:SD卡初始化及MMC相关命令 #### 一、概述 本文旨在深入分析新唐NUC977开发板上U-Boot启动过程中SD卡初始化的过程及其相关的MMC命令实现。SD卡在嵌入式系统中作为存储介质被...
在工业控制系统中,"设备初始化失败"是一个常见的问题,这可能由多种原因引起,例如驱动程序不兼容、系统设置错误、硬件故障或是缺少必要的组件。在本案例中,提到的“组态王设备初始化失败安装可用”指的是,当遇到...
PMON 设备初始化代码是 PMON 设备的核心组件之一,它负责初始化 PMON 设备的各个组件,包括 PCI 设备、内存、时钟频率、异常处理等。下面我们将对 PMON 设备初始化代码进行详细的分析。 1. PCI 设备初始化 PMON ...
新唐NUC977开发板uboot代码解析4-LCD初始化 新唐NUC977开发板uboot代码解析4-LCD初始化
在Quartz 2.2.3版本中,初始化数据库是使用Quartz的关键步骤,因为Quartz依赖于一个持久化存储来保存作业和触发器的信息。这个过程通常涉及执行一系列SQL语句来创建必要的表结构。 Quartz的初始化SQL语句主要用于...
解决数码视讯Q5使用USB_Burning_Tool刷机时 提示 初始化DDR/读取初始化结果/USB错误