Hello Eric,

Please note that the rust-dev list is (for better or worse) abandonned.

You may ask questions on either IRC (
https://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust), the users
forum (https://users.rust-lang.org/) or StackOverflow.

You may also ask on Reddit (https://reddit.com/r/rust), however it's more
used for announcements than questions in general.

Note that all the community links I gave are accessible directly from
http://www.rust-lang.org/

Good luck with your project!


On Sat, May 30, 2015 at 8:49 PM, Eric Stutzenberger <
dynamicstabil...@gmail.com> wrote:

> I'm working on building out a Rust interface to the nRF51x series parts.
> I have a bare metal system working quite well.  The nRF51x has a bluetooth
> stack (called Softdevice).  This stack requires the use of supervisor calls
> to request the stack to perform certain functions.  My plan is to write a C
> library wrapper around these service calls, compile with arm-none-wabi-gcc
> and then link this to my Bare-metal rust system.  A large chunk of the work
> I have done thus far is based off of STM32 example work done by Jorge
> Aparicio (https://github.com/japaric).
>
> Since I have the basics up and running, I am working on trying to get a C
> static library built with arm-none-eabi-gcc and archived with
> arm-none-eabi-ar to properly link in with my Rust code.
>
> I have the following (very basic) .c file:
> uint32_t sum(uint32_t a, uint32_t b)
> {
> return a + b;
> }
>
> I am compiling and linking with the following commands:
>
> arm-none-eabi-gcc -Wall -mcpu=cortex-m0 -mthumb -fPIC --specs=nosys.specs
> -shared test.c -o test.o
>
> arm-none-eabi-ar -rs libtest.a test.o
>
>
> In my rust file:
>
> [link(name="test", kind="static")]
>
> extern {
>
> pub fn sum(a: u32, b: u32) -> u32;
>
> }
>
>
> I then invoke it as a test:
>
> pub fn main() {
>
>         let test_sum = unsafe { sum(2, 3) };
>
> }
>
>
> I am using a Makefile to execute the rust compiler for some specific
> arguments, such as my specific target:
>
> # rustc target
>
> TARGET = thumbv6m-none-eabi
>
>
> # toolchain prefix
>
> TRIPLE = arm-none-eabi
>
>
> APP_DIR = src/app
>
> OUT_DIR = target/$(TARGET)/release
>
>
> DEPS_DIR = $(OUT_DIR)/deps
>
>
> BINS = $(OUT_DIR)/%.hex
>
> HEXS = $(OUT_DIR)/%.hex
>
> ELFS = $(OUT_DIR)/%.elf
>
> OBJECTS = $(OUT_DIR)/intermediate/%.o
>
> SOURCES = $(APP_DIR)/%.rs
>
>
> APPS = $(patsubst $(SOURCES),$(BINS),$(wildcard $(APP_DIR)/*.rs))
>
>
> RUSTC_FLAGS := -C lto -g $(RUSTC_FLAGS)
>
>
> # don't delete my elf files!
>
> .SECONDARY:
>
>
> all: rlibs  $(APPS)
>
>
> clean:
>
> cargo clean
>
>
> # TODO $(APPS) should get recompiled when the `rlibs` change
>
>
> $(OBJECTS): $(SOURCES)
>
> mkdir -p $(dir $@)
>
> rustc \
>
> $(RUSTC_FLAGS) \
>
> --crate-type staticlib \
>
> --emit obj \
>
> --target $(TARGET) \
>
> -L $(DEPS_DIR) \
>
> -L ../sd110_lib \
>
> --verbose \
>
> -o $@ \
>
> -ltest \
>
> $<
>
>
> $(ELFS): $(OBJECTS)
>
> $(TRIPLE)-ld \
>
> --gc-sections \
>
> -T layout.ld \
>
> -o $@ \
>
> $<
>
> #size $@
>
>
> $(BINS): $(ELFS)
>
> $(TRIPLE)-objcopy \
>
> -O ihex \
>
> $< \
>
> $@
>
>
> rlibs:
>
> cargo build --target $(TARGET) --verbose --release
>
>
> The cargo.toml is as follows:
>
> [package]
>
> name = "bmd200eval"
>
> version = "0.1.0"
>
> authors = ["Eric Stutzenberger <eric.stutzenber...@rigado.com>"]
>
>
> [dependencies.nrf51822]
>
> path = "../nrf51822.rs"
>
>
> When I run make, I get the following output:
>
> .
>
> .
>
> .
>
> mkdir -p target/thumbv6m-none-eabi/release/intermediate/
>
> rustc \
>
> -C lto -g  \
>
> --crate-type staticlib \
>
> --emit obj \
>
> --target thumbv6m-none-eabi \
>
> -L target/thumbv6m-none-eabi/release/deps \
>
> -L ../sd110_lib \
>
> --verbose \
>
> -o target/thumbv6m-none-eabi/release/intermediate/blink.o \
>
> -ltest \
>
> src/app/blink.rs
>
> src/app/blink.rs:42:9: 42:17 warning: unused variable: `test_sum`,
> #[warn(unused_variables)] on by default
>
> src/app/blink.rs:42     let test_sum = unsafe { sum(2, 3) };
>
>                             ^~~~~~~~
>
> arm-none-eabi-ld \
>
> --gc-sections \
>
> -T layout.ld \
>
> -o target/thumbv6m-none-eabi/release/blink.elf \
>
> target/thumbv6m-none-eabi/release/intermediate/blink.o
>
> target/thumbv6m-none-eabi/release/intermediate/blink.o: In function
> `blink::main':
>
> git/rust-nrf/bmd200eval.rs/src/app/blink.rs:42: undefined reference to
> `sum'
>
>
> I have found numerous different references to linking Rust with C and
> calling C from Rust but I haven't found a specific answer as to why this
> will not link.  As you can see in the Makefile, I have tried to
> force rustc's hand in finding and linking against the library, but this
> doesn't seem to make a difference.
>
>
> Is there an issue with how I am building a library?
>
> Since rustc is generating a staticlib in this case, is there some
> different method that needs to be used?
>
>
> Note that I am avoiding the Clang compiler for the moment due to the
> following:
>
>
> https://devzone.nordicsemi.com/question/29628/using-clang-and-the-s110-issues-with-supervisor-calls-to-the-softdevice/
>
>
> Essentially, the gist of the above is that Clang is not quite producing
> the correct supervisor assembly code for calling in to the bluetooth stack,
> especially when optimizations are enabled.
>
>
> Cheers,
>
> Eric
>
> _______________________________________________
> Rust-dev mailing list
> Rust-dev@mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev
>
>
_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to