Overview

To make the most of card10’s dual-core processor, its firmware will have been divided into two parts: The “main” firmware running on core 0 which will have been called Epicardium and the “user-code” running on core 1. In most cases this will have been Pycardium, our MicroPython port.

_images/overview.svg

Epicardium

Epicardium is based on FreeRTOS. There are a number of tasks that will have been keeping card10 running. These are:

Name

ID Global

Priority

Description

vPmicTask

pmic_task_id (static)

+4

Power Management (and Reset Button)

vLifecycleTask

lifecycle_task (static)

+3

Control of the payload running on core 1.

vBleTask

ble_task_id (static)

+3

Bluetooth Low Energy Stack

vSerialTask

serial_task_id

+3

Serial Output via UART/CDC-ACM/BLE

vApiDispatcher

dispatcher_task_id

+2

Epicardium API dispatcher

vInterruptsTask

interrupts_task (static)

+2

Interrupt dispatcher worker

vMAX30001Task

max30001_task_id (static)

+1

MAX30001 ECG driver

vBhi160Task

bhi160_task_id (static)

+1

BHI160 sensor fusion driver

Epicardium API

Epicardium exposes lots of functionality via the Epicardium API. The technical details of this API can be found in this overview. If you are interested in adding new API calls, you should probably read the Epicardium API Development guide.

Pycardium

Pycardium is our MicroPython fork. Its purpose is to make it as easy as possible to interact with card10. If you are interested in working on Pycardium, take a look at the Pycardium Module Development guide.

l0dables

Next to Pycardium, other bare-metal code can also run on core 1. For example, a Rustcardium or C-cardium. These l0dables must be compiled using our special linker script and should link against the api-caller library so they can interface with the Epicardium API.

Note: this feature is disabled by default and has to be enabled in card10.cfg. A card10.cfg file dropped into the USB File Transfer of the badge containing execute_elf = true is enough.

l0dables are currently built within the source tree of the main repository. See l0dables/blinky for an example of a hello-world-like program. Within those programs, you can access the Epicardium API to control the hardware and behaviour of the badge.

Once you have a built ELF file, you can drop it into the FAT filesystem of the flash (eg. via USB File Transfer) and it will be available from the menu program of the badge.

Program Flow Diagram

The following diagram is a rough overview of the program flow in this fimware:

_images/firmware-flow.svg