New software subteam members should read It contains instructions for setting up a C++ compiler and IDE. If you prefer a different editor, you won't need Eclipse or the JDK. Ignore the Gerrit section for now.

Part 1 of the book mentioned therein covers basic C++ syntax and idioms, but reading more than that is encouraged. The book is designed for independent learning and has drills and exercises we encourage you to attempt. We'll have more specific problem sets assigned soon.

Advanced C++

C++ is a complex language, so there is a lot to learn. CppCon, an annual C++ conference, provides a great view into what is considered modern C++ and how it's used in industry. See the resources and videos linked at for more.


We use wpiformat to ensure our C++ code base conforms to our style guide (a modified Google style guide). It's provided as a Python package that performs various linting tasks as well as automatic fixes for some issues found. It's also used by WPILib for their 200k line code base and speeds up their patch review process. Ideas for improvements, increased style guide coverage, and contributions are welcome and can be submitted to the styleguide GitHub project. (Note: Tyler Veness is the maintainer, so he can be consulted for patch ideas.)

Real-Time Software


CAN and CANopen

CAN bus is the communication network our racecar uses to transfer information between our microcontrollers, the motor controllers, and the battery management system (BMS). First, watch this CAN introduction video. For a more rigorous description, read Texas Instruments provides a description of the physical layer requirements of CAN here.

CAN bus maximum cable length

Our Sevcon motor controllers communicate via the CANopen protocol, which is an extension of CAN bus. See for an introduction to CANopen. Service Data Objects (SDOs) are used carry information in a master-slave model for things like heartbeats between controllers. Process Data Objects (PDOs) carry real-time information like throttle input voltages, steering sensors, and commands.

Teensy Microcontroller and arm-none-eabi-gcc

We use the arm-none-eabi toolchain to compile our software for the Teensy microcontroller. If you use Windows and have installed MSYS2, packages are available here and can be installed via pacman -U filename.tar.xz. On Linux machines, simply install arm-non-eabi-gcc via your distribution's package manager. At least GCC 6.2 is recommended because it provides C++17 language features.

Since the Teensy doesn't use the processor's JTAG pins to program it, their custom USB bootloader will also be needed. Download and install it from Linux users should install Teensyduino via their package manager, as usual.

Those interested in bare-metal compilers may be interested in the following links:

Coming Soon

"Lab" exercises for our microcontrollers will be created as time permits; schoolwork is the limiting factor. We plan to put together material for a lot of other CS topics for those interested in doing projects with high performance software in general (not necessarily resource-constrained embedded stuff).

Useful Links

Professional software developers should adhere to these principles.

Documentation for the motor controllers provided by Zero Motorcycles.

The software for our FSAE racecar resides here.