没有合适的资源?快使用搜索试试~ 我知道了~
计算动态控制流图的自顶向下定点近似算法
65理论计算机科学电子笔记45(2001)网址:http://www.elsevier.nl/locate/entcs/volume45.html12页定点近似丹尼尔·达米安金砖国家1奥胡斯大学计算机科学系Building 540,NyMunkekeen,DK-8000 Aarhus C,Denmark电子邮件:damian@brics.dk摘要Shivers的博士论文中引入了时间戳 我们表明,它们适合于计算程序分析,其中结果的空间(例如,控制流图)很大。 我们正式的时间戳作为一个自上而下的,固定点的近似算法,它的主要-泰恩斯一个单一的副本的中间结果。然后我们证明了该算法的正确性1介绍1.1抽象解释和定点计算抽象解释[6,10]是程序分析系统推导的框架。在这个框架中,一个程序的标准语义近似的抽象语义。 抽象语义模拟 标准语义,用于提取程序实际运行时行为的属性。抽象解释经常产生由一组递归方程指定的程序分析形式上,分析被定义为特定格上泛函的最小不动点分析一个程序就等于计算这样一个最小不动点。因此,设计和分析计算最小不动点的算法已成为一个经典的研究课题。本文提出了一种自顶向下的算法,用于计算特定类别程序分析的近似解。这个类包括分析具有动态控制流的程序,即其控制流由程序变量的运行时值确定的程序。例如,在高阶语言和面向对象语言中,这样的程序很常见。1计算机科学基础研究(www.brics.dk),由丹麦国家研究基金会资助。2000年1月,出版社dbyElsevierScienceB。 V. 在CC BY-NC-ND许可下开放访问。大面66分析具有动态控制流的程序的共同问题是计算动态控制流图的静态近似。流信息通常被表示为一个表,该表将每个程序点映射到形成从该点的可能的输出边的点集。该分析可以计算流信息作为单独的阶段,或者作为抽象解释的集成组件。在任何情况下,流信息本身被计算为泛函的最小不动点满足用于计算这种分析的解的算法,困难的实际限制:由于嵌入在分析结果中的控制流程图的潜在大小,因此不能强制要求保持多个中间结果。这里考虑的基于时间戳的算法在整个计算过程中只需要维护单个中间分析结果。1.2时间戳技术时间戳技术之前已经在Shivers关于Scheme的控制流分析的博士论文[19]中介绍过使用时间戳Shivers实现了一种自顶向下的算法,该算法计算分析的语义规范的近似值,并且不维护多个中间结果。算法的终止依赖于抽象语义所需的单调性和在抽象环境中使用时间戳。该算法在程序路径的顺序分析中使用了越来越近似的环境,从而得到了一个近似.据我们所知,Shivers的论文包含了时间戳技术的唯一描述。本文提供了一个正式的帐户上执行的抽象控制流语义的一些转换,以获得一个有效的实现(如,例如,“积极的cuto的”方法)。然而,时间戳的引入仍然只是非正式地描述。特别是,他对时间戳算法的描述[19,第6章]依赖于这样一个性质,即由修改后的算法计算的递归集包含在由基本算法计算的递归集中。这种属性依赖于原始语义的单调性,并且与修改为使用单线程环境的算法的关系仍然不清楚。我们的工作:我们形式化的基于时间戳的近似算法作为一个通用的固定点近似算法,我们证明了它的正确性。1.3概述文章的其余部分组织如下:在第2节中,我们描述了基于时间戳的近似算法。在第2.1节中,我们定义了类大面67^∈^×→× ×→递归方程的算法是适用的。在2.2节中,我们描述了时间戳背后的直觉。我们将在第3节中对基于时间戳的算法进行形式化(第3.1节)并证明其正确性(第3.2节)。在3.3节中,我们估计了算法的复杂度在第4节中,我们将展示如何将该算法扩展到更广泛的分析类别在第5节中,我们回顾了相关的工作,在第6节中,我们总结。2基于时间戳的近似算法2.1一类递归方程我们考虑一类递归方程模型的程序分析的抽象解释。该分析收集有关程序的信息通过模拟它的执行。抽象的细节,我们认为,一个给定的程序p诱导一个有限的程序点集Lab。从一个程序点到另一个程序点的转换被建模为图中的有向边的分析收集信息的一个元素ρ^的一个复杂的阁楼eA(we假设A具有有限的高度)。通常,这种分析信息是以收集关于程序点和变量的信息的高速缓存在我们的设置中,在程序点lLab处,利用中间分析信息ρ,从局部分析信息以及通过分析所有可能的外出路径获得的结果的并集来计算分析的结果。例如,当布尔条件的结果未知时,分支语句的分析可以作为两个分支的分析的并集来获得。在高阶语言中,函数调用的分析(e0e1)可以作为对表达式e0可以求值的所有函数特定传出边的选择可以确定特定更新的分析信息。例如,在选择可以在应用点调用的函数之一之后,用与实际参数相关联的信息更新与形式参数相关联的信息。因此,我们认为局部分析信息由单音函数B定义:(实验A)A。我们还认为,与从一个程序点到另一个程序点的过渡相关的分析信息由单调函数V定义:(实验室A) A.这些函数可以建模,例如,Sagiv,Reps和Horowitz的环境转换器[17],但它们也可以建模单调框架[12,13]。以收集分析的方式将转换信息添加到已经计算的分析信息中[6,18]。为了对动态控制流进行建模,我们认为,在特定节点l处,并且在存在已经计算的分析信息ρ的情况下,可能的未来节点的集合由单调函数R:(Lab×A)→ P(Lab)描述:从当前节点n和R(l,ρ^)的元素获得过渡s。大面68×→^ ^您的位置:^^^ ^您的位置:^ ^您的位置:^^^^因此,通用分析函数F:(Lab A)A可以由以下递归方程定义:F(l,ρ)= B(l,ρ)H.lJ∈R(l,ρ^)F(lJ,p^HV(l,lJ,p^)), (n)如果函数B、R和V在ρ上是单调的(Lab本质上是一个非线性域),则可以很容易地证明方程(R)有解。给定程序的起始点l0和一些初始(可能是空的)分析信息ρ0,我们感兴趣的是计算一个值F(l0,ρ0),其中F是方程(1)的最小解。计算整个函数F作为方程(f)的最小解通常更昂贵。当然,我们只想实现一个计算F(l0,ρ0)值的程序。当然,为了计算一个值F(l,p),需要控制终止(可能出现对(l,p)的重复序列),并且当当前节点l具有多个传出边时,还需要保存当前分析信息p的中间副本。记忆化是控制终止的一种解决方案。当空间分析结果的存储量很大,然而,维护存储表的成本,加上保存中间结果的成本,导致了极其昂贵的实现。我们可以使用Shivers的时间戳技术[19]来解决这两个问题,只要我们对F(l 0,ρ ^ 0)的近似感到满意。2.2时间戳我们提出了一个伪代码制定的算法,非正式地描述的时间戳技术。我们将在第3节中适当地形式化该我们假设我们给出了由函数B、R和V(我们假设它们是可计算的)指定的分析的一个实例。图1给出了基于时间戳的近似算法的伪代码。基于时间戳的算法使用时间计数器t(初始化为0)和表τ,表τ将初始化为0的时间戳τ[1]与每个程序点l相我们将分析结果计算为全局变量ρ,初始化为ρ0。从本质上讲,函数FJ是通过从F函数中提升ρ时间计数器t和时间戳表τ(建模为数组也是全局变量。函数U用新信息更新全局分析:如果获得新结果,则时间计数器在添加到全局分析中之前, 函数FJ实现了基于时间戳的近似。 为了估算出对于F(l),我们计算局部信息B(l,ρ^),并将结果添加到全局分析中。 我们计算了R(l,p)的函数的集合。为each未来节点lJ∈R(l,ρ^),等价地计算执行信息大面69^^^ ^您的位置:∗全局ρ^:A, t:N, τ:NararayprocFJ(l)=ifτ[l]/=tthenprocU(ρ^1)=ifρ^1/±ρ^thent:=t+1;ρ^:=ρ^Hρ^1t[l]:=t;对于R(l,p,j)中的反应lJU(B(l,ρ^));U(V(l,lJ,p^));FJ(lJ)图1.一、基于时间戳的近似算法V(l,lJ,ρ)沿着边(l,lJ),我们将其结果加到ρ上,然后我们称FJ(lJ)。因为在第二个或以后的分支上对FJ的所有调用都是用可能更大的ρ进行的,所以可能会发生近似。每次ρ通过添加新信息而增加时,我们递增时间计数器。每次我们在程序点l上调用FJ时,我们将时间计数器的当前值记录在时间戳表中l的时隙处τ[l]:=t. 我们使用时间戳表来控制终止。 如果函数FJ在点l上调用,使得τ [l] = t,则已经调用了FJonl,并且环境从那以后就没有更新过。因此,这个调用不会向环境中添加新的信息,我们可以返回而不执行任何计算。然而,这种正确性论证只是非正式的。在他的论文中,Shiv- ers [19]在Scheme的控制流程分析的背景下详细描述了时间戳技术。他证明了记忆化(即所谓的时间戳的引入和通过在全局变量中收集结果而获得的近似仍然只是非正式地证明。在下一节中,我们提供了基于时间戳的近似al-出租m的形式化描述,并证明了其正确性。3基于时间戳算法的形式化描述3.1状态传递递归方程我们形式化的算法和时间戳技术作为一个新的集合递归方程方程精确地描述了算法的计算步骤。它们被设计为使得它们的解决方案可以与图1中的算法在标准编程语言中的实现的语义直接相关。同时,他们定义了前一页方程()的近似解。我们证明了新方程的解确实是原始形式的近似。这些方程是对状态传递计算的建模。 全局状态大面70^^^^×→^^^×→FJ(l,(ρ^,τ,t))=ifτ(l)=t,n(ρ^,τ,t) 否则让{11,. ,ln}=R(l,pn)(ρ^0,τ0,t0)=U(B(l,ρ^),(ρ^,τ[l<$→t],t)).(ρ^n,τn,tn)=FJ(ln,U(V(l,ln,ρ^n−1),(ρ^n−1,τn−1,tn−1)in(ρ^n,τn,tn)U(ρ^1,(ρ^,τ,t))=ifρ^1/±ρ^,则n(ρ^Hρ^1,τ, t+1)个元素e(ρ^,τ,t)(ρ^1,τ1,t1)=FJ(l1,U(V(l,l1,ρ^0),(ρ^0,τ0,t0)))包含分析信息ρ、时间戳表τ和时间计数器t。 时间戳表由一个函数建模τ∈Lab→N:(ρ^,τ,t)∈状态s=(A×(Lab→N)×N)与标准指称语义不同,我们考虑N与自然数的通常排序因此,国家是一个无限域,包含无限的上升链。为了限制上升链的高度,我们限制了空间,以更精确地反映计算中的可能状态集状态s={(ρ^,τ,t)∈(A×(Lab→N)×N)|t≤h(ρ^)∈Lab. τ(l)≤t}在这里,函数h(ρ)A低于ρ“。非正式地说,这个限制说明了这样一个事实,即我们每次向ρ中添加信息时,t都要递增。从ρ=和t= 0开始,t总是小于A中从底部到ρ的最长上升路径。第二个条件说明时间戳表记录的时间戳小于或等于时间计数器的值定义时间戳近似值的递归方程如图2所示。他们定义了一个函数FJ:(Lab States)States,该函数对状态传递计算进行建模。很容易证明U:(A状态)国家是有明确定义的(在国家的有限空间上)。由于B、V和R的单调性,图2中方程的解的存在性可以很容易地建立起来。注意,未来节点集合R(l,p)的元素被处理的顺序仍然是未指定的。这方面并不妨碍我们进一步大面71∗^评价战略是一项重要的战略,它有助于发展,同时为改进评价战略留下空间。对国家的限制和非标准的主要原因语义是我们将函数的定义限制为严格终止的实例。很容易证明FJ终止于任何初始程序点和初始状态。 事实上,这样的初始配置决定了一个状态的迹线,我们用它来证明函数FJ计算出了分析的一个安全近似。3.2正确性基于时间戳的算法的正确性,即,它计算由第4页上的等式()定义的函数的近似值的事实由以下定理建立。Theorem3. 1Foranyl∈Labanddρ^∈A:F(1,ρ1)±π1(FJ(1,(ρ1,λ 1)。0,1)该定理分两步证明。 首先,我们展示了使用时间戳控制递归不会改变分析的结果在这个意义上,我们考虑一个定义函数FJJ的中间方程:(Lab×States)→A。FJJ(l,(ρ,τ,t))=ifτ(l)=t,n。⊥eleB(l,ρ^)HlJ∈R(l,ρ^)FJJ(lJ,U(V(l,lJ,ρ^),(ρ^,τ[l<$→t],t)我们证明了函数FJJ计算的分析与方程(1)定义的函数相同。引理3.2设l ∈ Lab为程序点,(ρ,τ,t)∈ States. 设S ={lJ∈Lab|τ(l,J)=t}。我们有:FJJ(l,(ρ^,τ,t))H.F(l,J,p^)=F(l,p^)H。F(lJ,ρ^)lJ∈SlJ ∈S引理3.2使用状态的有理有据归纳法证明,基于观察到FJJ调用自己的参数严格高于原来的(在国家的空间作为引理3.2的一个例子,我们得到:推论3.3l∈Lab,ρ^∈A. F(1,ρ1)=FJJ(1,(ρ1,λ 1)0、1))我们表明,时间戳算法计算函数FJJ的近似。引理3.4<$(ρ^,τ,t)∈状态s, l∈Lab. FJJ(l,(ρ^,τ,t))±π1(FJ(l,(ρ^,τ,t)大面72^^^^^·∗引理3.4的证明将递归树与函数FJJ的定义和FJ的计算中的状态迹联系起来。本质上,FJJ(l,(ρ,τ,t))的值被定义为以下形式的B(li,ρi). 我们通过对树的深度的归纳表明,值在状态迹上的某个点上累积到最终结果中在FJ的计算中。引理3.4的完整证明在本文的扩展版本中给出。结合这两个引理,我们得到定理3.1的陈述尽管在定义图2中的方程的解时使用了非标准的排序和域,但表明函数FJ与算法在图1中的是微不足道的,不是当前演示的一部分3.3复杂性估计假设计算函数U需要m个时间单位,并且B、R和V可以在恒定时间(一个时间单位)内计算。时间计数器最多可以增加h(A)次,其中函数h定义了格A的高度(由最长的上升链给出)。在最坏的情况下,在两个增量之间,可以探索图中的每条边,并且对于每条边,我们可能花费m个时间单位来计算U函数。 因此,在本发明中,计算FJ(l,(ρ,λl. 0,1))的复杂度为O(|LaB|2·m·h(A))。在空间方面,可以立即看到A的最多两个元素在在任何给定时间的内存:全局值ρ和每次调用B或V时创建的一个临时值。不过,暂时值并不重要:在大多数情况下,B或V的结果的大小比ρ的大小小一个数量级。最坏情况下的空间复杂度也是由边的探索驱动的可以立即看到,在全局环境的两次更新之间,每个边都可能被搁置一边。如果用S(A)表示A中元素的大小,则最坏情况下的空间复杂度可能为O(S(A)+|实验室|2h(A))。然而,似乎很明显,许多被搁置一边的边缘是多余的。我们目前正在探索避免其中一些冗余的可能性4延长时间戳方法最初是在连续传递风格(CPS)的Scheme程序的流程分析中提出的[19]。实际上,第4页上的等式()的公式化便于分析“从不返回”的计算,没有特殊的原因,时间戳技术可能不会被扩展到非尾部递归分析。我们展示了时间戳技术如何可以扩展到高阶语言的分析,大面73^不有一个非尾递归公式。在他们关于CPS与程序分析中的直接风格的论文[16]中,Sabry和Felleisen还建议使用记忆化技术来计算直接风格的高阶语言的常数传播结果。常数传播分析有一个非组合、非尾递归定义。事实上,为了模拟分析一个术语,设M中x=V1V2,Sabry和Felleisen分析探索了所有可能的可以在let的头中调用的tions,连接结果,然后-ward,分析了M.我们可以将时间戳技术应用于Sabry和Felleisen的分析,以便更有效地计算近似解。我们考虑以下形式的方程:F(l,ρ^)=letρ^1=B(l,ρ^)H.lJ∈R(l,ρ^)F(lJ,ρ^HV(l,lJ,ρ^))inB J(l,ρ^1)H.lJ∈RJ(l,ρ^1)F(lJ,ρ^1HVJ(l,lJ,ρ^1))该算法是直截了当地扩展到占第二在RJ(l,ρ1)上进行另一次迭代。 正确性的证明 也值得注意的是,尽管有更复杂的公式,由于时间戳施加的界限,算法的复杂度保持不变。将基于时间戳的算法应用于Sabry和Felleisen的分析的好处是,它产生了比他们提出的基于记忆的实现更有效的算法(原因在第2.1节中概述)。得到的近似值仍然足够精确。特别是,基于时间戳的分析能够区分收益。例如,考虑下面的例子(也是由于Sabry和Felleisen):设f=λx.xx1=f1x2=f2在x1基于时间戳的分析计算一个解,其中x1(以及因此整个表达式的结果)绑定到1,x2绑定到。相比之下,基于单变量约束的数据流分析[13]计算出一个解,其中x1和x2都绑定到T。形式上,相对容易表明基于时间戳的常数传播总是计算出至少与标准的基于单变量约束的数据流分析一样好的结果。这篇文章省略了细节。请注意,基于约束的分析在质量上的改进是以最坏情况下的时间和空间复杂度为代价的大面745相关工作许多作者描述了计算最小不动点的算法,作为使用混沌迭代进行程序分析的解决方案,这些算法也适用于使用加宽或展开计算近似值[6]。这种算法也被应用于具有动态控制流的语言。Chen,Harrison和Yi [4]开发了先进的技术,如“等待所有后继者”,“前沿优先”,“暂停评估”,这些技术在应用于此类语言时改善了自底向上算法的行为。在随后的工作[3]中,作者使用可达性信息来实现一种称为“上下文投影”的技术,该技术减少了与每个程序点相关的抽象信息的数量。相比之下,时间戳近似的解决方案,通过维护只有一个全局上下文常见的所有程序点。在严格性分析的上下文中,已经描述了处理具有动态流的语言的其他算法。Clack和Peyton-Jones [5]已经引入了基于前沿的算法。该算法通过仅用相关值的子集表示解来减少空间使用。这项技术是为二元格而发展起来的。HuntLe Charlier和Van Hentenryck研究了逻辑程序抽象解释的定点算法的自上而下与自下而上方面两位作者开发了一种通用的自顶向下算法固定点算法[2],并将其与替代的自底向上策略进行了比较。其算法的评价策略与本文中基于时间戳的算法相似。然而,相比之下,由于他们的算法精确地计算了最小固定点,它还维护了结果网格中的多个值Fecht和Seidl [7]设计了时间戳求解器该算法还使用时间戳,但方式不同:时间戳用于将算法的工作列表解释为优先级队列。我们的技术只是使用时间戳来控制计算的终止。 在在续篇[8]中,作者导出了一个用于分布约束系统的固定点算法,并使用它来计算表示为一组约束的图。6结论本文提出了一个多项式时间算法来逼近一类递归方程的最小不动点。算法利用时间大面75戳来控制递归,并通过重用中间结果来避免在程序分支上重复分析信息。时间戳技术最初是由Shivers在他的博士论文中介绍的[19]。据我们所知,这一想法尚未得到落实。我们已经提出了一个形式化的技术,我们已经证明了它的正确性。关于基于时间戳的算法的几个问题可能值得进一步研究。 例如,值得注意的是,在某个节点处处理传出边的顺序可能会影响分析的结果。设计一种改进的策略来选择下一个要处理的节点是值得研究的。此外,正如我们在3.3节中所观察到的,边缘可能会被独立处理多次,每次都有更大的分析信息。这表明某些处理可能是多余的。我们目前正在研究这种可能的改进算法,并证明其正确性。7致谢感谢Olivier Danvy、David Toman和Zhe Yang对本文的评论也要感谢匿名的推荐人。引用[1] 布尔东克勒,F.、E. 混沌 迭代 战略与Widenings,in:Proceedingsof the International Conference on Formal Methods in Programming and TheirApplications,Lecture Notes in Computer Science 735(1993),pp. 128-141[2] 夏 利 耶 湾 L. 和 p. 诉 Hentenryck, A universal top-down fixpoint algorithm ,Technical Report CS-92-25,Brown University,Providence,Rhode Island(1992)。[3] 陈 湖 , 澳 - 地 L. 和 W. L. Harrison , An Efficient Approach to ComputingFixpoints for Complex Program Analysis , in : Proceedings of the 8th ACMInternational Conference on Supercomputing(1994),pp. 98比106[4] 陈湖,澳-地L.,W. L.哈里森和K。Yi, Eccient computation of fixpointsthatarise in complex program analysis , Journal of Programming Languages3(1995),pp. 31比68[5] 克拉克角和S.L. Peyton Jones,不确定性分析-一种实用方法,在:J. -P.Jouannaud , 编 辑 , Proceedings of the Second International Conference onFunctional Programming and Computer Architecture,201号,计算机科学讲义(1985年),pp.35比49[6] Cousot,P. and R. Cousot,抽象解释:通过构造或近似定点进行程序静态分析的统一格模型,in:R. Sethi,编辑,Proceedings of the Fourth AnnualACM Symposium on Principles of Programming Languages(1977),pp. 238-252。大面76[7] 费希特角和H. Seidl,An even faster solver for general systems of equations,in:R. Cousot和D. A. Schmidt,editors,Proceedings of 3rd Static AnalysisSymposium,Lecture Notes in Computer Science1145(1996),pp.189-204.[8] 费 希 特 角 和 H. Seidl , Classiating Differential : An efficient new fixpointalgorithm for distributed constraint systems , in : C.Hankin , editor ,Proceedings of the 7th European Symposium on Programming,Lecture Notesin Computer Science1381(1998),pp.90比104[9] 亨特,S.,“功能语言的抽象解释:从理论到实践”,博士。英国伦敦帝国理工学院计算机系博士论文(1991年)。[10] 琼斯,N。D. 和F.Nielson,Abstract Interpretation:A Semantics Based Toolfor ProgramAnalysis,4,Oxford University Press,1995 pp.527-636[11] Jørgensen,N.,使用需求分析和混沌迭代,在:B。L. Charlier,editor,Static Analysis , number 864 in Lecture Notes in Computer Science(1994),pp.329-345[12] Kam,J. B.和j.d. Ullman,Monotone data datashew analysis frameworks,Acta Informatica7(1977),pp. 305-317[13] Nielson,F.,H. R. Nielson和C.Hankin,[14] 奥基夫河,巴西-地一、有限固定点问题,在:J. - L. Lassez,editor,LogicProgramming,Proceedings of the Fourth International Conference(1987),pp. 729-743.[15] Rosendahl,M.,高阶混沌迭代序列,在:M。Bruynooghe和J. Penjam,编辑,第五届编程语言实现和逻辑编程国际研讨会论文集,计算机科学讲义第714期(1993年),pp. 332-345[16] Sabry,A.和M. Felleisen,Is continuation-passing useful for data crossflowanalysis?V. Sarkar,编辑,Proceedings of the ACM SIGPLAN1-12号。[17] Sagiv,S.,T. W. 代表和S。Horwitz,Precise interprocedural data crownanalysis with applications to constant propagation , Theoretical ComputerScience167(1996),pp.131-170[18] 施密特,D。一、基于自然语义的抽象解释,在:A。Mycroft,editor,Static Analysis , number 983 in Lecture Notes in Computer Science(1995). 1-18号。[19] 颤抖,O.,“高阶语言的控制流分析”,博士。论文,计算机科学学院,卡内基梅隆大学,匹兹堡,宾夕法尼亚州(1991年),技术报告CMU-CS-91-145。[20] 杨,J。和p.Hudak,Finding fixpoints on function spaces,Technical ReportYALEEU/DCS/RR-505,Yale University,New Haven,CT(1986)。
下载后可阅读完整内容,剩余1页未读,立即下载
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)
会员权益专享
最新资源
- 基于嵌入式ARMLinux的播放器的设计与实现 word格式.doc
- 经典:大学答辩通过_基于ARM微处理器的嵌入式指纹识别系统设计.pdf
- 嵌入式系统课程设计.doc
- 基于飞思卡尔控制器的智能寻迹车设计ARM基础课程课程设计.doc
- 下载基于ARM7的压电陶瓷换能器导纳圆测量仪的研制PDF格式可编辑.pdf
- 课程设计基于ARM的嵌入式家居监控系统的研究与设计.doc
- 论文基于嵌入式ARM的图像采集处理系统设计.doc
- 嵌入式基于ARM9的中断驱动程序设计—课程设计.doc
- 在Linux系统下基于ARM嵌入式的俄罗斯方块.doc
- STK-MirrorStore Product Release Notes(96130)-44
- STK-MirrorStore Storage Connectivity Guide for StorageTek Disk A
- 龙虾养殖远程监控系统的设计与实现数据采集上位-机软件模块-本科毕业设计.doc
- 龙虾养殖远程监控系统的设计与实现数据采集上位-机软件模块-.doc
- 龙虾养殖远程监控系统的设计与实现数据采集上位-机软件模块-本科生毕业论文.doc
- 麻阳风貌展示网站的设计与实现毕业论文.pdf
- 高速走丝气中电火花线切割精加工编程设计.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](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)