blob: c3145aebf2ed28d15e6bcc2809bc207d6c595adc [file] [log] [blame] [view]
Overview
======
Note: This describes the layout of the Tock 2.0 `libtock-rs` crates, not the
Tock 1.0 crates. Not all of the Tock 2.0 crates have been merged into this
repository yet.
This document gives an overview of the crates in this repository, and is
intended to be useful to `libtock-rs` newcomers.
## `libtock`
Note: `libtock` is currently called `libtock2`, as `libtock` is already a Tock
1.0 crate.
`libtock` provides the default `libtock-rs` experience. It re-exports all of the
drivers `libtock-rs` provides, and provides usable defaults for panic handling
and memory allocation. It should be easy to build a Tock application that only
has one direct dependency: `libtock`.
In order to be easy to use, `libtock` has a hard dependency on
`libtock_runtime`, and therefore cannot be used in a unit test environment. If
you want to unit test code that uses `libtock-rs`, you should depend on the
individual libraries rather than `libtock`.
## Naming convention note
Although these crates have yet to be uploaded to crates.io, they likely will be
uploaded in the future. Therefore, to avoid name collisions, most crates in this
repository have a name that begins with `libtock`. Crates that are only intended
for internal use (e.g. `syscall_tests`, which tests code internal to
`libtock_platform`) do not have the `libtock_` prefix.
The directory names of `libtock_` crates do not contain the `libtock_` prefix.
## Core abstractions: `libtock_platform`
In order to unit test `libtock-rs` code, we need a way to run `libtock-rs` on
our development machines (and in CI). Ironically, that means most crates in
`libtock-rs` are platform independent. `libtock_platform` provides the tools
that allow code to run in both a unit test environment and in real Tock apps. It
consists primarily of the `Syscalls` trait and supporting machinery.
## Syscall implementations: `libtock_runtime` and `libtock_unittest`
In order to run `libtock-rs` code, you need a `libtock_platform::Syscalls`
implementation. Multiple implementations exist that work in different
environments:
* `libtock_runtime` provides a syscall interface that uses a real Tock kernel.
This is the crate to use in Tock process binaries.
* `libtock_unittest` provides a fake kernel for use in unit tests.
In addition, `libtock_runtime` provides the linker script and Rust runtime
needed to start a Tock process binary. `libtock_unittest` relies on `std` to
provide a runtime.
## Panic handler crates
Each Rust binary must have exactly one panic handler (note that `std` provides a
panic handler for binaries that depend on it). The following crates provide a
`#[panic_handler]` implementation for Tock process binaries:
* `libtock_panic_debug` provides useful diagnostics in the event of a panic, at
the expense of code size. This is the panic handler used by `libtock`.
## Driver crates
Driver crates provide interfaces to specific Tock APIs:
| Crate | Tock API |
|-------------------------|-----------------|
|`libtock_console` |[Console] |
|`libtock_low_level_debug`|[Low-Level Debug]|
[Console]: https://github.com/tock/tock/blob/master/doc/syscalls/00001_console.md
[Low-Level Debug]: https://github.com/tock/tock/blob/master/doc/syscalls/00008_low_level_debug.md