[HN Gopher] Running Julia bare-metal on an Arduino
       ___________________________________________________________________
        
       Running Julia bare-metal on an Arduino
        
       Author : cbkeller
       Score  : 136 points
       Date   : 2022-05-23 17:17 UTC (5 hours ago)
        
 (HTM) web link (seelengrab.github.io)
 (TXT) w3m dump (seelengrab.github.io)
        
       | londons_explore wrote:
       | The default arduino toolchain, which is a g++ wrapper, supports
       | C++, even though the whole system only has only 1 kilobyte of
       | RAM.
       | 
       | The C++ 'new' operator does seem to be supported, so I assume it
       | has some kind of heap allocator - although I imagine that when
       | you've only got 1 kilobyte to play with it gets quickly eaten by
       | the allocators datastructures and C++ vtable pointers, not to
       | mention the impact of fragmentation if you allocate any objects
       | more than a few tens of bytes.
        
         | Sukera wrote:
         | I'm not as familiar with how C++ does allocations compared to
         | julia, but I'd imagine the limitations would be similar - if
         | `new` can allocate memory on the stack, I can't imagine why it
         | wouldn't work out of the box.
         | 
         | C++ really isn't my forte though.
        
           | pjmlp wrote:
           | With placement new you can allocate wherever you want, as the
           | memory region is one of the parameters.
           | 
           | You can also overload it, so that it can be given as implicit
           | parameter.
           | 
           | Modern C++ compilers are also able to do escape analysis and
           | remove new altogether,
           | 
           | https://godbolt.org/z/f9vnxG88K
           | 
           | If you try AVR instead of X64, the optimization will be
           | missing, which is only a side effect of the backend not
           | having as much attention in what it looks into.
        
             | londons_explore wrote:
             | If you comment out the delete[] line, it returns the same
             | output. Does that mean leaking memory is undefined
             | behaviour?
        
               | pjmlp wrote:
               | Leaking memory is always undefined behaviour regardless
               | of the language when talking about manual memory
               | management.
               | 
               | What guarantees can you assure about the state of the
               | application?
               | 
               | In any case, in this specific example for x64 it doesn't
               | matter, because new gets optimized away.
               | 
               | However, if that optimization isn't done, e.g. AVR
               | backend, then nasal daemons will be summoned.
        
         | pjmlp wrote:
         | With placement new you don't need an heap, and using C++
         | doesn't require to use classes, there is still so much
         | improvements over bare bones C.
         | 
         | In any case, when all we have is 1 KB, the real answer is
         | Assembly.
        
       | Teknoman117 wrote:
       | LLVM is one of those truly awesome projects. LLVM gets a new
       | backend and then for the most part many of the languages are able
       | to generate code for it.
       | 
       | Want to see Rust on that new m68k backend or 6502 backend mostly
       | out of morbid curiosity.
        
         | pjmlp wrote:
         | While great, it is following the path others have trailed
         | before.
         | 
         | https://en.wikipedia.org/wiki/Amsterdam_Compiler_Kit
         | 
         | One example among many others.
        
       | wthomp wrote:
       | This is really impressive, and a great write up. I've been
       | following the work on static compiling Julia to x86 libraries
       | from the GPUCompiler.jl folks but I didn't expect to see Julia
       | working on an Arduino any time soon. With some kind of basic GC
       | support (even if just using a bump allocator) it seems like a
       | good fraction of the language could actually be available. Most
       | tight loops hopefully don't allocate so it would mostly just be
       | necessary for creating initial arrays and mutable structs.
        
         | Sukera wrote:
         | Haha, thank you!
         | 
         | Yeah, this was mostly an experiment to see what kinds of
         | problems I run into - I didn't expect this to actually work
         | out! It's still very finicky, relying on LLVM to remove dead
         | runtime calls and so on, but non-allocating stuff with
         | immutables should work, though I haven't actually tested it.
        
       | martinsmit wrote:
       | I use Julia as my main programming language and I learned so much
       | from reading this. I never knew Julia had Base.llvmcall, good to
       | know!
       | 
       | Just goes to show how important it can be to read code in
       | completely different fields than the one you're working in. Some
       | problems are common for others so they've already been solved.
       | Knowing that a solution exists is half the battle.
        
       | wiremine wrote:
       | Off topic but related: I played around with getting Nim running
       | on an Arduino.
       | 
       | 1. I found a critical bug almost immediately, but Andreas fixed
       | it within 24 hours, and was super helpful.
       | 
       | 2. Once the issue was resolved, it was surprisingly straight
       | forward to get it running. I started by wrapping the arduino
       | libs, and quickly shifted to wrapping the AVR libraries directly.
       | 
       | One take away was: Nim (and Julia) are likely really nice
       | languages to run in these sort of low-level environments.
       | 
       | Another take away: there's an opportunity to develop a low-level
       | C-based library to better support efforts like this. Both AVR and
       | Arduino libraries weren't designed to be wrapped in something
       | like Nim. And the Arduino codebase could use a healthy
       | refactoring.
        
         | j-james wrote:
         | Nim also has some pretty good ESP32 bindings:
         | https://github.com/elcritch/nesper
        
         | hahaitsfunny wrote:
         | > And the Arduino codebase could use a healthy refactoring.
         | 
         | So could Nim's stdlib and compiler backend, but the leaders
         | have no intention of doing that, and never have, which is why
         | there is a hard fork.
        
         | amkkma wrote:
         | Cool! How big were the emitted nim binaries?
        
           | wiremine wrote:
           | Not to bad! I don't have a detailed analysis, but they were
           | small. Maybe a few extra K over straight C code.
        
       | alhirzel wrote:
       | This is very promising for embedded control applications.
       | Bootstrapping this with a simple allocator and even something as
       | basic as FreeRTOS [1] combined with CBinding.jl [2] for
       | portability would be game-changing for many applications, and
       | directly compete with e.g. MathWorks' Arduino Simulink target
       | [3]. ESP8266/32 next, once LLVM support [4] lands?
       | 
       | [1]: https://microcontrollerslab.com/use-freertos-arduino/
       | 
       | [2]: https://github.com/analytech-solutions/CBinding.jl
       | 
       | [3]: https://www.mathworks.com/help/supportpkg/arduino/run-on-
       | tar...
       | 
       | [4]: https://github.com/espressif/llvm-project
        
         | Sukera wrote:
         | I didn't know about FreeRTOS, interesting!
         | 
         | I don't think CBinding.jl is an option, since the whole point
         | of the arduino is that the julia runtime can't run there (and
         | doesn't fit in the first place - there's not enough RAM and
         | swapping to the SD seems bad). Linking with C created .o files
         | should work though?
         | 
         | I don't own any ESP32, but if that happens, yes I'd very much
         | like to try!
        
           | alhirzel wrote:
           | Would you accept an ESP32 for your edification? No strings
           | attached. Email me
           | 
           | I think CBinding.jl could be helpful if one wanted to write a
           | target-specific shim library in C and link against it. I
           | would expect that some of the glue is going to be easier to
           | write in C than in Julia, and you can play some tricks with
           | macros to create bare modules [1] within some kind of
           | `@arduino_setup`/`@arduino_loop`-style blocks.
           | 
           | Edit: By the way, those target-specific shims might already
           | exist as part of the Arduino IDE. PlatformIO [2] is also
           | another possible collider of these types of platform-specific
           | glues.
           | 
           | [1]:
           | https://docs.julialang.org/en/v1/manual/modules/#Default-
           | top...
           | 
           | [2]: https://docs.platformio.org/en/latest/boards/index.html
        
             | Sukera wrote:
             | That'd be awesome, sure! I'll shoot you an email.
             | 
             | PlatformIO is nice, yes - I've already been suggested
             | linking/using that, but I haven't looked into it yet. I
             | also haven't worked with that before, so it'd be completely
             | new territory for me.
        
               | kurosknight wrote:
               | Hey! Would you be interested in collaborating on this? I
               | have a wide selection of hardware I'd be happy to
               | contribute as well. You can reach me at my username at
               | gmail dot com.
        
             | Sukera wrote:
             | Took a while, but email is sent - thanks again, and I hope
             | shipping will work itself out!
        
       ___________________________________________________________________
       (page generated 2022-05-23 23:00 UTC)