About half of my programming work has been on or in direct support of hard-realtime applications. These have tended to be data collection-oriented rather than embedded control type systems, but control loops and other closed-loop structures have been involved. My work in non-realtime systems has often involved design and implementation of performance-critical modules in support of larger applications. I have developed interface code (kernel driver or direct interface from applications) for perhaps two dozen devices, including two boards I designed and many for which the documentation was less than spectacular.

Hard-realtime work:

Advanced Design Solutions - Detail circuit design and board layout of a controller for a directional drilling machine. This was a two-board set with three microprocessors and over a hundred field I/O points.

Schlumberger - Developed interface card for proprietary communications interface to offload host processor and eliminate several problems in previous solution.

Schlumberger - Architecture and implementation of highly flexible realtime application to monitor and control tool (electrical/mechanical/hydraulic system) for development testing and depot-level test and calibration purposes. The target was a DOS machine. I adapted tcl with a character grid subset of Tk to allow rapid reconfiguration of the screen and many of the control loops. Fundamental cycle time was 50ms, with some auxillary inputs sampled at 10ms.

Schlumberger - For the test stand application, developed interface code for Analogic DAS-8, my custom board as well as the previous (buggy) interface card, power controller and the tool's own resources (motors, valves, sensors).

Schlumberger - Architecture and implementation of surface system for cased-hole truck ("Blue Streak" or "SWPT"). 14-slot industrial 486 chassis crammed with off-the-shelf and custom cards. Venturecom's Venix "realtime" sysV. Heavy data collection, 10ms fundamental cycle time, <2ms jitter. Some control functions, mostly safety logic; the sytem fires explosives and does other irreversible things. See photos.

Schlumberger - Converted user interface to X. Implemented custom widget set to interface directly with RT app's internal data and control structures. Performance improved markedly over kernel terminal emultion and curses, believe it or not.

Schlumberger - Device driver, data analysis, and rendering code for "sonic logging" (SLTJ) tool. Off-the-shelf DSP card acquired ultrasound waveforms, but customer did not permit other use of the DSP resource, so the DSP had to be done on the host processor. Project required putting the plotter (continuous-form thermal bitmap printer) in bitmap mode, which in turn required development of pen-plotter emulation code. The plotter's interface was almost-but-not-quite centronics compatible, and required microsecond-level control timing, which required assembly code. Here is a promotional page on a newer version of this service.

Schlumberger - Suite of code to support multi-threaded programming on uniprocessor Unix system. Added storage class modifier "shared" to GNU C compiler. Wrote internal-use paper surveying IPC mechanisms and characterizing the correctness requirements of a sufficient set. Developed semaphore, RPC, and a continuous-sample data channel mechanism based on shared objects, sysV IPC constructs, and Venturecom extensions. This suite allowed very sophisticated, high-performance multi-threaded code to be maintained by staff trained in physics and petroleum engineering. (Note - the Venix system had no native thread support.)

Powell Process Systems - Company was developing a distributed process control system product line based on a proprietary family of 68302-based single-board computers. The target OS was a RTE from some local company. I wrote a driver for the Fujitsu ethernet chip and a learning bridge implementation (token-bus ("MAP") to ethernet). Contributed to the bring-up debugging of several of their boards in the process.

University of Texas Health Science Center - Designed and implemented realtime application of DOS system to acquire, analyze, display, and store data from brain-probe experiments. External hardware provided event detection with microsecond resolution timestamps. My program was required to provide very high reliability storage and visual indications that would permit detection and correction of problems in the course (several hours) of an experiment. I was priveleged to work with Dr. Chiyeko Tsuchitani.

DSP Work:

I finished my EE degree late enough (1991) to have an adequate treatment of both discrete-time signal theory and DSP system architecture in my coursework.

At Shell my users were doing non-realtime analysis of seismic data. My work there was peripheral to the DSP code -- capacity planning, bulk I/O performance, and GUI porting.

