Tom Schouten

Extended CV
PDF
Email
Web


I provide wide spectrum embedded software development services. I specialize in early stage R&D work setting up an initial architecture and implementation.

Skills

Fields of Expertise

  • Embedded Software Development (Linux, bare metal uC, FPGA)
  • Numerical Computing and Digital Signal Processing
  • Test Automation
  • Code Rescue

Programming and Software Design

  • Full cycle software development: domain study, problem analysis, requirements gathering, prototyping, design evolution, testing and debugging, continuous deployment, refactoring in response to requirement changes, and long term maintenance
  • Code rescue: simplify and refactor a "ball of mud" prototype into something that can be evolved over time
  • Object Oriented Design
  • Distributed Systems
  • Functional Programming
  • Protocol Design
  • Domain Specific Languages for modeling, validation and code generation
  • Testing and debugging: strong intuitive feel of how things go wrong, and where to focus effort while testing
  • Web-based user interface development with focus on embedded and real-time
  • Build automation (make, redo) and source control (git, darcs, SVN, CVS)
  • Broad understanding of algorithms and eager to learn new tricks
  • Mapping a problem across the platform stack: FPGA (FSM + CPU design), assembly, C, OS layers, high level languages, code generation from high level models.
  • Multithreading: shared resource & locking, dataflow, scheduling, RTOS implementation, message passing and actor systems.
  • Reverse engineering
  • Code review
  • Development cycle optimization in complex embedded systems: how to improve productivty through immediate edit-compile-run feedback
  • Managing technical debt and "Duct Tape Programming"

Programming languages

  • Active non-trivial use: C, Forth, Lisp/Scheme, Erlang, Rust, Haskell, Bash, SQL, Nix, JavaScript, GNU Make.
  • Past non-trivial use: Lua, C++, OCaml, Java, Objective C, Perl, Python, Matlab, Pure Data, Latex, MyHDL, Assembler for PIC, x86, TMS320C40, ARM, PRU.
  • Explored: Common Lisp, Prolog, Smalltalk, TCL, APL, J, Oz, Fortran, Fortress, Faust, Chuck, SuperCollider, Occam, VHDL, Assembler for AVR, MIPS, PPC, Z80, HC11, TMS320C6x, ...
  • Created: PF, SC, Staapl, DSPM, RAI, Seq, PRU and the minimal Seq control CPU instruction set.

Language / Runtime / Compiler design

  • Lifelong student of programming languages, runtimes and compiler design.
  • Language implementation in C, Forth, Scheme (Racket), JavaScript, Haskell, OCaml.
  • Implementation of minimalistic OS for bare-metal microcontrollers (Staapl on PIC, uc_tools on Cortex M),
  • Virtual Machines for soft real-time Audio/Video systems (PDP,PF,libprim on PC,Android).

Operating systems and environments

  • GNU/Linux, current focus on Debian, Nix, Buildroot and OpenWRT
  • Linux APIs: Linux audio/video APIs, OpenGL, Posix
  • Linux kernel and the Xenomai real-time extension
  • Erlang/OTP, rebar, and cross-language interfaces (ports and ETF)
  • Some experience with Android, OSX, eCos RTOS (ARM), MS Windows
  • The Web platform: server side HTTP, SQL and client side HTML, CSS, JavaScript, WebSockets, framework design.
  • Haskell on Nix (cabal2nix)
  • Rust and Cargo
  • GNU binutils/GCC/GDB toolchain
  • GNU Make, redo, and incremental build + test + deployment system design
  • Soft and hard real-time systems
  • Bare metal microcontrollers and DSPs
  • Low-level bit twiddling
  • Digital logic on FPGA
  • Device driver implementation
  • Virtualization: VmWare, Qemu/KVM, LXC
  • Linux system administration: Apache, MySQL, Asterisk, Exim, OpenVPN, SSH, Borg backup ...

