CSCI1600: Embedded and Real Time Software Lecture 18: Real Time Languages Steven Reiss, Fall 2015 Programming Language Wars Programming Languages For real-time and embedded programming Choices Assembler C/C++ (low-level language) Java/C# (high-level language) Data flow languages (FPGA) Other How should we choose? Criteria for Choosing Small footprint for embedded systems Ability to write small code Ability to make efficient use of memory High performance Predictable performance Real time features Interrupts Scheduling tasks or threads Synchronization Criteria For Choosing Low Power consumption Other factors Fault tolerance Writing reliable code (verifiable, testable, understandable) Writing secure code Code understandability C versus C++ versus Assembler Footprint Performance Real time features (interrupts, synchronization, scheduling control) Fault tolerance Reliability Security Understandability Why Not Java What are the pros and cons? What about Java Not what Java was designed for Potential problems Java has the reputation of being slow & unpredictable Java programs are large Garbage collection and run time checks seem a bad idea Interpreted languages are too slow Reasons to Use Java Don’t want to give up a language we are used to Java programs are more reliable Many errors caught at source/run time level More secure Safety is critical Easier to verify Exceptions, threads, synchronization built in Data structures that are thread safe Using Java Two efforts under way Address embedding issues Address real time issues Understanding these helps understanding Embedded and real time programming in general Embedded Java Basic Problems VM, JIT compiler, libraries are big (64M, 256M) Scheduling abstraction used for threads is not fixed priority Java emphasizes device independence No access to physical memory (IO) How can these problems be addressed? Java ME and pJava Attempts to address size & independence issues Organized in terms of configurations Configuration = broad range of similar devices Determines what libraries to include Determines JVM features to include Scalable OS Select the features needed for the application Can run in 64k in smallest configuration No verification, finalization, class loader, thread groups, reflection Limited I/O, error handling Limited data types (no 64 bit, no multidimensional arrays) J2ME Configurations Connected Devise Configuration Limited set of library classes 32 bit, 4MB memory required Most code sits in ROM Connected Limited Device Configuration Even more limited 512K memory required J2ME Profiles Support sets of similar devices Mobile Information Device Profile Touch screen or keypad, 96x54 or larger display Wireless networking Runs with 32k ram, 8k eeprom, 128k flash Used in PDAs, mobile phones, pagers Optional packages Mobile Media API support multimedia applications Other Embedded Javas Java Card – applet on a smart card Java TV – for set top boxes Java Real Time Embedding is easy Just pare down the language and libraries Real time requirements are more difficult Affect the execution model of the language Nothing in Java spec makes wall-clock guarantees Garbage collection pauses do not affect the semantics Thread priorities exist but aren’t well defined Compiled Approach Fiji VM Precompile Java to C OS includes the garbage collector Overhead about 30% over straight C code Max time of about 10% long But this is experimental, not a guarantee JSR1: Real Time Java Specification Thread scheduling and dispatch (tasks) Memory management Synchronization and resource sharing Asynchronous event handling Asynchronous transfer of control Asynchronous thread termination Physical memory access Thread Scheduling Basic real-time scheduler is included Priority based and preemptive At least 28 priority level Can define your own schedulers Schedulable Objects RealtimeThread :: uses real time scheduler NoHeapRealtimeThread :: may not allocate or reference normal heap Can run in preference to GC GC can be preempted Memory Management Garbage collection is a problem Not that it exists, but that it makes response time unpredictable Why not just interrupt the garbage collector Needs to lock all of memory? Actually needs to lock all of garbage collected memory Hence create memory areas that are separate Memory Management Memory Areas Regions of memory outside of traditional Java heap Don’t have to e garbage collected Scoped Memory Physical memory Specific regions for specific purposes Immortal memory For objects that have a lifetime defined by the scope Never collected Budgeted allocation Limit allocation for a schedulable objet Can be preallocated Synchronization Problems Synchronized data structures Interactions with scheduling Blocking times as part of max response time Wait Queues as a primitive class Dealing with priority problems Priority inheritance supported Priority ceiling emulation supported Wait-free classes for non-blocking shared access Fixed upper bound on entering an unlocked synchronized block Asynchronous Event Handling Bind handlers to internal and external events External events Signals, timers, interrupts (classes to support these) Asynchronous Transfer of Control Can you interrupt or stop a thread in Java? What do Thread.interrupt() and Thread.stop() do? Schedulable objects Can declare throws AsynchronouslyInterruptedException These can be safely interrupted When interrupted, interruptAction() is invoked Can stop a thread through implicit exceptions Homework For next week (10/26) Present you project to the class Plans, progress to date Project model Tasks and model(s) for each task Hand this in Can be part of presentation