We are pleased to announce that Red/System v0.2.3 is out, extending Red to the mobile world with a complete support for Linux on ARMv5+ processors. The new port supports 100% of Red/System features and passes successfully the 8537 unit tests.
For those of you interested in more details, our ARM port targets the v5 family, with 32-bit instructions (no Thumb support) and optional literals pools (use -l or –literal-pool command-line option when compiling) that implement a global allocation strategy (unlike gcc’s function-local allocations).
New compilation targets have been provided for Linux and derivative OS running on ARM:
Android support is using the same code as Linux-ARM, only differing in libc and dynamic linker names.
Currently, as Red/System only works on command-line in Android, you need a special loader to download the executable and run it. This can be achieved using the NativeExe app. You will need to allow temporary installing apps from non market sources (Settings > Applications > Unknown sources). Also, your local 3G provider might be filtering out executables downloaded this way, you can workaround that by either manually loading the NativeExe-0.2.apk file with adb, or share a wired Internet connection with your mobile device.
You can easily install NativeExe app by just typing the following URL in your Android web browser:
http://gimite.net/archive/NativeExe-0.2.apk
or by scanning this QR-code instead:
Once done, input in the second field: http://sidl.fr/red/hello
and hit [Run].
Here are a few screenshots of HelloWorld tests:
Andreas has also reported that it’s working fine on Nokia N9 devices.
The next steps to enable building full apps on Android and iOS are:
Such approach will allow us to build easily Android or iOS apps without having to write a single line of Java or Objective-C code, while providing the full power of Red. At least, that’s the theory, we’ll see in practice if it’s up to our expectations. Also, cross-compilation should be fully available for Android (producing Android apps from any OS), but code signing and app publishing requirements might make it impossible for iOS and require a MacOS X with Xcode for producing apps (if you know workarounds, let us know).
The PIC support should be doable in a few days, the support for shared library generation might take a bit more time. Anyway, theses tasks will need to be multiplexed with Red runtime & compiler implementation, so don’t expect significant progress before a month.
In the meantime, you are welcome to test the ARM port of Red/System and hack Android and upcoming Raspberry Pi devices using it. ;-)
Cheers!
New Red/System version 0.2.4 is out. The main new feature is floating point numbers support. This feature was not planned, but as users were strongly pushing for having it now, we have added partial support for floats. Users can now wrap and use libraries like OpenGL.
Two new IEEE-754 datatypes were added:
They are first-class datatypes, so they can be used anywhere, as variables, arguments or returned values.
Basic math and comparison operations are supported. Transcendental functions are not predefined yet in the runtime, they need to be imported first from an external library. For equality test, no rounding is applied, so only exact float numbers match will return true
. Adding an “almost-equal” operator is planned, but not available yet.
Also, type casting is allowed between:
Remember to type cast all float32! values to float! when passing them as argument to C variadic functions. For non-variadic C functions, Red/System’s compiler will promote float32! to float! automatically.
Not all of IEEE-754 standard was implemented yet. See the remaining features to add in this todo-list.
At low-level, floating point support is architecture-specific:
cpu-version
), which triggers the use of older opcodes. For example, in order to use floats on older than PentiumPro CPU, you need to add this line in the target definition: cpu-version: 5.0
Several thousands new tests were added to the test suite, pushing the total number of unit tests to 11755. Thanks to Peter for taking care of that.
As IEEE-754 2008 revision introduced several new decimal floating point formats, we plan to support them later in Red/System.
A contributed feature is also part of this new version of Red/System: C-like enumeration support. This contribution was brought by the lead developer of Amanita Design, small independent game developing studio based in Czech Republic, which released the award-winning game Machinarium. A new compilation directive was added to declare enumerations: #enum.
We got noticed by Ruby’s author, Matz, he tweeted about Red! :-)
After a long time having only partial floating point support in Red/System, it comes now to Red with a broader support, thanks to the terrific work from Qtxie and Oldes, who managed to push Red further while I was busy moving from Europe to China (though, this might be the topic for another blog entry, as requested by many of you).
The new float!
datatype implements IEEE-754 64-bit floating point format. It is available with most of the usual math functions support:
add, substract, multiply, divide, power.
cosine, sine, tangent, arcsine, arccosine, arctangent.
log-2, log-10, log-e, exp, square-root, round
Note that these trigonometric functions are taking arguments in degrees, a /radians
refinement is provided for input values in radians. However, this can result in extra verbosity for some long math expressions where using only radians, like:
((sine/radians b) * (cosine/radians c)) + ((cosine/radians b) * (sine/radians c))
Some radians-oriented shortcuts to these functions are also provided for convenience: cos, sin, tan, arcsin, arccos, arctan
. So the above expression becomes:
((sin b) * (cos c)) + ((cos b) * (sin c))
Here are some code examples from Red console:
red>> 1.23456 == 1.23456 red>> 1e10 == 10000000000.0 red>> 1.23 * 2 == 2.46 red>> 1.23 * 2.0 == 2.46 red>> to integer! 1.23 * 2.0 == 2 red>> cos pi == -1.0 red>> sin pi == 0.0 red>> cos pi / 2 == 0.0 red>> cos pi / 3 == 0.5 red>> cosine/radians pi / 3 == 0.5 red>> cosine 60 == 0.5 red>> .1 + .2 + .3 == 0.6 red>> .1 + .2 + .3 = .6 == true red>> .1 + .2 + .3 - .6 == 1.110223024625157e-16 red>> float' load "0.1" == true red>> to float! 1 == 1.0 red>> 1 = to integer! to float! 1 == true
As you can see, Red tries to give you meaningful outputs even when the result is not exact, but this approach has its limits too. Qtxie has ported partially dtoa() functions to Red/System, however, the overhead of the additional code (20-40KB once compiled) is quite costly given how tiny is currently our runtime library (~350KB). So, for now, that implementation has been provided as an optional library for Red/System, and will be modularized for Red, once modules will be supported.
You might know that standard floating point format supports a few extra special values that are meant to make some calculation possible in edge cases. Those are also supported natively by Red, with the following literal formats:
Not a Number (NaN) : 1.#NaN Positive Infinity (+INF) : +1.#INF (or just 1.#INF) Negative Infinity (-INF) : -1.#INF Positive Zero : +0.0 (or just 0.0) Negative Zero : -0.0
These values are mostly intended for scientific calculations, you do not have to worry about them. They can be produced as results of some math operations on floats, but by default, an error will be thrown instead.
In case, you need to operate with maximum precision, and have all the special float values as results instead of errors, a couple of flags are available for that through the system
special access. The syntax is:
system/float-options [spec] [spec]: block of flags (word! | set-word!) with values (logic! | word!)
Valid flags are:
pretty'
: enables pretty printing of float numbers when very close to an integer value (default: true)full'
: enables math operations on float special values (default: false)Examples:
So far, Red supported only the armel ABI for ARM backends. Since this release, we fully support now armhf ABI too, through a specific compilation option that can be found in the new RPi compilation target (intended mainly for default OS on RaspberryPi). The main difference between these ABI is the way float values are passed as arguments to functions, armel requires passing them on stack, while armhf requires passing them through FPU registers.
url!
datatype preliminary support: all actions are working, but no path access support yet.reverse, random, swap, take, to
(*), trim
same’, NaN’
float’, routine’
(*) to
is currently limited to integer/float/string conversions only.
After the digression in the floating point lands, we go back to our main roadmap, so in the next releases, expect (in no particular order):
Thanks for your patience and support during these last months, we are now back to our cruise development speed, so expect faster changes until the end of the year.
EDIT (March 8, 2014): Updated for the 1.6.0 QEMU version. The recent release of the Raspberry Pi board raised a new wave of interest for the ARM platforms. As Red/System is already running on ARMv5+ platforms, a number of Red followers might want to test it on these platforms, so this article aims at giving you a quick way to setup a QEMU emulator for ARM and install a Debian GNU/Linux on top of it.
First thing first, let’s setup the platform. QEMU is the tool we want for that job. As explained on the QEMU web site: “QEMU is a generic and open source machine emulator and virtualizer.” The nice thing about QEMU is that it is able to emulate a good range of ARM platforms with different CPU versions.
QEMU is distributed as a source package, like most of open source tools, however this is not always convenient for Windows users, so you will also find a link to Windows pre-compiled binaries.
The simplest and quickest way to get a Linux/ARM distribution running on top of QEMU is to used pre-installed Debian images. These Virtual Machine images can be found there along with additional useful information (be sure to read them all). As you can see, there are two kind of images: standard and desktop. The desktop one gives you the full Debian GUI environment pre-installed, but be warned, it is extremely slow, even on my Core i7 box with a medium-level graphic card, so I recommend using the standard version pre-installed with Debian Squeeze (latest Debian release).
The files you need from the debian.org site are (direct links provided for convenience):
Put them all somewhere in the same folder.
The command line for starting QEMU with the pre-installed VM is provided on the debian.org page, here is a copy of the right command line for the standard VM with 2.6.32 kernel:
qemu-system-armw -L Bios -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile -hda debian_squeeze_armel_standard.qcow2 -append "root=/dev/sda1"
For Windows users, the easiest way to start it is to make a shortcut on qemu-system-arm
, add the command-line arguments and insert the path to the VM files in the “working folder” field.
You can now just run the emulator and boot on Debian to test your environment.
For purists, it is also possible to install the Debian distro from scratch following this step-by-step tutorial.
As you will quickly discover, the network connection is not working out of the box, so you need to add more parameters to the command-line to make it work. From my own experience, it is a black art to make it work properly (the documentation is really poor and obscure on that topic), but I ended up making the network work (and the Internet connection through the host platform) by using these additional arguments:
-net nic -net user
Once the VM is rebooted, you can test it using a ping and then issue an =r apt-get update=r.
command. In case the ping test passes but not the apt-get, you might have wrong apt source URL, so you can change them by editing the /etc/apt/sources.list config file.
You have now a working ARM virtual platform, but in order to make it useful for Red/System testing, you need a simple way to pass compiled files to the guest OS (Red/System can only cross-compile to ARM due to the lack of a suitable REBOL interpreter).
In order to achieve that, you need to add new parameters to the command-line in order to map a guest OS TCP port to a host OS port. For example, to map guest OS port 22 (SSH) to port 1222 on host OS, just add:
-redir tcp:2222::22
So, the VM internal port 22 is now reachable from localhost:1222 on your host OS. You can now use your favorite SSH/SFTP/SCP client to get a remote shell and transfer files to the VM. You might need to setup a SSH server in the VM (I seem to recall that it is not installed by default in the above images), you can achieve that using the following command:
# sudo apt-get install
openssh-client openssh-server
I use SSH for moving files in and out the VM using the still excellent SSH Secure Shell tool for Windows, but you could as well use FTP or any other TCP-based suitable protocol.
You can improve your experience with QEMU by adding more memory to the default emulated ARM platform which only has 128MB. Pushing it to 256MB (same as Raspberry PI Model A board now has) is highly recommended, just add to the command-line:
-m 256
If you are using a non-english keyboard like myself, you can also emulate your preferred keyboard layout using for example, the following command:
-k fr
will setup the keyboard with a french layout, other country codes are available here. In case you get an error message about the keymap not being found, just copy the Bios/keymaps folder one level up, so that it is just above your qemu-* binaries.
That’s all folks, I hope this would have help you get started! Let me know if there is any error or missing info in this article, and let me know if it worked well for you.