Numerical and Signal Processing

  • Continuous and discrete time signal processing theory, Laplace, Z-transform
  • Linear algebra, FFT, SVD, Wavelets
  • FIR and IIR filter design and implementation
  • Noise reduction, echo canceling
  • Control theory for linear and non-linear systems, Kalman filters
  • Optimization theory, statistics, information theory, communication and digital codes
  • 2D/3D computer graphics,
  • Basics in software-defined radio, classical mechanics, computer vision and generic numerical algorithms
  • Good understanding of audio effects and post-production processing, sound synthesis
  • Fixed point and floating point numerical code implementation
  • Bridge to implementation and testing: abstract interpretation, automatic differentiation, and code generation for C, assembly, Verilog targets.

Electronics

  • Basic familiarity with analog and digital electronics, theory and practice
  • Simple analog and digital circuit design and PCB layout (gEDA suite)
  • Circuit debugging using oscilloscope, logic analyzer and test code
  • FPGA digital logic design using MyHDL, Verilog, and in-house Seq Haskell eDSL

Team Integration

  • I've had the honor of working with an diverse set of people from all over the globe. People with different ideas about how to design software, how to run a team, and how to balance code quality, feature set and delivery time.
  • I care and I finish what I start.
  • Worked in co-located teams, globally distributed teams, loosely knit open source communities and as a solo developer/researcher
  • Wrote user manuals, code documentation, informal articles and scientific papers
  • Gave presentations and played the role of tutor on development teams and in more formal workshops.
  • My mother tongue is Dutch and I speak native-level English with a mixed Flemish / Midwestern accent. I can read and understand spoken French and German for technical content.

Project History

Undisclosed (June 2019 - present)

System design consulting, ATSAMA5 board bringup, Linux network driver debugging, and STM32F103 bare metal firmware design and implementation for a real-time data communication module. This is for an undisclosed Belgian stealth startup.

Humanetics ATD (November 2014 - present)

Software system architecture and implementation and assistance with hardware design for data acquisition systems in a small team. I gained experience with managing the bringup and evolution of the software and digital logic for a complex heterogenous system: FPGA, microcontrollers, application processors, embedded Web server, build and deployment system.

Zwizwa (November 2010 - present)

Solo R&D work. The open source projects are described elsewhere. This interleaves payed contract work.

  • Study: Digital and Analog circuit design, Digital Signal Processing theory, Programming Language theory, exploration of various open source tools.
  • DSL (Domain Specific Language) projects in Haskell (asm_tools, DSPM) and Racket (Staapl, RAI).
  • Development of support libraries for embedded systems: uc_tools, erl_tools
  • Development of exo, an IDE / network OS written in Emacs and Erlang, taylored to heterogenous distributed systems development (Linux, Cortex M, FPGA and many different languages: C, Rust, Erlang, Haskell, SQL, HTML, CSS, JavaScript).

Emweb / Fike (January 2014 - December 2015)

Design and implementation of a production test framework for a real-time industrial monitoring product. Full software responsibility. Host software in Python, test board dsPIC firmware in C. Tasks included debugging test board hardware, making circuit modifications, original analog/digital test circuit design, creating GUI and database.

Beep (July 2013 - November 2013)

Early stage consulting for an MVNO startup. Tasks involved: exploring telco-related technical specifications, developing ISO7816-4 firmware for the Sysmocom SIMtrace AT91SAM7, and building an early application prototype in Python.

Ubidata N.V. (July 2010 - March 2013)

I developed firmware for an application in the field of fleet management and remote data I/O running on AT91SAM7 and PIC16F. I worked on site for 3 months to get a redesign of an early prototype started, and continued remotely after moving to the U.S. I worked as part of a 3-4 people team of experienced embedded developers. The job spanned the full product life cycle, including the maintenance of a remote embedded system.

Zwizwa (April 2010 - July 2010)

  • Development of DSPM, a Haskell eDSL.
  • Reactive dataflow framework for sweb in Racket.
  • Study: classical mechanics and DSP theory

