[HN Gopher] Lua-RTOS: a real-time operating system for ESP32
       ___________________________________________________________________
        
       Lua-RTOS: a real-time operating system for ESP32
        
       Author : lnyan
       Score  : 153 points
       Date   : 2021-06-09 10:38 UTC (12 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | mijoharas wrote:
       | This looks like a cool project but there's something I'm confused
       | about.
       | 
       | Is the goal of this project to allow people to run realtime
       | software? if so, isn't using lua a problem because of it's memory
       | management causing GC stalls?
       | 
       | It doesn't appear to be addressed in the README of the github.
       | One other explanation is that I'm missing the point, and it's
       | just using RTOS as a small embeddable OS on which to run lua, is
       | that the case?
        
         | m00x wrote:
         | GC stalls aren't as bad on a low memory chip since there's much
         | less memory to clean up.
        
         | bob1029 wrote:
         | I do soft real-time in .NET5 without any problems.
         | 
         | I find that if I completely abduct a high-priority thread and
         | never yield back to the OS, things on the critical execution
         | path run incredibly smoothly. I am able to execute a custom
         | high precision timer in one of these loops while experiencing
         | less than a microsecond of jitter. Granted, it will light up an
         | entire core to 100% the whole time the app is running. But, in
         | today's world of 256+ core 1U servers, I think this is a
         | fantastic price to pay for the performance you get as a result.
         | Not yielding keeps your cache very toasty.
         | 
         | Avoiding any allocation is also super important. In .NET,
         | anything touching gen2 or LOH is death sentence. You probably
         | don't even want stuff making it into gen1. Structs and streams
         | are your friends for this adventure.
        
         | snarfy wrote:
         | All the real time guarantees would only ever happen in the
         | libraries you are calling out to, not in the scripting
         | language. That's just glue code. If the scripting language has
         | the equivalent of eval() there is no way it can be made real
         | time anyway.
        
         | admax88q wrote:
         | I can't speak for this projevt specifically, but you can do GC
         | in a real time system. IBMs metronome garbage collector is a
         | real time garbage collector.
        
         | pjmlp wrote:
         | Lua is definitly not the best option, but GC isn't an issue
         | when a real time aware implementation is used.
         | 
         | https://www.ptc.com/en/products/developer-tools/perc
         | 
         | https://www.aicas.com/wp
         | 
         | https://www.microej.com/product/vee/
        
           | gnzoidberg wrote:
           | I don't think this is true. No current GC tech is fully hard
           | real time. (I am happy to be corrected, as it'd make my life
           | way easier)
        
             | nix23 wrote:
             | Not hard real time, but with a fixed, short bound:
             | 
             | https://researcher.watson.ibm.com/researcher/view_page.php?
             | i...
        
               | dTal wrote:
               | That's the definition of hard real time, if I'm not
               | mistaken. Is there an even stricter guarantee than than
               | that?
        
               | nix23 wrote:
               | True, above that would be "live".
        
             | pjmlp wrote:
             | Real time enough to control weapons in war scenarios.
             | 
             | https://www.ptc.com/en/blogs/plm/ptc-perc-virtual-machine-
             | te...
             | 
             | https://www.militaryaerospace.com/defense-
             | executive/article/...
             | 
             | https://www.aicas.com/wp/products-services/jamaicavm/
        
               | galangalalgol wrote:
               | Those examples were naval ships. When you can float a
               | huge data center in water and dump all the waste heat you
               | want, it doesn't matter that the Perc vm used is 2.5x as
               | slow as the sun vm. Or that it uses even more ram than a
               | normal java vm which is already a lot. This is running on
               | a microcontroller.
        
               | pjmlp wrote:
               | Moving goal posts?
               | 
               | I thought we were talking about real time GC, besides
               | only the first example is a naval ship.
        
               | galangalalgol wrote:
               | Both fair points. Hard real-time is absolutely doable
               | with GC if it is deterministic. It has throughput and
               | memory penalties to get low and predictable latencies but
               | it is regularly done. I have written soft real time java
               | myself. And other than avoiding garbage like you would do
               | with any low latency code with GC, it was idiomatic. But
               | that one change does increase cognitive burden to the
               | point I didnt find it any more productive than C++. If I
               | had needed reflection I might have felt differently.
        
               | kaba0 wrote:
               | > It has throughput and memory penalties to get low and
               | predictable latencies
               | 
               | Hard realtime C++ does as well.
        
               | jaywalk wrote:
               | How does any of that matter? The parent comment provided
               | examples of GC being used in hard real-time when the
               | claim was that it couldn't be done.
        
         | ludamad wrote:
         | You _could_ disable the Lua GC and mostly manage C buffers with
         | Lua functions. There 's some precedent given that Lua has been
         | used a lot in embedding
        
           | mijoharas wrote:
           | can you disable the GC? in my last role we had a large C++
           | application that had embedded lua. I didn't touch it much,
           | but I would have thought that while most of the stuff it did
           | was calling out to our C++ api, the "lua objects" and tables
           | e.t.c. would still be created and need to be garbage
           | collected as normal.
           | 
           | Can you entirely turn off lua's GC?
        
             | wahern wrote:
             | Yes:                 collectgarbage("stop")
             | 
             | See https://www.lua.org/manual/5.4/manual.html#pdf-
             | collectgarbag...
             | 
             | For such a dynamic language Lua is quite good about
             | avoiding hidden dynamic allocation. Creating a new closure
             | (or plain Lua function), coroutine, string, or table will,
             | of course, allocate a new object. But all of those are
             | either explicit or fairly obvious. Lua's iterator construct
             | is careful to avoid dynamic allocation--I believe it's one
             | reason why iterators take two explicit state arguments. And
             | Lua has a special type for C functions (as opposed to Lua
             | functions), allowing you to push, pass, and call C
             | functions without dynamic allocation. Likewise for
             | lightuserdata (just a void pointer), and of course numbers
             | (floats and integers) and booleans--no dynamic allocation.
             | 
             | Nested function calls could result in a (Lua VM) stack
             | reallocation. But Lua guarantees tail call optimization.
             | And the default stack size is a compile-time constant.
             | 
             | Finally, Lua is very rigorous about catching allocation
             | failure while maintaining consistent state. Well-written
             | applications can execute data processing code from behind a
             | protected call or coroutines resume (which is implicitly
             | protected) and still keep chugging along in the event of
             | allocation failure anywhere in the VM. The core of the
             | application, such as the event loop and critical event
             | handlers, can be written to avoid dynamic allocation after
             | initialization.
        
           | gnzoidberg wrote:
           | Embedded != real time
        
         | mmoskal wrote:
         | If your heap is on the order of 100kB the GC stalls may not be
         | so bad. A bigger problem may be pulling your code from external
         | SPI flash - typically you will need to put all your real time
         | code in RAM and you have only so much of it.
        
         | hikarudo wrote:
         | > isn't using lua a problem because of it's memory management
         | causing GC stalls?
         | 
         | Perhaps even more important is the increased memory use due to
         | Lua. Some devices have very little memory to begin with.
        
         | caseymarquis wrote:
         | I think anything truly real time would be interrupt driven and
         | use C/assembly. This would act as the glue between that
         | critical code. I don't feel like we've hit peak embedded
         | development yet. I love the idea of rapid embedded development
         | that deploys scripts over a network or RS232, but most
         | scripting languages aren't great for this. I would like to see
         | a statically typed actor system with no GC or optional per
         | actor GC that is pre-allocated and can only cause a single
         | actor to fail in a predictable way.
        
           | cinntaile wrote:
           | There are languages invented for this purpose, such as Ada.
           | I'd look at that instead of C when you're doing real time
           | systems. Although there are many different kinds of real time
           | systems so it depends on the goal. Soft real time systems
           | aren't as time critical as hard real time systems so the way
           | you program and reason about them is a bit different.
        
           | bluGill wrote:
           | How real time do you need to be? some real time is you need
           | to react within milliseconds or bad things happen, humans
           | will notice if there is 10ms lag in real time audio. Some
           | real time is you need to react within seconds. A machine
           | might need several tens of seconds to get up to speed, so
           | controlling the motor only needs to update a once a second or
           | so for the speed to remain within tolerance. And everything
           | in between.
           | 
           | Depending on where you are on the need for control different
           | technologies can work for you.
        
             | detinho wrote:
             | I'm probably wrong, but isn't real time not about how fast
             | you can react but if you can react on a defined time
             | constraint? Or is there a time threshold you can't consider
             | real time any more like 1 day? Edit: just like you said,
             | 10ms, 1s, etc.
        
               | tdeck wrote:
               | You're correct, the definition requires that operations
               | be bounded, not necessarily "fast".
        
               | fullstop wrote:
               | Maximum tick time for RTOS are usually measured in tenths
               | of seconds. The range is typically from microseconds to
               | about 100ms.
               | 
               | edit: updated to reflect that I meant "upper bound"
               | 
               | edit2: completely reworded to be more clear.
        
               | monocasa wrote:
               | Time constraints on an RTOS are what you need them to be
               | for the domain.
               | 
               | On the RTOS I was the lead for, some constraints were
               | measured in 100s of ns.
               | 
               | Edit to address the edit: our upper bound in that case
               | was single digit microseconds.
        
               | fullstop wrote:
               | My point was that once you pass the 100ms mark most would
               | not consider it "real-time".
        
               | monocasa wrote:
               | Ah it reads backwards, that you're asserting no one
               | actually deals with constraints tighter than 100 ms.
        
               | fullstop wrote:
               | We're coming from different directions. My upper bound
               | was "after this point it won't be rtos", but I've
               | reworded it entirely to be more clear.
        
               | monocasa wrote:
               | Upper bound is a specific term in real time also
               | unfortunately.
               | 
               | Might I suggest wording such as "upper bound constraints
               | exceeding 100ms aren't typically addressed with real time
               | methods".
        
               | detinho wrote:
               | For what I see from the discution it seems to be more a
               | practical decision to not use real time resources and
               | techniques for much higher times. So 1 day for example
               | would be a waste of development time to try to use real
               | time, you could use alerts and background jobs to fix
               | issues. But when you reach shorter and shorter timeframes
               | and bad things can happen a real time approach starts to
               | make more sense.
               | 
               | Now, some parent comment mentioned RTOS. Maybe for a real
               | time OS there would be a practical hard upper bound. But
               | for real time systems in general this upper bound would
               | be totally domain specific.
        
               | bluGill wrote:
               | The time depends on your problem. The real time is more
               | about bad things happen if you don't respond on time. If
               | you click on a webpage and your browser times out loading
               | it is a real time failure, but the failure isn't bad
               | enough that anyone thinks of browsers as real time
               | because the failure isn't really harmful.
        
         | mastax wrote:
         | "RTOS" has come to mean _a library os for embedded
         | microcontrollers_. A lot of embedded projects don 't care about
         | realtime-ness at all.
        
         | [deleted]
        
         | samatman wrote:
         | Lua's garbage collector can be driven 'manually' quite easily.
         | 
         | That is, one can start it, stop it, run it to completion, run a
         | 'step', tune the size of the step and the aggressiveness of
         | collection, all from within Lua.
         | 
         | It's true that you can't get hard realtime guarantees while
         | using Lua naively, you do have to be aware of what you're
         | doing. If you need to be 'cycle perfect', probably use
         | something else.
         | 
         | But there are an enormous number of applications where what Lua
         | offers is just fine, and there's no reason a Lua program should
         | have GC 'stalls', if that means unexpected and lengthy pauses
         | in execution.
         | 
         | This is a really cool project imho.
        
         | OskarS wrote:
         | I'm curious about this as well. And it's not just GC: just
         | allocating memory is not real-time safe unless you're using
         | something like a bump allocator. Lua seems very much like the
         | wrong language for this.
        
           | fullstop wrote:
           | Lua doesn't need to use malloc directly -- you can replace
           | the memory allocation function with your own implementation
           | which is real-time safe.
        
       | TickleSteve wrote:
       | The Lua interpreter is not a real-time interpreter and cannot
       | give bounded response time.
       | 
       | This is a non-realtime application running on top of a scheduler
       | that is capable of supporting realtime applications.
       | 
       | Just placing an application on top of an RTOS does not make it
       | realtime.
        
       | teleforce wrote:
       | Very interesting project on RTOS and hopefully this can support
       | the new RISC-V based ESP32-C3 MCU [1].
       | 
       | I wonder if the performance can significantly be improved if this
       | is ported to Terra language, a system programming language meta-
       | programmed in Lua [2]. It's going to stable 1.0 version real
       | soon.
       | 
       | [1]https://www.espressif.com/en/news/ESP32_C3
       | 
       | [2]https://terralang.org/
        
       | antattack wrote:
       | The project seems to have started in 2017 but it does not appear
       | to be very popular. Whitecat IDE is still in alpha.
       | 
       | https://ide.whitecatboard.org/
        
         | Renaud wrote:
         | I thought there was something wrong on that page:L I wanted to
         | try the IDE but just got this video filling the page and that
         | single red button: "sign in with your google account".
         | 
         | Why does an IDE for microcontrollers requires a Google Account?
         | Guess I'll never know.
        
       | mastrsushi wrote:
       | A language centric OS isn't a compelling idea to users outside
       | enthusiasts of that language.
        
         | samatman wrote:
         | Most RTOS are 'language centric', it's just that the language
         | is C.
        
       | rainer42 wrote:
       | https://github.com/crmulliner/fluxnode follows the same idea
       | providing a JavaScript runtime for the application development,
       | runs on ESP32 and supports LoRa. Fewer features as this is a
       | hobby project.
        
       ___________________________________________________________________
       (page generated 2021-06-09 23:01 UTC)