$$HEADER$$

Perguntas mais Frequentes de eLua

Bem-vindo à FAQ oficial de eLua
Assumimos aqui que você já conhece o básico de eLua e que esta lista de perguntas (e respectivas respostas) poderão ser úteis.


Como posso aprender Lua? É difícil?

Lua é uma linguagem minimalista (e mesmo assim muito poderosa) e muito fácil de se aprender. Uma vêz entendidos os conceitos básicos, você começará a programar em Lua imediatamente. A página de Lua na internet é sua principal fonte de informação. Na página de documentação do site, você vai encontrar o manual de referência e a primeira edição do excelente livro versão "Programando em Lua". Recomendamos que você adquira a segunda edição deste livro, já que você irá encontrar tudo que você realmente precisa aprender de Lua. Outra fonte muito interessante é a wiki Lua. Se você precisar de mais ajuda, consulte a página da comunidade. Lua tem uma comunidade muito amigável e bastante ativa.

Como posso ajudar eLua?

eLua tem muitas metas ambiciosas, por isso seria ótimo ter mais pessoas trabalhando conosco. Dê uma olhada na página roadmap e, se houver interesse em colaborar, não hesite em contactar-nos. Além disso, se você quiser fazer uma doação para o projeto (dinheiro, ou talvez uma placa para desenvolvimento) esteja certo que não iremos recusar :) Seus reports de bugs encontrados em testes de eLua em suas placas e suas idéias sobre recursos legais são tão valiosos quanto. Se assim for, não hesite em nos contactar.

Posso usar eLua no meu projeto comercial de código fechado?

A partir da versão 0.6, eLua é distribuída sob a licença MIT e isto permite que seja usada em projetos comerciais e de código proprietário. Antes disso, foi distribuída sob a GPL, o que restringia seu a aplicações open source. Fique atento entretando, porque eLua atualmente contém algumas (poucas) bibliotecas de terceiros, cada uma com seus próprios termos de licença que podem ser mais restritos que do MIT. Veja a licença eLua para mais detalhes.

eLua é rápida o bastante para minha aplicação?

Isso depende muito de suas expectativas. Se você espera que o seu código em Lua rode tão rápido quanto o seu código C compilado isso não irá acontecer, simplesmente porque C é uma linguagem compilada enquanto a Lua é uma linguagem interpretada. Dito isso, você vai ficar feliz em saber que a Lua é uma das linguagens interpretadas mais rápidas que existem por aí. Se você realmente precisa de muita velocidade e de Lua, você pode (muito facilmente em eLua) escrever as seções críticas em seções de código C e exportá-los como um módulo Lua. Desta forma, você terá o melhor de dois mundos.
Atualmente não temos nenhuma referência oficial sobre a velocidade de Lua em dispositivos embarcados mas você pode dar uma olhada no exemplo TV-B-Gone na página
examplos. TV-B-Gone é uma aplicação de controle remoto escrita em eLua. Se você estiver familiarizado com os protocolos de controle remoto, você vai saber que esse tipo de aplicação é executada em "tempo real" e atrasos na ordem de milisegundos ou até menos podem fazer o seu software de controle remoto falhar. No entanto, este exemplo é executado sem problemas em uma CPU Cortex-M3 50MHz (em modo Thumb2). Este exemplo deve fornecer-lhe uma visão bastante intuitiva sobre a velocidade da eLua.

What are the minimum requirements for eLua?

It's hard to give a precise answer to this. As a general rule for a 32-bit CPU, we recommend at least 256k of Flash (program memory) and at least 64k of RAM. However, this isn't a strict requirement. A stripped down, integer-only version of eLua can definetely fit in 128k of Flash, and depending on your type of application, 32k of RAM might prove just fine. It largely depends on your needs.

Since I'm using the Lua platform modules (uart, spi, pwm, tmr...), can I trust my peripheral code to run the same on all my platforms?

Unfortunately, no. While eLua makes it possible to have a common code on different platforms using the platform interface, it can't possibly provide the same functionality on all platforms, since all MCUs are not created equal. It is very recommended (and many times imperative) to have an understanding of the peripherals on your particular MPU before you start writing your code. This, of course, is not particular to eLua, but it's especially important since the platform interface might give the impression that it offers an uniform functionality over all platforms, when in fact the only thing in common is often just the interface itself (that is, the methods and variables you can access in a given module). eLua tries to help here by giving you an error when you try to access a physical resource that is not available (for example a timer, a PWM channel, or a PIO pin/port), but it doesn't try to cover all the possible platform-related issues, since this would increase the code size and complexity too much. These are some caveats that come to mind (note that these are only a few examples, the complete list is much longer):

The lesson here is clear: understand your platform first!

What's the deal with floating-point Lua and integer only Lua?

Lua is build around a number type. Every number in Lua will have this type. By default, this number type is a double. This means that even if your program only does integer operations, they will still be treated as doubles. On embedded platforms this is a problem, since the floating point operations are generally emulated in software, thus they are very slow. This is why eLua gives you "integer only Lua": a Lua with the default number type changed to long. The advantages are increased speed and smaller code size (since we can force Newlib to "cut" the floating point code from printf/scanf and friends, which has quite a strong impact on the code size) and increased speed. The downside is that you'll loose the ability to do any floating point operations (although a separate module that will partially overcome this limitation will be provided in the future).

All your tutorials give instructions on how to compile eLua under Linux, yet you seem to use a lot of Windows tools. How come?

It's true that we do all the eLua development under Linux, since we find Linux an environment much more suited for development. At the same time it's true that most of the tools that come with my development boards run under Windows. So we choose to use the best of both world: Bogdan runs Linux under a VirtualBox emulator, and does verything else under Windows. Dado does everything on Linux and runs Windows under VMWare. Both options are nice if you master your environment. To make everything even more flexible, Bogdan keeps his VirtualBox Ubuntu image on an external WD passport disk that he can carry with him wherever he goes, so he can work on eLua whenever he has a bit of spare time :)

Will you ever post instructions about how to compile toolchains under Cygwin in Windows?

Bogdan: If I ever have way too much spare time on my hands, yes. Otherwise, no. There are many reasons for this. As I already mentioned, I favour Linux over Windows when it comes to developing applications. Also, I noticed that the GNU based toolchains are noticeable slower on Cygwin than on Linux, so experimenting with them can prove frustrating. Also, compiling under Linux and Cygwin should be quite similar,so try starting from my Linux based tutorials, they might work as well on Cygwin.

I know that Lua can be compiled to bytecode, so I compiled one of the eLua examples with luac and tried to run it on my eLua board, but it didn't work. Is this a bug in eLua?

This is not a bug in eLua, it's a bit more subtle than that. See the cross-compile section for a full discussion about this problem and its fix.

I get "out of memory" errors when I run my Lua programs, what should I do?

There are a number of things you can try to overcome this:

I enabled the LTR patch, but now all my module tables (math, io, string, spi and so on) are read only. Do I have to disable LTR if I want write access to these modules?

You don't really have to disable LTR to get write access to your rotables, you can use some simple Lua "tricks" instead. Let's suppose that you need write access to the math module. With LTR enabled, math is a rotable, so you can't change its keys/values. But you can use metatables to overcome this limitation:

local oldmath = math
math = { __index = oldmath }
setmetatable( math, math )

This way you can use math in "write mode" now (since it is a regular table), but you can still access the keys from the original math rotable. Of course, if you need write access to all your modules (or to most of them) it makes more sense to disable LTR instead, but from our observations this doesn't happen in practice.

$$FOOTER$$