I am trying to build mruby for the Atmel SAMD21-based Circuit Playground Express board. I'm compiling libmruby.a with this build_config.rb https://gist.github.com/nuclearsandwich/d18375a375acd703bf1687d97fe57d92 and trying to link it from an external project for now. So none of the include paths in the build_config are being used. When I try to link libmruby.a I get the error below:
"arm-none-eabi-gcc" -o MRUBY_CPX.elf "hal/src/hal_io.o" "samd21a/gcc/gcc/startup_samd21.o" "hal/utils/src/utils_syscalls.o" "hal/src/hal_delay.o" "hpl/pm/hpl_pm.o" "hpl/core/hpl_init.o" "samd21a/gcc/system_samd21.o" "hpl/core/hpl_core_m0plus_base.o" "hal/utils/src/utils_assert.o" "hpl/dmac/hpl_dmac.o" "hpl/sysctrl/hpl_sysctrl.o" "hpl/gclk/hpl_gclk.o" "hal/src/hal_init.o" "main.o" "hal/utils/src/utils_list.o" "examples/driver_examples.o" "driver_init.o" "hal/src/hal_gpio.o" "hal/utils/src/utils_event.o" "hal/src/hal_sleep.o" "atmel_start.o" "hal/src/hal_atomic.o" ../../build/arm-none-eabi-cpx/lib/libmruby.a -Wl,--start-group -lgcc -lc -lm -Wl,--end-group -mthumb \ -Wl,-Map="MRUBY_CPX.map" --specs=nano.specs -Wl,--gc-sections -mcpu=cortex-m0plus \ \ -T"../samd21a/gcc/gcc/samd21g18a_flash.ld" \ -L"../samd21a/gcc/gcc" /usr/lib/gcc/arm-none-eabi/8.1.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(lib_a-writer.o): In function `_write_r': writer.c:(.text._write_r+0x10): undefined reference to `_write' /usr/lib/gcc/arm-none-eabi/8.1.0/../../../../arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(lib_a-readr.o): In function `_read_r': readr.c:(.text._read_r+0x10): undefined reference to `_read' collect2: error: ld returned 1 exit status make: *** [Makefile:167: MRUBY_CPX.elf] Error 1
I'm pretty unfamiliar with embedded toolchains so I'm not sure if these missing references are due to failing to properly disable functionality in mruby I don't need yet or if I have to find these functions to for this platform.
Hi @nuclearsandwich, I recently got a Circuit Playground Express, and an Arduboy, and micro:bit. Trying to get MRuby running on all of them, but haven’t gotten as far as you yet. I did notice that the memory sizes (program and SRAM) on these little microcontrollers is pretty small (Arduboy has a tiny 32K/2.5K ATmega32U4). Might have to use MRuby/c for the smallest of these, which might also be too big for some (~40K interpreter size I think, compared to ~400K for MRuby). For the Circuit Playground, we should be able to squeeze programs into the 2MB of SPI Flash (separate memory from the ATSAMD21 chip) — they were able to get CircuitPython on there, which perhaps has a similar footprint to MRuby. Also, I think we can compile and execute Ruby over the serial interface, rather than having to re-flash the entire thing, and that would be awesome.
Should we open an issue on the MRuby repo to talk generally about microcontroller support?
-Os), and fit it within the ATSAMD21's 256KB flash (not sure what RAM footprint is though). Otherwise if not, on to MRuby/c. As for the SPI flash, the Circuit Playground Express product site says "used primarily with CircuitPython to store code and libraries." Not sure what that means specifically though. A lot to figure out yet. 😞
Not sure what that means specifically though
One of the cool things about circuitpython is that the firmware acts as a USB mass storage device when connected to a computer. The SPI flash is used as a FAT filesystem and you can drop files including your main.py or code.py right there and then once you unplug it the circuitpython firmware just runs your python!
mrb_valuetypes to C types. For example say I know my
mrb_valueis always a string, can I cast it to a
char *to use in standard C functions? I see in the API that there are a bunch of functions to make C types into a corresponding type in the mruby C API but I could find anything to go the other way. Any help is greatly appreciated 🙏
mrb_gc_register()is more correct
mrb_valuecontaining Symbol with different symbols?
mrb_iv_set). When i do
c = MyClass.newand
p ci can see my instance variable so it works. But when i pass this instance to a C function (
my_c_func(c)) where i get it back this way
mrb_get_args("o", &my_mrb_value), it looks like my instance variables are set to 0 (getting those back using
mrb_get_integer(mrb_iv_get(mrb, my_symbol))is this something expected ?