没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记153(2006)99-115www.elsevier.com/locate/entcssynERJY一种面向对象的同步语言ReinhardBudde1AxelPoign'e2Karl-HeinzSylla3Fraunhofer InstituteD-53754 Sankt-Augustin摘要介绍了程序设计语言synERJY。它集成了面向对象和syn-symptoms形式主义的精神,ESTEREL,LUSTRE,和STATECHARTS。关键词:同步编程,面向对象设计,层次状态机,数据流1引言synERJY是一种嵌入式系统的编程语言和设计环境它结合了两种范式:• 面向对象的建模,用于稳健和灵活的设计。• 同步执行,用于精确建模反应行为。亮点是,• synERJY提供了一个将反应行为深度嵌入到面向对象数据模型中的方法。1Ema il:reinhard.budd e@ ais. fra unho f err. De2电 子 邮件:p.poigne@ ais.fraunhofer.de3电子邮件:karl-heinz. ais.fraunhofer.de1571-0661 © 2006 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.02.026100R. Budde等人/理论计算机科学电子笔记153(2006)99• synERJYo提供同步形式主义的细粒度集成,例如[14][15][16] [17][184编程环境支持编译、配置、仿真和测试,因为它为模型检查器提供输入。行为描述可以以图形或文本形式编辑代码生成器的高效和紧凑的代码在C和几个硬件格式可用。本文概述了语言,它的设计决策,它的语义。2反应类、传感器和信号重新上课。 SYNERJY通过简单的类来扩展S(asubsetoof)JAVATM。如果一个类的构造函数以语句结尾,active {. 个文件夹它嵌入了同步反应式代码。这段代码在每一个时刻都在执行。一个简单的反应类是class Signals{Sensor int> sensor = new Sensor int>(new SimInput());Signal int> actuator = new Signal int>(new SimOutput());public void run(){活动的{如果(?sector){emit actuator($sector+1);};}的情况;}的情况;}传感器和信号。反应对象通过传感器和信号进行通信。传感器只能由环境更新。信号可以由程序更新。传感器和信号两者可以存在或不存在。当且仅当传感器或信号在瞬间被更新时,该传感器或信号在瞬间否则,它是缺席的。 在上面的示例中,有一个传感器传感器和一个信号致动器。reactive语句if(?sensor){emit actuator($sensor+1);};检查传感器传感器是否存在。如果存在传感器,则信号执行器以传感器的值$sensor加1的新值发射。的类型传感器信号4.我们假设您熟悉面向对象设计和同步编程。R. Budde等人/理论计算机科学电子笔记153(2006)99101是一种新的内置引用类型,其中T是原语或类类型。有纯传感器和传感器类型的信号。没有值信号。与传感器相关的操作员是?s:检查传感器s是否存在。$s:产生传感器s的值。@s:生成传感器何时% s最后一次出现。可以使用以下语句更新信号emits(v):信号s被发出以在某个时刻出现,并且s的值被更新为v。emits用于纯信号。因此,信号可以被认为是传感器的子类型。接口。 信号总是私有的,就像反应对象的所有字段和方法一样。然而,传感器或信号可以与环境接口我们区分输入传感器、输出信号和本地信号。信号的类型由其构造函数决定。如果构造函数没有参数,则信号是局部的。如果信号构造函数有一个接口类型为Output的参数,则它是一个输出信号。传感器的构造函数必须始终具有接口类型Input的参数。接口类型Input和Output是所谓的标记接口,这意味着它们充当没有任何语义内容的占位符但是,实现必须提供适当的回调方法。• 输入传感器:一个方法new val,和一个方法get val,如果传感器被赋值,结果类型为T。• 如果信号被赋值,则输出用T类型的参数通知方法put val。根据同步执行模型,输入传感器在一个瞬间的开始设置:方法newval被调用。如果它返回值true,则传感器被设置为存在,并且如果它被赋值,则其值由作为get val的结果获得的值更新。 输出信号在一个时刻结束时被传送到环境中:如果输出信号存在,则在信号被赋值的情况下,将使用信号的实际值调用方法put val。55SimInput和SimOutput类是为了方便而内置的。他们组织的互动与同步ERJY模拟器。“真正的”应用程序需要“真正的”环境适配器。102R. Budde等人/理论计算机科学电子笔记153(2006)993反作用控制反应性陈述。synERJY的反应语句是6赋值x = E;方法调用m(E1,.,En);emittanceemit s(v);nothingnothing;序贯合成P1 ...Pn平行作文 || ... || Pn ]];条件if(E){P}else{Q};{P};(弱)抢占取消{P }when(E);activate{P}当(E);方法调用可以是空数据方法的调用,也可以是一种反应性的方法。一个方法是反应式的,如果它的主体包含一个反应式语句。响应式方法被内联扩展,即方法调用被其主体替换。下一条语句是唯一消耗时间的语句:如果开始,它只在下一个瞬间终止。顺序组合、并行组合、循环和条件组合的行为与同步语言中的预期一致.先占是最突出的反应性陈述。格式是cancel[ strong] [ next]{P}当(E1)[{P1}][elsewhen(E1)[{P1}]...[elsewhen(En)[{Pn}];随附条款由[...] . ]是可选的。我们区分弱抢占和强抢占:对于弱抢占,身体P在条件E1,.,En连续地被评估。如果Ei是第一个成立的条件,那么如果定义了,语句Pi就被求值取消对主体P的进一步对于强抢占,在执行主体之前评估条件后者是由修饰者强烈地表示的。抢占可能仅在开始之后的下一瞬间开始有效,[6]符号与ESTEREL的符号不同,因为运算符在意义上不同。例如,ESTEREL的各种抢占运算符组合在cancel运算符中。R. Budde等人/理论计算机科学电子笔记153(2006)99103执行cancel语句。 这由修饰符next7表示一个简单的例子可以说明演示的风格(其中awaitE是cancel{halt;}when(E);)的简写。class Counter{传感器开始=新传感器(新SimInput());传感器增加=新传感器(新SimInput());信号经过=新信号(新SimOutput());public intfindDuplicate(int i){latch= d;active{环的{等待?start;//等待start出现reset();//重置计数器cancel{//当..循环{//.. 存在信号增加wait(?incr);increment(); next;};//当..} when();//. isElapsed()为true..emitelapsed;//. 直到计数器超时下一个;}的情况;}的情况;}的情况;//数据字段和数据方法int latch;int counter;void reset(){counter= 0;}; voidincrement(){counter++;};boolean isElapsed(){return(counter>= latch);};}语义的过程。其语义与[ 9 ]中所规定的语义相对应,一般的想法是,每个反应语句P表示一个语义实体p,我们称之为同步过程。一个同步过程是用以下形式的“汇编程序”语句来表示的:s<=φ(如果φ保持不变,则设置导线 ss<=φ{ f}(如果φ成立,则设置导线 s并执行 fr-φ(如果φ成立,则设置寄存器r线和寄存器的区别在于,如果条件φ的计算结果为真,则线s在当前时刻被设置为[7]例如,104R. Budde等人/理论计算机科学电子笔记153(2006)99相反,寄存器r被设置用于下一时刻。语句的翻译是指称性的,即:状态的行为是从环境中其子语句的行为合成的。例如,考虑循环语句:[[loop{P}]]α βτ=letγ=new wire()且p=[[P]]γ β τinγ< = α|p. ωp环境由“系统线”α、β和τ组成导线α只在过程开始的那一瞬间是向上的,而β则在以后的所有瞬间都向上。导线τ用于抢占。这是对上述指称方程的解释:过程p是通过在新环境γ、β和τ中平移循环体P而获得的。如果线α或线p. ω中的任一个向上,则设置新线γ后者是一个特定的(合成的)线,当且仅当进程p终止时才是up。循环语句的指称语义由进程p和连线γ的定义组成。因此,如果循环语句开始,进程p也开始。如果p终止,则立即重新启动。这种循环模式在编译器中使用,但实际的实现还需要考虑轮回[4]。一般来说,编译器完全模仿这种指称语义。如果编译器被翻译,它将为上面的反例生成以下中间代码:信号:传感器I10是计数器。开始传感器I11是计数器。增量信号S1是计数器。已过方程式:G1< =((Beta&R4)|阿尔法)G3< =(Beta&R1)|G1)&I10)A1 = G3{reset()}G5< =(CC(A1)|G3)G7< =((Beta&R3)|G5)G9< =(Beta&R2)|G7)&I11)A2 = G9{increment()}G6< =(CC(A2)|(Beta&(R3| R2))|G5)A3 = G6{ D1 =isElapsed()}G13< =(CC(A3)|(G6&(CC)(A3)|D1)A4 =G13:Sv1=Val:nullS1=G13记忆:R4<-(CC(A4)|G13)R3<-((CC(A2)|G9)&不(G13))R2<-((R2| G7)&不是((G9|G13)8其中&代表逻辑和,和|逻辑或。R. Budde等人/理论计算机科学电子笔记153(2006)99105R1<-((R1| G1)&不(G3))在每一个时刻,这个顺序代码都被执行。线α只在最初的瞬间上升,线β在所有随后的瞬间上升。 应该注意的是,动作的执行将响应代码与数据代码联系起来。 数据动作可以阻止反应行为,例如,如果数据动作isElapsed()执行为真,则设置线D1。波前计算和因果关系。上面概述的转换方案生成了一系列汇编语句,需要根据同步范例的“先写后读”策略对其进行这种策略保证信号具有一致的状态synERJY使用拓扑排序。应该注意的是,synERJY程序的控制结构是在生成的汇编代码中这也适用于数据操作。数据操作的控件依赖性使用CC操作符进行编码例如,跟踪上面的示例,可以看到数据动作increment()必须在数据动作isElapsed()之前发生,因为触发后者的线G6依赖于A2。这正确地实现了弱抢占。因为拓扑排序只是[3]的构造性语义的近似。但我们相信,检测控制和信号流中的任何类型的循环是用户决定程序是否具有因果循环的简单而合理的标准。时间赛跑和先例。例如,如果两个数据动作访问同一个变量以便在一个时刻进行读取或写入,则数据动作的执行可能是连续的。synERJY检查我们称之为时间竞争的冲突。每当一个时间竞争是可能的瞬间,编译器提出了一个错误消息,因为时间竞争可能会导致非确定性的错误。与因果关系一样,分析是在句法层面上进行的。通常,时间竞争发生在并行语句的不同分支中调用的操作之间否则,通过控制流程解决潜在冲突。synERJY提供了几种工具来使用优先级语句来调度冲突操作,例如优先级{isElapsed() pre(count)+1;允许流动方程出现在维持状态的一个变体中,9syn ERJY提供了一个等效的图形符号和一个图形编辑器。108R. Budde等人/理论计算机科学电子笔记153(2006)99suspein{|......这是什么?| }的情况;它的主体由一系列的雷诺方程(和本地信号declarations)。当启动时,sustain语句永远不会终止;将永远应用Escherow方程。我们将谈论一种(操作)方式。该想法是,模式通常持续很长的时间间隔,但是如果需要,模式可以改变,例如从启动模式到工作模式,或者从工作模式到错误模式或维护模式。作为一个像任何其他进程一样的进程,sustain语句可以被抢占并(重新)启动,如下面的人工示例(类似于前面讨论的自动机)。public class CountingUpAndDown{Sensor reverse = new Sensor(new SimInput());Signal int> count = new Signal int>(new SimOutput());public void run(){活动的{return(0);取消支持|count:= pre(count)+1;|};计数模式} when(?reverse);next;取消支持|count:= pre(count)-1;|};倒计时模式} when(?reverse);}的情况;}的情况;}有两种模式:向上和向下计数当出现反向信号时,模式切换10信号重新审视。人们可能已经注意到,信号计数被发射,以及由一个Escherow方程约束。synERJY促进了信号的统一视图:信号可以通过使用emit语句或通过应用一个EQUIPLOW约束来更新就信号而言,这两个语句的行为等同• 如果通过发射或通过应用Escherow方程来更新信号,则其以新值呈现。emit语句和EQUIPOW方程是描述信号语义的不同方法,信号的语义以迹的形式给出10由于sustain语句可以用于自动机,我们实现了[8]中定义的模式自动机的R. Budde等人/理论计算机科学电子笔记153(2006)99109我012345678...反向...∗..∗.....计数012321000...其中索引i的范围是瞬时。惯例是黑体表示值和存在,斜体表示值和不存在。[11]请注意,信号即使不存在也有其值当然,在使用发射状态方程或回波方程之间存在概念上的差异,一个更适合于控制,另一个更适合于信号处理。我们假设读者知道这些差异,因此跳过讨论。时钟、时钟流类型和信号类型。 流表达式(用于一个Stronow方程的右侧)遵循LUSTRE[7]的语法,使用运算符前(前)当(下采样)->(初始化)电流(上采样)时钟被认为是类型信息的一部分。流表达式有LUSTRE定义的时钟。传感器和信号类型得到增强,具有通用格式传感器{C}T>相应信号{C}T>其中,“emitted”的信号总是有时钟真。因此,类型Sensor是传感器{true}T>和信号{true}T>的信号。emit语句和Escherow方程之间的唯一区别是,仅对于一个时间流方程,根据LUSTRE的规则检查时钟。其中,雷诺方程受到更多限制,原因在于,在下采样和上采样的情况下,该限制提供了更好的语义控制。注意,与传统的数据流语言相反,信号的更新不限于单个数据流方程。特别是在时钟为真的信号的情况下,信号可以是发射的,也可以是由数据流方程约束的。进一步注意,在某个时刻,信号可能既不被发射也不被约束。这是同步ERJY所支持的同步形式主义的统一的基础。[11]对于纯信号,我们只使用星号表示存在。110R. Budde等人/理论计算机科学电子笔记153(2006)99混合系统。混合动力系统在模式之间切换,其中每种模式由其自身的特征动态规律支配例如,模式转换由变量越过特定阈值(状态事件)、经过特定时间段(时间事件)或外部输入(输入事件)触发此外,通常要求每种模式在由复位关系指定的定义的初始条件作为混合系统的典型表示,我们考虑弹跳球:• 运动的特征是高度(x1)和垂直速度(x2),• 反弹之间的连续变化• 反弹时的离散变化• 动力学总结如下:· 一个模式q具有由方程指定的连续行为,xtec1=x2xtec2=−g· 从q到q的一个转变由条件x1≤0保护,· 一种重置关系,保持高度,但反转速度的方向,并将其降低一个因子,即x2设置为−c<$ x2。这种行为被自动机捕获自动机{init{ emit x1(height);int x(0);next statemove;};statemove期间{|x1:= pre(x1)+x2*((double)dt);x2:=-c*pre(x2)-> pre(x2)-g *((double)dt);|}when($x1 =0.0){next state move;};}的情况;我们评论该计划:∫• 用积分x=x0+xedx和积分由微分方程xn=xn−1+e(n)dt初始条件为x0。• dt是一个原始类型时间的预定义信号,其值是两个时刻之间传递的“实时”量。12• 在这段时间里。}是第二种模式,在这种模式下,可能会发生。我的天12synERJY提供了其他几个与实时相关的有用特性,例如一个具有明显含义的语句await 3sec。这是在同步范式的框架内处理的,因为因此,实时的分辨率由瞬时的频率决定R. Budde等人/理论计算机科学电子笔记153(2006)99111仅当控制处于相应的状态时(而不是当跳转到该状态时)才执行等式• initialization->操作符是相对于流上下文定义的:初始化总是在流上下文启动的瞬间发生因此,在该示例的情况下,每当值x1小于0时。0时,控制重新进入状态,并且在下一个瞬间,x2的值由x2的先前值减去因子c来初始化。然后,动力学定律xstec2=−g适用于下一个边界。这种定义为LUSTRE,其中初始化指的是第一个瞬间运行一个系统。然而,本地(重新)初始化对于混合系统来说很方便。13在synERJY中,所有的过渡。现在,通过箭头操作符进行本地初始化提供了指定重置关系的方法。初始条件可以取决于(全局声明的)信号在通过使用运算符pre访问的前一时刻的状态。这就是我们的“本地化”解释的基本原理运算符->和pre。146接口反应对象参数化反应类。传感器和信号通过调用其构造函数传递给反应对象。请注意,反应式对象只有一个构造函数。为了给出一个例子,我们修改了上面的类Counter:传感器和信号成为构造器class Counter{public int findDuplicate(int i,int n,int p,int p){latch= d;active{...}的情况;}的情况;...}[13] pre运算符也有类似的效果;当进入一个流上下文时,它被设置为默认值,除非它的参数是一个信号字段,就像例子中的情况一样[14]请注意,这推广了LUSTRE中这些运算符的使用。LUSTRE项目有- 在我们的术语中-只有一种模式。因此,箭头操作符的初始化只能在第一个瞬间发生,而操作符pre只有在第一个瞬间才有默认值。112R. Budde等人/理论计算机科学电子笔记153(2006)99像往常一样,使用操作符new来创建反应类例如,在PulseWidthModulation类中使用计数器来调制信号波, 使 其 在 指 定 的 瞬 间 数 内 “ 向 上 ” 和 “ 向下”。类PulseWidthModulation{static int max = 5; //用于计数的静态final intlow =15;Sensorstart = new Sensor(new SimInput());Sensor clock = new Sensor(new SimInput());Signal boolean> wave = new Signal boolean>(new SimOutput()); Signal toHighPhase = new Signal();//本地信号String getString();//两个计数器作为子对象计数器highTimer =新计数器(高,toHighPhase,时钟,toLowPhase);计数器lowTimer =新计数器(低,toLowPhase,时钟,toHighPhase);public String getString(){//运行String活动的{等待?start;emittoHighPhase;loop{等待?toHighPhase;emitwave(true);next;等待?toLowPhase;emitwave(false);next;}的情况;}的情况;}的情况;}如果值toLowPhase存在,则以值true发射信号波,并且如果值toHighPhase存在,则以值false发射信号波计数器highTimer计数高相位的时刻,由变量high的实际值指定,计数器lowTimer计数低相位的时刻,由变量low的实际值指定。对象组合的语义是,当生成类PulseWidthModulation实例• 信号参数由自变量代替,例如,当初始化变量highTimer时,计数器的信号参数start由信号自变量toHighTimer代替。• 对象PulseWidthModulation和它的所有反应子对象的反应代码-这里是两个计数器highTimer和lowTimer-被并行放置。在图片方面 让类Counter的一个实例由下式表示:R. Budde等人/理论计算机科学电子笔记153(2006)99113)时钟)开始(wave)ˆVVV反应码反应码反应码脉宽调制highTimer低定时器vvvv至低阶段ˆ到高相位ˆ启动时钟v反应码ˆ经过Kv它的反应代码由虚线框表示,对象本身由框架框表示。参数信号由从框框到虚线框的箭头表示,反之亦然。然后,类PulseWidthModulation的实例的反应性结构可以表示为:这幅图表明,所涉及的对象的反应代码是并行执行的,不同的代码片段通过一束信号进行通信我们说的信号总线是指这个捆绑包。信号总线由一个类中指定的所有信号(场)组成我们区分本地信号(如toHighPhase和toLowPhase)、输入信号(如时钟和启动)和输出信号(如波形)。一般来说• 反应对象和信号总线形成静态层次结构• 如果不同总线的信号被重新考虑输入和输出信号。我们想强调的是,每个反应对象都可以指定输入传感器和输出信号.这与更常见的想法相反,即输入和输出信号仅由配置对象定义有很好的理由:想象一下,一个应用程序的某些组件是一个用于提交个人身份证号码的键盘这种焊盘的设计可以变化,甚至在输入的数量方面也是如此然而,输入的数量通常与整个应用无关,其可能仅取决于是否已提交正确的引脚(信息114R. Budde等人/理论计算机科学电子笔记153(2006)99)B1reset tpin...)一个cceptBN)收据ˆ)反应码vvvv隐藏在其他方面)。键盘控制在界面方面的示意图可以是这里,pin意味着是整数值信号。如果提交接受,则框/反应对象分析按下的键的序列如果序列被提交,则pin被传送到应用,并且接收信号与OK消息一起被发射,否则仅接收信号与拒绝消息一起被发射键的数量与整个应用程序无关这取决于实际的垫。例如,它通常有10个键,用于电子银行,但也可能有其他构建。如果输入和输出信号只能在顶层指定,则可能必须接触应用程序的许多组件,以将键信号向下传递到引脚分析器,并将接收信号传递回顶层。 在synERJY中,这些变化仅具有局部影响,因为必须重新设计组件和连接器。因为synERJY的基本原理是面向组件的,即使到环境的接口可能不同,反应对象在应用程序中的行为也是相同的。7相关工作synERJY继承了ESTEREL和LUSTRE的反应概念。RGOS[8]是第一个将数据流与自动机集成的语言,而Sync-CHARTS[1]将自动机添加到ESTEREL。有几种方法可以将“同步行为”添加典型的加载项是以允许指定即时概念的库的形式提供的(例如,[5])。一般来说,嵌入更浅,例如,不提供因果关系和时间竞争的编译时分析因果关系通常通过改变同步模型来避免相比之下,synERJY忠实地实现了同步执行模型。R. Budde等人/理论计算机科学电子笔记153(2006)991158总结发言在设计同步机ERJY时,我们花了很多时间来平滑地整合所提出的概念。它采取了许多迭代,以实现一个演示文稿,我们希望由于synERJY特别针对微控制器,因此代码的效率是一个主要目标。编译器生成标准C作为可以使用交叉编译器部署 为一些标准微控制器提供了封装控制器操作的库。在这种情况下,使用中断和定时器的寄存器和位级的所有开发都可以在syn ERJY中完成。未来的工作将集中在扩展目标体系结构的数量,并进一步提高效率。该 语 言 已 被 用 于 几 个 学 生 课 程 , 并 在 机 器 人 内 部 应 用 它 可 以 在www.ais.fraunhofer.de/上免费获得。引用[1] 还有C . “R e p r e s e n t a t i o n d a n a l y s i s o f r e a c t i v e h av i o u r s : A s y n c h r o n o u s a p p r o a c h , “ i n : P r o c .C E S A ' 9 6 , L i l l e , F r a n c e , J u l y 1 9 9 6 .[2] Benveniste,A.,P. Le Guernic和C. Jaquemot,[3] Berry,G.,《纯粹的埃斯特雷尔的建设性语义学》,草稿本,www-sop.inria.fr/meije/esterel/doc/main-papers.html网站,1999[4] 贝瑞 G. 和 G. 贡蒂尔 “那 E星同步 编程 语言:设计,语义,实现,[5] Boussinot,F.,和J。- F. Susini,[6] 哈 雷 尔 , D. , “Statecharts: A visual approach to complex systems,” Science of ComputerProgramming,[7] Halbwachs,N.,P. Caspi,P. Raymond,和D.皮劳“The synchronous dataflow programminglanguage[8] Maranchinii,F. 、Y. 你好。1998年葡萄牙里斯本欧洲方案拟订专题讨论会论文[9] A. 波伊和L。 Holen d erski,“O n t e C o m b i n a t io n o f S y n c h r o n o s L a n g ages,“in:W. P. deRoever(ed.),
下载后可阅读完整内容,剩余1页未读,立即下载
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 京瓷TASKalfa系列维修手册:安全与操作指南
- 小波变换在视频压缩中的应用
- Microsoft OfficeXP详解:WordXP、ExcelXP和PowerPointXP
- 雀巢在线媒介投放策划:门户网站与广告效果分析
- 用友NC-V56供应链功能升级详解(84页)
- 计算机病毒与防御策略探索
- 企业网NAT技术实践:2022年部署互联网出口策略
- 软件测试面试必备:概念、原则与常见问题解析
- 2022年Windows IIS服务器内外网配置详解与Serv-U FTP服务器安装
- 中国联通:企业级ICT转型与创新实践
- C#图形图像编程深入解析:GDI+与多媒体应用
- Xilinx AXI Interconnect v2.1用户指南
- DIY编程电缆全攻略:接口类型与自制指南
- 电脑维护与硬盘数据恢复指南
- 计算机网络技术专业剖析:人才培养与改革
- 量化多因子指数增强策略:微观视角的实证分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)