Sony Techsoft Centre Europe (November 2009 - March 2010)

I was hired by Sony's software division in Brussels for a contracting job requiring Linux system programming experience and signal processing skills. The product was a test system for Sony-specific media framework modifications to the Android OS. This work involved coordination with development departments in Belgium, Japan and China.

Zwizwa (March 2009 - October 2009)

  • Continuation of development of Staapl, sweb in Racket.
  • Study of programming language theory and implementation.
  • Development of libprim in C,Scheme.

Triphase N.V. (October 2008 - March 2009)

Triphase is a Belgium-based startup working in the area of rapid prototyping tools for energy conversion systems. I was hired for Linux/Xenomai driver development for EtherCat and CANbus systems. Aside from that I suggested and implemented some changes to their core product, adding configurability to the architecture. I gained experience with embedded PC hardware, Debian, Linux, Xenomai, field busses, and Matlab/Simulink Real-Time Workshop.

Zwizwa (December 2007 - October 2008)

  • Refactoring of the Staapl system based on insights gained from its use in the Waag project, and new insights in the use of Racket as a system for designing domain specific languages.
  • A short consulting project involving PF and a computer vision problem
  • Development of sweb, weblog software with Latex support used in my development logs

Waag Society (October 2007 - December 2007)

Artist-in-residence program at Waag Society in Amsterdam, institute for art, science & technology. This was a collaboration with Metabiosis/GOTO10. The project consisted of building the platform for an art installation, consisting of a collection of glowing orbs, communicating amongst each other using digital data transmitted over sound waves (OOK, PSL). The system used Staapl and PF.

The Packets Project (October 2005 - October 2007)

A two year project aimed at building tools for media artists. I was at that time part of the GOTO10 media art collective. The project was funded by the School of Art, Design and Architecture at the University of Huddersfield. Work included development of Packet Forth (PF), Staapl, CatKit (a Staapl PIC18F dev board), workshops, and technical support for the Metabiosis media art installation, written in PF.

Zwizwa (April 2003 - October 2005)

Start of solo R&D project work, mostly open source libraries:
  • PDP, a video processing extension for Pure Data.
  • Creb, a library of audio processing modules.
  • PF, a prototyping language for video and computer graphics.
  • Staapl (then called Brood), a low-level microcontroller metaprogramming system.
Next to software development, I lead hands-on workshops, and gave invited talks.

Arboretum Systems (October 2001 - March 2003)

Part of a small software development team working on maintaining legacy audio processing software, integrating company IP in third party systems, and developing new audio effects.

SISTA lab, KULeuven (October 1998 - August 2001)

Research assistant in the field of signal processing for musical applications. Topics: Piecewise stationary signal models for audio signal modifications, pitch-synchronous dynamic wave table synthesis, scanned synthesis, subspace based frequency estimation techniques, evaluation of trade-offs involved in FFT window design for additive sinusoidal synthesis, and alias-free synthesis of discontinuous waveforms using discrete state updates to a bank of damped oscillators.

Open Source Projects

