Skip to content

jmacd/supruglue

Repository files navigation

Supruglue

Supruglue is a development environment and operating system for the Texas Instruments Programmable Realtime Unit for industrial communications on the Beaglebone Black. This project consists of:

  • Bazel crosstool definition for using Texas Instruments PRU Code Generation tools and pru-software-support-package
  • Cooperative threading using setjmp/longjump
  • Diagnostic logging over RPMsg, debugging support
  • Test harness using C++ Googletest library
  • Code generation for pin definitions, system events, interrupt definitions, etc.
  • Command-line tool to easily start, stop, and inspect PRU firmware.

Why Supruglue

At first I struggled to learn the Texas Instruments am335x system-on-a-chip. There are a number of gotchas that can easily derail a new developer. Where there are examples, they are mostly out of date, and generally, you really have to want to use these things to achieve success.

In 2021, after nearly twenty years working for Big Tech companies I moved to the Mendocino coast and became the owner/operator of the Caspar, California community water system. With a background in open-source software and specializing in telemetry systems, I'm writing Supruglue as the foundation for an open-source SCADA system.

WORK IN PROGRESS

This repository is under development.

The next steps are:

  • Carveout support: setup regions for bulk data transfer
  • Drivers: i2c, eCAP, PWM, DMA, etc.
  • Multi-PRU coordination.

Sample application goals:

  • Pulse counter repeater: count and repeat pulses between a water meter and dosing pump, connect to online monitoring
  • UI1203 meter reader: read UI1203 protocol, connect to online monitoring.

If you made it this far, you're probably thinking what I'm thinking. Code size is a concern! The current example application has around 4KiB of program text, which is half the available instruction space.

As space becomes tight, more space-optimization will likely be needed.

Quickstart

To build PRU firmware with TI's compiler for PRU-0:

bazel build --config=pru0 ...

To test using a host toolchain:

bazel test --config=host ...

To cross-compile for the Beaglebone ARM:

bazel build --config=arm ...

Examples

Two LEDs

The example will alternatingly flash two LEDs on pins P9_23 and P9_25.

bazel build --config=pru0 //examples/two_leds:example_pru0

The firmware is located in bazel-out/pru-fastbuild/bin/examples/two_leds/example_pru0

To build the Supruglue command-line interface,

bazel build --config=arm //tools/cmd/supructl

The program is located in bazel-bin/tools/cmd/supructl/supructl_/supructl.

Copy both to the Beaglebone Black machine, then:

supructl start --firmware example_pru0

The example starts two threads (one for each LED) in addition to the system init thread, a system logging daemon thread, and a thread busy writing log statements.

Get in touch!

Feel free to file an issue or start a discussion.

Find me working on the OpenTelemetry project, where I am a member of the technical committee, or in the CNCF slack.

About

PRU test kit

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published