At UT Health Science Center the signals in question were time-series of discrete events, superficially similar to radiation signals but with a radically different underlying process. My code acquired time-stamped events from the detection hardware and did soft-realtime statistical analysis. A lot of work went into making the display histograms simultaneously ergonomic and rigorously meaningful.

At Schlumberger I was responsible for two systems which included hard-realtime DSP. The second system was relatively simple; we only needed to keep track of 60 cycle power and some pressures.

My first system at Schlumberger represents the majority of my DSP work, with hard-realtime acoustic, outboard DSP hardware, and soft-realtime image processing. Quoting from my resume:

Responsible for multifaceted project to integrate sonic logging into client's Unix-based system. Client had already selected DSP hardware; I wrote the necessary kernel and supervisory application drivers to support the sonic tool. It was also necessary to find substantial performance optimization opportunities to free up the main processor time necessary to support the sonic data stream. A substantial portion of the speedup revolved around the thermal chart recorder driver interface, which required very aggressive assembly-level work because the hardware could not be changed. Studied several dithering algorithms for presentation of the sonic data on the strip chart, finally settling on a continuous-strip adaptation of simulated annealing. Schlumberger, 1990-91. Developed a mathematically sound treatment of the DSP aspects of modern wireline operations, and wrote a suite of parameterized FIR and FMH (FIR-Median Hybrid) filters based on that treatment. Because the tool speed is not constant, and because the SNR for many tools is speed sensitive, substantial adaptability was required. Drew from work on multirate DSP, in particular the treatment of incommensurate clocks, and developed a theory of nuclear sensor signal processing analogous to normal signal processing but based on Poisson rather than Gaussian distributions. Schlumberger, 1990-91. Conducted a study of techniques for analyzing radioactive tracer (Krypton gas) data in steam-injection wells. Demonstrated that substantially less tracer can be used when deconvolution is used to improve processing gain, improving the economy and safety of the field operation. Constructed a time-domain dual of Nyquist's limit and an interpretation of the steam injection well environment as a long-delay linear system. Developed a practical user interface to facilitate data analysis using this technique. Schlumberger, 1990.

More fundamentally, the infrastructure I designed for the logging application is essentially a DSP operating system. It supports modular application of filters to sample streams, conversion of time bases, and multirate sampling from a variety of devices. I never had the opportunity of implementing another application using that infrastructure, but the logging application coped quite well with the variety of modes and roles to which it was adapted over time.

Some examples of non-realtime high-performance work:

WorldCom - 80% speedup of C++ data processing application, achieved by communicating profiling results and code structuring guidance to the (more junior) programmers on the development team.

South Coast - Reworked BSDi's ip_cksum.c, boosting TCP throughput by 20+%. With my AM79c960 driver I was the first to achieve 1MB/sec sustained through 486 BSDi router.

South Coast - Tuning and bug fixes to BSDi kernel and Apache web server supporting 200+ sites and 10+ hits per second on single Pentium server.

Software Express - Database engine - optimized file I/O and searching code.

Software Express - Function language interpreter with dynamic data conversion caching.

Software Express - External sorting algorithm capable of exploiting partial pre-sort of data in forward or reverse order.

Software Express - Application-managed object caching virtual storage subsystem, needed to overcome limited-address space systems then common in the commercial Unix market (mid-eighties).

TRAQ Technologies - micro-optimization of Kermit protocol to eliminate inter-packet dead time.


Advanced Micro Devices - Developed low-level diagnostics for K7 (Athlon) processor. Projects included C/Assembly DOS-launched program to exercise all exception (interrupt) processing modes and the first program to run on a real dual-processor configuration, an assembly-language ROM-based diagnostic.

Independent Project - Designed a 4-port serial card for attaching multiple high speed modems to ISA-bus Unix machines. At the time, there was a wide gap in the market for such cards and I had some success selling them, worldwide, over the Internet. I used my cards in 12-slot industrial PCs to build my access routers when I entered the Internet business in 1991. With my card and my device driver, my routers were able to communicate with up to 24 high-speed modems at an interface speed of 115,200 bps in 1994 at a cost of less than $200 per port.