This is a chronological list of the projects I've put online, most recent first. The thread that runs through these is the synergy between embedded software, digital signal processing, and development tools focusing mostly on domain specific languages and interactive incremental development.
  • asm_tools Haskell eDSL library including two instrumented macro languages: Seq for sequential logic, and PRU for the AM335x deterministic embedded control processor. It uses a final tagless eDSL representation to implement validation and code generation from the same description. Basically, QuickCheck for machine code and digital logic.
  • uc_tools A collection of C macros for writing malloc-less, static-allocation state machines, and a minimalistic monitor OS based on GDBSTUB.
  • erl_tools Erlang support library for embedded systems applications, with some native C, Rust and JavaScript components.
  • studio An Erlang MIDI studio. It supports incremental development of Audio sythesis and Audio/MIDI processing software.
  • RAI, short for Racket Abstract Interpretation, is a Domain Specific Language (DSL) for analysis and implementation of audio signal processing algorithms. Its main goal is to marry the process of mathematical modeling and the low-level implementation of algorithms.
  • DSPM. Precursor to RAI. This project explores the use of tagless-final embedding of a typed DSL into the Haskell programming language, exploring the idea of typed metaprogramming.
  • SISO. Tagless-final embedding of state space models in Haskell, based on Applicative Functors. Based on ideas behind DSPM and RAI.
  • Staapl is a metaprogramming tool based on Forth and Scheme. It uses the Microchip PIC18 architecture. Staapl contains a tiny 8-bit sound synthesizer running in 2K of Flash which serves as test for the compiler, and a driver for generating PAL TV signals, used in the ForthTV workshop[1] [2].
  • libprim, a library for building small dynamically typed programming languages. Consists of a collection of OS abstractions, basic objects, a simple garbage collector, a Scheme interpreter and a rework of the PF core language and virtual machine.
  • sweb, a Racket-based web application hosting my web logs with support for rendering posts of mathematical nature written in Latex. The design is based on a reactive programming engine.
  • Packet Forth (PF), a stand-alone dynamically typed scripting language taking ideas from Forth and Scheme, aimed at video processing using C-based signal processing code plugins.
  • Creb, an extension for the computer music system Pure Data. Creb adds building blocks for music DSP that were missing in Pure Data, or are the result of my research on audio synthesis techniques.
  • Pure Data Packet (PDP), another extension for Pure Data, which adds building blocks for image and video processing.
  • Pyla real-time protocol analyzer with support for the Saleae Logic. Written in Python combined with C++/Swig for the analyzer modules, and LARS, a Rust port of Pyla.
For a complete list, see the darcs and git sections of the web site, which also hosts the associated notes. Some projects are mirrored on github.

Education

1998-2001

Graduate courses and seminars @ KULeuven, Belgium: optimization theory, statistical learning theory, neural networks, system theory, identification and control, numerical algorithms, computer architecture and advanced signal processing.

1993-1998

Master of Electronics Engineering (Burgerlijk Elektrotechnisch Ingenieur) at the KULeuven, Belgium, with a major in Digital Signal Processing.

1987-2017

Autodidacticism. I acquire most of my skills by following curiosity. This is a short summary of the path I followed.
  • 1987-1989 MSX BASIC, Z80 assembler
  • 1989-1991 MS-DOS, Pascal, DEBUG.COM, 8086 asm & arch
  • 1991-1993 Borland Turbo C/C++ & Debugger, 80386 asm & arch, 2D/3D graphics, sound
  • 1993-1997 Electronic music, hardware synthesizers, analog & digital electronics
  • 1997-1998 Linux: RedHat, Suse, Debian, system administration
  • 1998-2000 C++, Matlab, Perl, wrote an audio synthesizer engine
  • 2000-2002 Pure Data, computer music & signal processing, GCC/GDB, Linux development, wrote creb
  • 2002-2004 Python, emacs, video processing, wrote PDP
  • 2004-2006 Forth, Scheme, language & VM design, wrote PF
  • 2006-2008 OpenWRT and embedded Linux, Microchip PIC asm & arch, ColorForth, compiler design, wrote Staapl, sweb
  • 2008-2010 Scheme (Racket) and programming language theory, wrote libprim
  • 2010-2012 Haskell, type theory, and domain specific language design, wrote DSPM
  • 2012-2013 back to DSP theory, wrote RAI: a language for DSP algorithm design
  • 2013-2014 Python Qt GUI and MySQL, SQLite database, wrote Pyla, Staapl development
  • 2014-2017 Erlang, MyHDL (+ VHDL/Verilog), Analog Electronics, RAI & Staapl tweaks, wrote SISO
  • 2017-2019 Erlang, Rust, Haskell, Buildroot, digital logic, Web technology. Focus on integration and incremental development of heterogeneous distributed systems: Linux boxes + bare-metal microcontroller leaf nodes.


The most recent version of this document can be found here.