Merge #164

164: Split libtock into core and high level library r=Woyten a=torfmaster

# Summary

In order to address https://github.com/tock/libtock-rs/issues/160 we decided to do a first draft of splitting the library into parts. 

The idea is that there are two layers:
 * libtock-core
 * libtock-rs

(names tbd). Libtock-core contains the panic handler, the entry point, the allocator and the syscall interfaces. libtock-rs uses libtock-core and the interface stays as usual.

# Possible Extensions

We deleted the "blink" code from the panic handler. This saves more than 1kbytes in the text segment. If this feature is still wanted we could implement the following:

 * provide a feature in libtock-core to opt-out  the panic handler in libtock-core
 * provide a feature for libtock-rs to opt-out the panic handler in libtock-core and using a blinking panic handler. 

In the long run the (default) panic handler could exit the app and send debug information to the kernel which could print it for example. This could be implemented once the kernel functionality is in place.

# Open questions

The current implementation of the panic handler more or less silently fails if there is a panic. Panics can be identified by enabling the "trace_syscall" option in the kernel. How should this be tackled?
Should there be a default panic handling or should it be customizable and if yes how should it be customized?

Co-authored-by: Woyten <woyten.tielesch@online.de>
Co-authored-by: torfmaster <briefe@kebes.de>
tree: fdfad690a9031c806cedb9540e2d96ce8416244c
  1. .cargo/
  2. .vscode/
  3. async-support/
  4. boards/
  5. codegen/
  6. core/
  7. examples/
  8. examples-features/
  9. src/
  10. tools/
  11. .gitignore
  12. .travis.yml
  13. bors.toml
  14. build.rs
  15. Cargo.toml
  16. CHANGELOG.md
  17. CONTRIBUTING.md
  18. layout_generic.ld
  19. LICENSE-APACHE
  20. LICENSE-MIT
  21. Makefile
  22. README.md
  23. rust-toolchain
  24. rustfmt.toml
README.md

Build Status

libtock-rs

Rust userland library for Tock (WIP)

Tested with tock Release 1.4.1.

The library works in principle on most boards, but there is currently the showstopper bug #28 that prevents the generation of relocatable code. This means that all applications must be installed at the flash address they are compiled with, which usually means that they must be compiled especially for your board and that there can only be one application written in rust at a time and it must be installed as the first application on the board, unless you want to play games with linker scripts. There are some boards/layout_*.ld files provided that allow to run the examples on common boards. Due to MPU region alignment issues they may not work for applications that use a lot of RAM, in that case you may have to change the SRAM start address to fit your application.

Getting Started

This project is nascent and still under heavy development, but first steps:

  1. Ensure you have rustup installed.

  2. Clone the repository:

    git clone https://github.com/tock/libtock-rs
    cd libtock-rs
    
  3. Install the dependencies:

    make setup
    
  4. Use make to compile and run an example app.

    make nrf52 # Builds all examples for the nrf52 platform
    
    make opentitan # Builds all examples for the OpenTitan platform
    
    make opentitan FEATURES=alloc # Builds all examples for the OpenTitan platform, with alloc feature enabled
    

    For an unknown platform, you may have to create your own memory layout definition. Place the layout definition file at boards/layout_<platform>.ld and do not forget to enhance the tockloader_flags dispatching section in tools/flash.sh. You are welcome to create a PR, s.t. the number of supported platforms grows.

Using libtock-rs

The easiest way to start using libtock-rs is adding an example to the examples folder. The boiler plate code you would write is

#![no_std]

use libtock::result::TockResult;

#[libtock::main]
async fn main() -> TockResult<()> {
  // Your code
}

If you want to use heap based allocation you will have to add

extern crate alloc;

to the preamble and store your example in the examples-alloc folder.

To run on the code on your board you can use

make <platform> [FEATURES=alloc]

The example can also be flashed to the board by running:

make flash-<platform> EXAMPLE=<example>

This script does the following steps for you:

  • cross-compile your program
  • create a TAB (tock application bundle)
  • if you have a J-Link compatible board connected: flash this TAB to your board (using tockloader)

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

The contribution guidelines can be found here: contribution guidelines