利用实时Java设计数字音频系统

[10-10 20:36:41]   来源:http://www.88dzw.com  电子制作   阅读:8266

文章摘要:在对可靠运行该主程序所需的堆栈内存进行分析时,静态分析器必须确定在该方法以及该方法所调用的方法中,每个对象要求分配多大内存。为了支持静态分析结果的模块化合成,字节码验证器要求每个由主程序调用的方法被声明为@Static-Analyzable,而enforce_time_ analysis属性设置为true。快速复查main方法的实现可确保无限循环内不产生分配。这是字节码验证器所要执行的任务之一。 在第37行的socket_reader_thread = new Thread-Stack(SocketReader.class);到41行的orchestrator_thread = new Thr

利用实时Java设计数字音频系统,标签:电子小制作,http://www.88dzw.com
在对可靠运行该主程序所需的堆栈内存进行分析时,静态分析器必须确定在该方法以及该方法所调用的方法中,每个对象要求分配多大内存。为了支持静态分析结果的模块化合成,字节码验证器要求每个由主程序调用的方法被声明为@Static-Analyzable,而enforce_time_ analysis属性设置为true。快速复查main方法的实现可确保无限循环内不产生分配。这是字节码验证器所要执行的任务之一。

在第37行的socket_reader_thread = new Thread-Stack(SocketReader.class);到41行的orchestrator_thread = new ThreadStack(Orchestrator.class)之间分配了几个新的ThreadStack对象;每次分配描述了主程序派生的线程所使用的堆栈内存。一般来说,静态分析工具可能难以确定可靠执行这些子线程所必需的堆栈内存数量。

每个ThreadStack构造函数的参数为提供代码由相应线程执行的类(Class)。静态分析器要求每个在该环境中传递的NoHeapRealtimeThread子类具有带@ StaticAnalyzable注释,且enforce_ memory_analysis属性设置为true的run()方法。如果ThreadStack构造函数的参数并非来自BoundAsyncEventHandler(例如在Orchestrator类的情况下),则静态分析器要求该类的asyncEventHandler()方法采用@StaticAnalyzable注释来声明,且enforce_memory_analysis属性设置为true。

当前线程的运行时栈能满足所有临时内存需要。请注意,我们在第23行分配了两个临时BufferPair实例,microphone_stream = new BufferPair();而在第24行,speaker_stream = new Buffer-Pair();然后这些对象的参数被传递至构造函数,用于包含该软件应用的不同功能组件的各个线程。硬实时验证器实施的限制之一在于,stack-allocated对象的参数不能比引用参数的对象本身生存时间更长,同样是通过注释机制来执行。我们来看一下SocketReader类的构造函数:

@ScopedPure
@StaticAnalyzable(enforce_time_analysis = {false}, enforce_non_blocking = {false})
SocketReader(SimpleAudio sa, Buffer-Pair buffers, String socket_name) throws
FileNotFoundException

@ScopedPure注释说明该构造函数的每个输入引用参数(reference parameter)可以指代那些位于外部嵌套作用域的运行时栈的对象。字节码验证器确保这些参数的内容绝不会复制到那些由于具有@Scoped指派而未被同样区分的变量上。

此外,它禁止将内部嵌套作用域变量的值复制到外部嵌套作用域变量。一个例外情况是,在特殊环境下,它可证明带参数对象位于与要赋值变量相同或更外层嵌套的作用域。如果这一构造函数的参数未由@Scoped注释指定,字节码验证器将不允许主程序将参数传至堆栈分配的BufferPair和SimpleAudio对象。

本应用展示的RTSJ支持的实时编程抽象之一为PeriodicTimer类。注意,本应用在第49行举例说明了PeriodicTimer对象,drumbeat = new PeriodicTimer(start_time, period, orchestrator);并将结果赋值给本地drumbeat变量。参数之一为orchestrator对象的引用参数,其本身是BoundAsyncEventHandler的一个实例。该drumbeat周期计时器被设置为每秒触发orchestrator对象的handleAsyncEvent()方法执行16次,即每62.5微秒一次。

采用C或C++语言的实时开发人员可以实现这些实时Java技术所支持的许多相同构造。但是,C或C++程序员必须产生悬挂指针(dangling pointer)以及内存泄漏,他们还缺乏标准工具的支持来自动分析执行时间和堆栈大小。

另外,C和C++程序员还缺乏完整性检查以确保方法的实现能够满足文档化实时接口的要求,并确保方法调用能够传递同样满足文档接口要求的参数。最后,在对现在软件系统进行维护的过程中,C和C++程序员没有工具支持来保证对现有软件的修改与在原软件开发过程中假设的各种组成要求是相符的。

传统Java在生产效率和成本上具有许多优势。规范地使用实时Java技术可提供许多这样的优势。与使用C和C++相比,一般Java程序员在新代码开发期间具有2倍的生产率,而在现在软件维护期间具有5到10倍的生产率。随着嵌入实时软件的大小和复杂度增加,这些激发人们向更现代的软件工程技术(如由实时Java实现的工程技术)转化的因素已越来越重要了。

上一页  [1] [2] [3] [4] 


Tag:电子制作电子小制作维修教程知识 - 电子制作

《利用实时Java设计数字音频系统》相关文章