D.gnu - D for embedded system
- Timo Sintonen (13/13) Oct 18 2012 I have written programs with C for Arm Cortex controller boards.
- Iain Buclaw (5/16) Oct 18 2012 What OS are you working on?
- Timo Sintonen (1/2) Oct 18 2012 Linux
- Iain Buclaw (7/9) Oct 18 2012 I shouldn't have thought there would be any asserts when compiling the
- Timo Sintonen (8/12) Oct 18 2012 Yes, but I need the library for the cross compiled target,
- Johannes Pfau (25/42) Oct 19 2012 Druntime might not need file access/etc as long as version(Posix) isn't
- Timo Sintonen (38/51) Oct 20 2012 I have already made some tests:
- Iain Buclaw (7/51) Oct 20 2012 Quick question, what is defined in your phobos-vers-syms file? (This
- Timo Sintonen (11/15) Oct 20 2012 NoSystem
- Jacob Carlborg (10/33) Oct 20 2012 There are developers who have used D1 to create an operating system, or
- Martin Nowak (10/21) Oct 20 2012 I recently did a project on the STM32F0-Discovery board.
- Timo Sintonen (5/13) Oct 20 2012 Object is a parent for all classes so nothing can be compiled
- Johannes Pfau (22/38) Oct 20 2012 It's sad that we don't have a documentation about features which
- maarten van damme (5/5) Oct 20 2012 It's also sad that druntime is so difficult to port to other platforms
- Timo Sintonen (15/22) Oct 21 2012 This is only in dmd. Gdc does not have this. (d-glue.cc line
- Iain Buclaw (6/44) Oct 21 2012 What an awful name for a flag... (I suppose I better use
- Martin Nowak (3/4) Oct 23 2012 Yeah probably. Are there any patches required to build a
- Iain Buclaw (7/11) Oct 23 2012 Nope - building a cross-compiler should be available in the gcc make
- Timo Sintonen (23/25) Oct 23 2012 Before compiling gcc-package there should be binutils and libc
- Timo Sintonen (7/7) Nov 03 2012 I have started to make a minimum libdruntime. First I compiled
- Iain Buclaw (6/12) Nov 03 2012 Release/no bounds check would probably generate the least amount of
- Timo Sintonen (10/10) Nov 11 2012 I have been able to make a minimum library, link it with my test
- maarten van damme (8/8) Nov 17 2012 Why is so much built in to druntime? creating classes, AA's,....
- Timo Sintonen (33/45) Nov 18 2012 Druntime is a mixture of functions that the application may call,
- Jacob Carlborg (10/12) Nov 18 2012 One reason for why AA's are in druntime is for the syntax sugar:
- Freddie Chopin (11/11) Jan 08 2013 Hi!
- Matthew Caron (11/15) Jan 08 2013 I had a cross compiler working based on an older version of this:
- Freddie Chopin (18/35) Jan 08 2013 Yes, we're talking about real bare-metal here (; I think D with
- Freddie Chopin (12/21) Jan 08 2013 To be even more specific - I'm talking about microCONTROLLERS
- Dmitry Olshansky (11/30) Jan 08 2013 I'd bet that the most of Phobos is out. Then it needs custom run-time
- Matthew Caron (8/13) Jan 08 2013 That makes sense. Our "smart" systems are, at a minimum, an ARM9 core
- Timo Sintonen (29/29) Jan 08 2013 There are hundreds of ARM processors from several vendors from
- Freddie Chopin (9/13) Jan 08 2013 You should definetely post that to github or somewhere (dropbox,
- Dmitry Olshansky (9/20) Jan 08 2013 +1 for placing the work as a fork on github. It would also make sure the...
- Timo Sintonen (12/19) Jan 08 2013 The address is in the text in several places in this thread, but
- Freddie Chopin (8/11) Jan 09 2013 I've read this article, but actually I was hoping I could "drop"
- Timo Sintonen (20/26) Jan 09 2013 You can and in this case you should make the toolchain first
- Jacob Carlborg (5/13) Jan 08 2013 This guy has created a GC free version of druntime and Phobos:
- Freddie Chopin (8/14) Jan 08 2013 That seems true - internally D just wraps POSIX (pthread.h
- Freddie Chopin (30/30) Jan 15 2013 After browsing the forums a bit I've stumbled across a discussion
- Timo Sintonen (4/4) Jan 22 2013 By request I have put my minimum library work visible at
- Freddie Chopin (10/14) Jan 22 2013 Great! (;
- Iain Buclaw (5/12) Jan 22 2013 Why are you upside-down. :)
- Freddie Chopin (3/5) Jan 22 2013 Against mainstream! <;
- Timo Sintonen (16/22) Jan 22 2013 I will add something when I have time. I have a simple malloc and
I have written programs with C for Arm Cortex controller boards. I think that D might be an interesting nut simple enough oo language. So far I have a working gdc for my target, but I can not compile the runtime library because of too many os related assertions. With my own makefile I can compile part of the library, so I know tha compiler is working. Is there a way to make a minimum library? Embedded systems do not have file systems or streams or many other things that operating systems have. There would be no need for the whole libaray, but the compiler needs at least the Object class. So is it possible to configure a minimum library or should I just look at every file and remove everything that is not needed?
Oct 18 2012
On 18 October 2012 12:36, Timo Sintonen <t.sintonen luukku.com> wrote:I have written programs with C for Arm Cortex controller boards. I think that D might be an interesting nut simple enough oo language. So far I have a working gdc for my target, but I can not compile the runtime library because of too many os related assertions. With my own makefile I can compile part of the library, so I know tha compiler is working. Is there a way to make a minimum library? Embedded systems do not have file systems or streams or many other things that operating systems have. There would be no need for the whole libaray, but the compiler needs at least the Object class. So is it possible to configure a minimum library or should I just look at every file and remove everything that is not needed?What OS are you working on? -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';
Oct 18 2012
On 18 October 2012 16:12, Timo Sintonen <t.sintonen luukku.com> wrote:I shouldn't have thought there would be any asserts when compiling the library (at least I don't get any). Regards -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';What OS are you working on?Linux
Oct 18 2012
I shouldn't have thought there would be any asserts when compiling the library (at least I don't get any). RegardsYes, but I need the library for the cross compiled target, arm-eabi. This target doen not define any os. There are several places where is a test for mac/win/linux and if none of them, the last choice is "unsupported target". If it pass, some symbols are not defined at all causing trouble somewhere else. So we need a version define like "embedded" or "no_os" that leaves totally out all os related stuff like file access or provides dummy functions.
Oct 18 2012
Am Thu, 18 Oct 2012 17:51:46 +0200 schrieb "Timo Sintonen" <t.sintonen luukku.com>:Druntime might not need file access/etc as long as version(Posix) isn't defined for your target. Nobody has used GDC/D/druntime on a system without OS afaik. So you have to pioneer ;-) I see two solutions: * Create your own, simple runtime library. There's no real documentation on the minimum interface a runtime must implement (the compiler calls back into the runtime), so this would be a little tricky. * Adjust druntime. You can probably throw out 90% of the druntime code (core.sys.*). Make sure the basic code work with ansi C. Forget about things like threading (core.thread, core.sync), those require system specific code and can be implemented later on. Your biggest problem is probably the GC and TLS. If your target libc supports TLS, things should work just fine. If not, there's some additional work waiting. You need to reimplement some functions for the GC (get stack top/bottom...) which shouldn't be too difficult, but getting the TLS range might be tricky, depending on your system. You could also try to remove the GC completely, but the language currently assumes that a GC is available (things like dynamic array appending, ...). A proper -nogc switch which disables GC features like array appending would be a solution, but nothing like this is implemented yet, IIRC. (But I think there was some kind of --betterc switch which could be a start?)I shouldn't have thought there would be any asserts when compiling the library (at least I don't get any). RegardsYes, but I need the library for the cross compiled target, arm-eabi. This target doen not define any os. There are several places where is a test for mac/win/linux and if none of them, the last choice is "unsupported target". If it pass, some symbols are not defined at all causing trouble somewhere else. So we need a version define like "embedded" or "no_os" that leaves totally out all os related stuff like file access or provides dummy functions.
Oct 19 2012
Nobody has used GDC/D/druntime on a system without OS afaik. So you have to pioneer ;-)So I have to try it on my own...* Create your own, simple runtime library. There's no real documentation on the minimum interface a runtime must implement (the compiler calls back into the runtime), so this would be a little tricky.I have already made some tests: I compiled a simple class without any library. The missing symbols tell me what is the minimum that is expected to be in Object class. I tried to compile an empty Object class. There is some problems because Object seems to be a reserved word in gdc. The biggest problem is that gdc gets an internal error every time I try to compile my own Object. If this is an unknown bug in gdc, I may look it again. (an internal compiler error is always a bug, isn't it?)* Adjust druntime. You can probably throw out 90% of the druntime codeI compiled object.d without imports and commented out everything that failed the compilation. There is still some missing symbols but I think this version would not work anyway. I have a working glibc, newlib and my own minimum libc. So I would follow the linux version as far as possible. Because Linux is a reserved word I changed with sed all the linux version checks to another word and got nearly all compiled. First time I got over 400 lines of missisng symbols but I could see what functions are expected from the c library.Your biggest problem is probably the GC and TLS.To be more general, the library should have a minimum version with no threads and gc and be configurable to have them. In controller world resources are limited. We talk about kilobytes when pc people talk about gigabytes. The advantage is that everything is usually fixed and known at design time. Memory is usually allocated once and kept as long as the device is operating. The same is for threads. Threads are initiated at startup and have only one instance. They keep running as long as the device is operating. In the threading system I use now the main loop of each thread is run once and at the end of the loop control is returned to the scheduler which jumps to the next thread. So the application can run without gc and tls. On the other hand, the amount of threads is known. It is even possible to hardcode tls address for every thread if needed. Memory pool and stack are also in fixed addresses and all pointers are available. So the low level stuff would be quite simple. The biggest job is to get it work with the higher level code.
Oct 20 2012
On 20 October 2012 09:23, Timo Sintonen <t.sintonen luukku.com> wrote:Quick question, what is defined in your phobos-vers-syms file? (This will be located in the libphobos / libdruntime build directory). Regards -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';Nobody has used GDC/D/druntime on a system without OS afaik. So you have to pioneer ;-)So I have to try it on my own...* Create your own, simple runtime library. There's no real documentation on the minimum interface a runtime must implement (the compiler calls back into the runtime), so this would be a little tricky.I have already made some tests: I compiled a simple class without any library. The missing symbols tell me what is the minimum that is expected to be in Object class. I tried to compile an empty Object class. There is some problems because Object seems to be a reserved word in gdc. The biggest problem is that gdc gets an internal error every time I try to compile my own Object. If this is an unknown bug in gdc, I may look it again. (an internal compiler error is always a bug, isn't it?)* Adjust druntime. You can probably throw out 90% of the druntime codeI compiled object.d without imports and commented out everything that failed the compilation. There is still some missing symbols but I think this version would not work anyway. I have a working glibc, newlib and my own minimum libc. So I would follow the linux version as far as possible. Because Linux is a reserved word I changed with sed all the linux version checks to another word and got nearly all compiled. First time I got over 400 lines of missisng symbols but I could see what functions are expected from the c library.Your biggest problem is probably the GC and TLS.To be more general, the library should have a minimum version with no threads and gc and be configurable to have them. In controller world resources are limited. We talk about kilobytes when pc people talk about gigabytes. The advantage is that everything is usually fixed and known at design time. Memory is usually allocated once and kept as long as the device is operating. The same is for threads. Threads are initiated at startup and have only one instance. They keep running as long as the device is operating. In the threading system I use now the main loop of each thread is run once and at the end of the loop control is returned to the scheduler which jumps to the next thread. So the application can run without gc and tls. On the other hand, the amount of threads is known. It is even possible to hardcode tls address for every thread if needed. Memory pool and stack are also in fixed addresses and all pointers are available. So the low level stuff would be quite simple. The biggest job is to get it work with the higher level code.
Oct 20 2012
On Saturday, 20 October 2012 at 09:40:28 UTC, Iain Buclaw wrote:Quick question, what is defined in your phobos-vers-syms file? (This will be located in the libphobos / libdruntime build directory). RegardsNoSystem DCFG_NEARBYINT DCFG_TGAMMA DCFG_NAN GNU_Need_exp2 GNU_Need_log2 DCFG_EXECVPE DCFG_SPAWNVP GNU_CBridge_Stdio GNU_ARM_EABI_Unwinder
Oct 20 2012
On 2012-10-19 20:08, Johannes Pfau wrote:Druntime might not need file access/etc as long as version(Posix) isn't defined for your target. Nobody has used GDC/D/druntime on a system without OS afaik. So you have to pioneer ;-) I see two solutions:There are developers who have used D1 to create an operating system, or kernel. http://wiki.xomb.org/index.php?title=Main_Page https://github.com/xomboverlord/xomb Last update, 4 months ago, I thought it was completely dead.* Create your own, simple runtime library. There's no real documentation on the minimum interface a runtime must implement (the compiler calls back into the runtime), so this would be a little tricky. * Adjust druntime. You can probably throw out 90% of the druntime code (core.sys.*). Make sure the basic code work with ansi C. Forget about things like threading (core.thread, core.sync), those require system specific code and can be implemented later on. Your biggest problem is probably the GC and TLS. If your target libc supports TLS, things should work just fine. If not, there's some additional work waiting. You need to reimplement some functions for the GC (get stack top/bottom...) which shouldn't be too difficult, but getting the TLS range might be tricky, depending on your system. You could also try to remove the GC completely, but the language currently assumes that a GC is available (things like dynamic array appending, ...). A proper -nogc switch which disables GC features like array appending would be a solution, but nothing like this is implemented yet, IIRC. (But I think there was some kind of --betterc switch which could be a start?)There are a lot of other features in D that depend on the runtime, which one needs to be aware of. -- /Jacob Carlborg
Oct 20 2012
On Thu, 18 Oct 2012 13:36:45 +0200, Timo Sintonen <t.sintonen luukku.com> wrote:I have written programs with C for Arm Cortex controller boards. I think that D might be an interesting nut simple enough oo language. So far I have a working gdc for my target, but I can not compile the runtime library because of too many os related assertions. With my own makefile I can compile part of the library, so I know tha compiler is working. Is there a way to make a minimum library? Embedded systems do not have file systems or streams or many other things that operating systems have. There would be no need for the whole libaray, but the compiler needs at least the Object class. So is it possible to configure a minimum library or should I just look at every file and remove everything that is not needed?I recently did a project on the STM32F0-Discovery board. After having used a nice arm-none-eabi-*/openocd toolchain I wonder what is needed to build a cross-gdc. As these devices are really short on Flash and RAM I would've only translated the peripheral headers without using any runtime. Not sure though if you can get classes without full typeinfos support. martin
Oct 20 2012
On Saturday, 20 October 2012 at 14:35:44 UTC, Martin Nowak wrote:I recently did a project on the STM32F0-Discovery board. After having used a nice arm-none-eabi-*/openocd toolchain I wonder what is needed to build a cross-gdc. As these devices are really short on Flash and RAM I would've only translated the peripheral headers without using any runtime. Not sure though if you can get classes without full typeinfos support.Object is a parent for all classes so nothing can be compiled without it. One test I made shows that object and typeinfo would take 16-20 kb flash. In addition we need some libc code and application code. STM32F0 may be too small. My target is STM32F4
Oct 20 2012
Am Sat, 20 Oct 2012 17:27:33 +0200 schrieb "Timo Sintonen" <t.sintonen luukku.com>:On Saturday, 20 October 2012 at 14:35:44 UTC, Martin Nowak wrote:It's sad that we don't have a documentation about features which require runtime support. If you manage to get this working please make some notes about what features need the runtime (You can use the gdc wiki, gdcproject.org/wiki or the d wiki: http://prowiki.org/wiki4d/wiki.cgi?FrontPage ) BTW: Here's the dmd commit which introduced betterc: https://github.com/D-Programming-Language/dmd/commit/707949edc30f245a68145bef619f6f02b85e39ab but right now it only disables moduleinfo generation, afaics. You probably already noticed that you can compile stuff without druntime support just fine (compile with -nophoboslib), as long as you only use c functions: ----------------------------- import core.stdc.stdio; extern(C) in main(int argc, const char* argv[]) { printf("Hello World!\n".ptr); return 0; } ----------------------------- As soon as a feature requires runtime support you'll get linker errors.I recently did a project on the STM32F0-Discovery board. After having used a nice arm-none-eabi-*/openocd toolchain I wonder what is needed to build a cross-gdc. As these devices are really short on Flash and RAM I would've only translated the peripheral headers without using any runtime. Not sure though if you can get classes without full typeinfos support.Object is a parent for all classes so nothing can be compiled without it. One test I made shows that object and typeinfo would take 16-20 kb flash. In addition we need some libc code and application code. STM32F0 may be too small. My target is STM32F4
Oct 20 2012
It's also sad that druntime is so difficult to port to other platforms because of the version(platformdependent) all over the place. Would there be a way to cleanly seperate platform-dependent stuff with platform-independent stuff (so a no-os or android version would be easier to make).
Oct 20 2012
On Saturday, 20 October 2012 at 18:40:51 UTC, Johannes Pfau wrote:BTW: Here's the dmd commit which introduced betterc: https://github.com/D-Programming-Language/dmd/commit/707949edc30f245a68145bef619f6f02b85e39ab but right now it only disables moduleinfo generation, afaics.This is only in dmd. Gdc does not have this. (d-glue.cc line 2827, I think)You probably already noticed that you can compile stuff without druntime support just fine (compile with -nophoboslib), as long as you only use c functions:It seems that cross compilers does not use standard includes and libraries by default. I have my own linker script anyway, because I have fixed addresses and my own program to load the code to the controller. When I get that far, I have to check the extra sections the compiler generates, whether they are needed or not. I naturally want to use classes. A test of a simple class: class mytest { int atest(int m) { return m; } } This makes 6 calls to Object and 5-6 calls to other druntime classes or to functions druntime wants from os.
Oct 21 2012
On 20 October 2012 19:40, Johannes Pfau <nospam example.com> wrote:Am Sat, 20 Oct 2012 17:27:33 +0200 schrieb "Timo Sintonen" <t.sintonen luukku.com>:What an awful name for a flag... (I suppose I better use -ffreestanding / -fhosted to map to that then). -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';On Saturday, 20 October 2012 at 14:35:44 UTC, Martin Nowak wrote:It's sad that we don't have a documentation about features which require runtime support. If you manage to get this working please make some notes about what features need the runtime (You can use the gdc wiki, gdcproject.org/wiki or the d wiki: http://prowiki.org/wiki4d/wiki.cgi?FrontPage ) BTW: Here's the dmd commit which introduced betterc: https://github.com/D-Programming-Language/dmd/commit/707949edc30f245a68145bef619f6f02b85e39ab but right now it only disables moduleinfo generation, afaics. You probably already noticed that you can compile stuff without druntime support just fine (compile with -nophoboslib), as long as you only use c functions: ----------------------------- import core.stdc.stdio; extern(C) in main(int argc, const char* argv[]) { printf("Hello World!\n".ptr); return 0; } ----------------------------- As soon as a feature requires runtime support you'll get linker errors.I recently did a project on the STM32F0-Discovery board. After having used a nice arm-none-eabi-*/openocd toolchain I wonder what is needed to build a cross-gdc. As these devices are really short on Flash and RAM I would've only translated the peripheral headers without using any runtime. Not sure though if you can get classes without full typeinfos support.Object is a parent for all classes so nothing can be compiled without it. One test I made shows that object and typeinfo would take 16-20 kb flash. In addition we need some libc code and application code. STM32F0 may be too small. My target is STM32F4
Oct 21 2012
On Saturday, 20 October 2012 at 15:27:34 UTC, Timo Sintonen wrote:STM32F0 may be too small.Yeah probably. Are there any patches required to build a cross-gdc?
Oct 23 2012
On 23 October 2012 17:37, Martin Nowak <dawg dawgfoto.de> wrote:On Saturday, 20 October 2012 at 15:27:34 UTC, Timo Sintonen wrote:Nope - building a cross-compiler should be available in the gcc make infrastructure. The issue most people get with them is that the toolchain/environment for the cross-compiler is broken somewhere.... -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';STM32F0 may be too small.Yeah probably. Are there any patches required to build a cross-gdc?
Oct 23 2012
On Tuesday, 23 October 2012 at 16:37:11 UTC, Martin Nowak wrote:Are there any patches required to build a cross-gdc?Before compiling gcc-package there should be binutils and libc for the target installed. Binutils is the gnu binutils package and as libc I have used newlib, which is a lighter version than gnu libc. Both are easy to compile with: configure --target=arm-eabi (or whatever the target is) for gcc I use this: ../gcc/configure --disable-bootstrap \ --enable-languages=c,c++,d --disable-nls --target=arm-eabi \ --without-headers --with-newlib --without-isl --without-cloog ( i have gcc sources in /usr/local/src/gcc and this script is in /usr/local/src/build-gcc) You should first compile and install only c compiler (enable-langugages=c). If this works, then add c++ and if this works, then add d. If you want to make it for Cortex, one small patch is needed in gcc/config/arm/t-arm-elf to get a working libgcc.a for thumb code. You do not necessary need this for simple programs. The d compilation fails currently to make the d runtime library and I am working on this. As suggested, we could start a wiki page for gdc cross compilers. So for the wiki maintainer: please create the page and add link to the front page
Oct 23 2012
I have started to make a minimum libdruntime. First I compiled object and now I am adding files one by one when needed. The compiler generates lots of library calls. So far I have found these flags to get the code smaller and to reduce library calls: -fno-assert -fno-invariants and -fno-bouns-check. Is there any other options that would make the executable more simple?
Nov 03 2012
On 3 November 2012 12:44, Timo Sintonen <t.sintonen luukku.com> wrote:I have started to make a minimum libdruntime. First I compiled object and now I am adding files one by one when needed. The compiler generates lots of library calls. So far I have found these flags to get the code smaller and to reduce library calls: -fno-assert -fno-invariants and -fno-bouns-check. Is there any other options that would make the executable more simple?Release/no bounds check would probably generate the least amount of library calls: -frelease -fno-bounds-check -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';
Nov 03 2012
I have been able to make a minimum library, link it with my test program and run the program in my arm cortex-m4 controller board. Some features are disabled and many features are still untested. The library does not yet have threads and memory management is done with gcstub. My test program succesfully access static class data, generates two instances of a cloass and succesfully manipulates instance data. All this was done with reasonable amount of work. No extra code needed so far, except system dependent malloc/realloc/free. So I think it is possible to make this library for other targets too.
Nov 11 2012
Why is so much built in to druntime? creating classes, AA's,.... Is it normal? does c++ do the same thing? Why wasn't opted for making opIndex overloadable with other objects so AA's could be moved out of druntime and in phobos? I have no experience with language design but wouldn't it be great if druntime was more modular to make porting (and stripping) of features for for example embedded platforms more easy? And is somewhere documented which functions need to be implemented in druntime?
Nov 17 2012
On Saturday, 17 November 2012 at 23:08:04 UTC, maarten van damme wrote:Why is so much built in to druntime? creating classes, AA's,.... Is it normal? does c++ do the same thing? Why wasn't opted for making opIndex overloadable with other objects so AA's could be moved out of druntime and in phobos? I have no experience with language design but wouldn't it be great if druntime was more modular to make porting (and stripping) of features for for example embedded platforms more easy? And is somewhere documented which functions need to be implemented in druntime?Druntime is a mixture of functions that the application may call, functions that the generated code calls and internal library functions. As pointed out earlier in this thread, there is no more documentation than those generated from the source files. They tell how to use the functions but does not tell when and why we need it. I started with my test class and object.d and added files one by one and commented out some features until all references were solved in that particular case. Nearly every file in the library is related to some d construction or keyword. If I use a construction in my application, I need a file from the library. Unfortunately, the whole file is included from the library even if I need a single funtion from it. The library has lots of version dependencies. First it has been made for win/mac/linux, then it has been ported to gdc. The next challenge is to add support for all mobile platforms and embedded systems with no os at all. In my opinion the version system will not work any more when we have 10 different systems to support. We should have abstract classes an put the real implementation to os specific directory. Then we make that directory as import directory. It might also be good to have a minimum implementation in configure. That would include only the necessary files and define version=minimum. This option would leave out as much as possible from the code. To make it work with all possible configuration may not be an easy task. All these takes lots of time and work. If the library is only for gdc, it would be simpler. To have a library that is totally different from the dmd version might not be a good idea. A library with different features and bugs may reduce the amount of possible users and it is harder to get people to maintain it.
Nov 18 2012
On 2012-11-18 00:07, maarten van damme wrote:Why wasn't opted for making opIndex overloadable with other objects so AA's could be moved out of druntime and in phobos?One reason for why AA's are in druntime is for the syntax sugar: int[string] aa; If the AA's where only in Phobos, this would be the syntax: AssociativeArray!(string, int) aa; Originally there were much more code in the compiler for handling associative arrays. Then, not that long a go, there was a rewrite that tried to move as much as possible to druntime instead. -- /Jacob Carlborg
Nov 18 2012
Hi! Any progress on making D an usable alternative for C/C++ for ARM MCUs? This would be VERY interesting thing! A wiki page was mentioned several times, but I guess that it didn't happen, so the only source of knowledge is this thread... Anyway - do you think that D's threads could actually replace a RTOS on an embedded system? This would be quite interesting too (; Maybe a separate repo on github for embedded development would be a good idea - more people would be able to help then (me included!)... 4\/3!!
Jan 08 2013
On 01/08/2013 09:22 AM, Freddie Chopin wrote:> Hi!Any progress on making D an usable alternative for C/C++ for ARM MCUs?I had a cross compiler working based on an older version of this: http://gdcproject.org/wiki/Cross%20Compiler/crosstool-NG Bear in mind that my embedded system is an ARM CPU with at least 16MB of RAM, so it runs Linux and is basically just a small footprint Linux distro. If you mean "bare metal", I haven't done that.Anyway - do you think that D's threads could actually replace a RTOS on an embedded system? This would be quite interesting too (;An RTOS does a lot more than manage threads. ;-) -- Matthew Caron, Software Build Engineer Sixnet, a Red Lion business | www.sixnet.com +1 (518) 877-5173 x138 office
Jan 08 2013
On Tuesday, 8 January 2013 at 15:45:18 UTC, Matthew Caron wrote:On 01/08/2013 09:22 AM, Freddie Chopin wrote:> Hi!Yes, we're talking about real bare-metal here (; I think D with it's safety fits really nicely in the embedded niche... I think that if D could be used on a system with 128kB of flash and 8kB of RAM that would be great. If it would require the chip to have more RAM it wouldn't be so great, but a 16kB or 32kB is still quite OK... This would probably require D's lib (phobos) to NOT depend on garbage collector (or maybe use it only in some high-level stuff that would be to big for such embedded system anyway).Any progress on making D an usable alternative for C/C++ forARMMCUs?I had a cross compiler working based on an older version of this: http://gdcproject.org/wiki/Cross%20Compiler/crosstool-NG Bear in mind that my embedded system is an ARM CPU with at least 16MB of RAM, so it runs Linux and is basically just a small footprint Linux distro. If you mean "bare metal", I haven't done that.Well, RTOSes ("schedulers") like FreeRTOS don't do that much - you have threads, mutexes/semaphores, message queue and software timers - all of them but the last one is covered by D APIs, but now I thought that D probably just uses some OS services for that (like POSIX pthread.h), wrapping it up a little... Anyway - I think these functions of D would nicely replace simple RTOSes that have a scheduler and nothing more... 4\/3!!Anyway - do you think that D's threads could actually replaceaRTOS on an embedded system? This would be quite interestingtoo (; An RTOS does a lot more than manage threads. ;-)
Jan 08 2013
On Tuesday, 8 January 2013 at 16:52:05 UTC, Freddie Chopin wrote:Yes, we're talking about real bare-metal here (; I think D with it's safety fits really nicely in the embedded niche... I think that if D could be used on a system with 128kB of flash and 8kB of RAM that would be great. If it would require the chip to have more RAM it wouldn't be so great, but a 16kB or 32kB is still quite OK... This would probably require D's lib (phobos) to NOT depend on garbage collector (or maybe use it only in some high-level stuff that would be to big for such embedded system anyway).To be even more specific - I'm talking about microCONTROLLERS (not micro-processors), ARM Cortex-M3 or Cortex-M4, STM32, LPC17xx, maybe even Cortex-M0 if the footprint is low enough... So no MMU, sometimes MPU (rarely), ROM in "hundreds of kilobytes", RAM in "tens of kilobytes" (sometimes less, rarely over 100kB - only for really big chips). PC programmers have so many options to choose from, while on the MCUs it's basically only C (really about 99.666%), C++ sometimes, sometimes assembly - there are also things not worth mentioning like BASIC for some AVR chips and that's about all... 4\/3!!
Jan 08 2013
08-Jan-2013 20:58, Freddie Chopin пишет:On Tuesday, 8 January 2013 at 16:52:05 UTC, Freddie Chopin wrote:I'd bet that the most of Phobos is out. Then it needs custom run-time w.r.t. threads and memory management (this could be built on top of whatever C-runtime is there), no GC and cutdown other features like RTTI (TypeInfo etc.) and/or class hierarchy with Object. Then, of course, to be practical it needs memory access to I/O ports/registers (this also could warp some C interface).Yes, we're talking about real bare-metal here (; I think D with it's safety fits really nicely in the embedded niche... I think that if D could be used on a system with 128kB of flash and 8kB of RAM that would be great. If it would require the chip to have more RAM it wouldn't be so great, but a 16kB or 32kB is still quite OK... This would probably require D's lib (phobos) to NOT depend on garbage collector (or maybe use it only in some high-level stuff that would be to big for such embedded system anyway).To be even more specific - I'm talking about microCONTROLLERS (not micro-processors), ARM Cortex-M3 or Cortex-M4, STM32, LPC17xx, maybe even Cortex-M0 if the footprint is low enough... So no MMU, sometimes MPU (rarely), ROM in "hundreds of kilobytes", RAM in "tens of kilobytes" (sometimes less, rarely over 100kB - only for really big chips).I'll get to use Cortex-M3/M4 rather soon (looking forward about half a year into future). So I'd love to know how to fit D in there.PC programmers have so many options to choose from, while on the MCUs it's basically only C (really about 99.666%), C++ sometimes, sometimes assembly - there are also things not worth mentioning like BASIC for some AVR chips and that's about all... 4\/3!!-- Dmitry Olshansky
Jan 08 2013
On 01/08/2013 11:58 AM, Freddie Chopin wrote:To be even more specific - I'm talking about microCONTROLLERS (not micro-processors), ARM Cortex-M3 or Cortex-M4, STM32, LPC17xx, maybe even Cortex-M0 if the footprint is low enough... So no MMU, sometimes MPU (rarely), ROM in "hundreds of kilobytes", RAM in "tens of kilobytes" (sometimes less, rarely over 100kB - only for really big chips).That makes sense. Our "smart" systems are, at a minimum, an ARM9 core (like an Atmel AT91), and we're drooling over the latest TI offerings (Cortex-A9 type stuff, like what's on the BeagleBone). -- Matthew Caron, Software Build Engineer Sixnet, a Red Lion business | www.sixnet.com +1 (518) 877-5173 x138 office
Jan 08 2013
There are hundreds of ARM processors from several vendors from megahertz to gigahertz and from kilobytes to gigabytes. When we talk about ARMs it should be good to mention what kind of ARM we are using. My interest is stm32f4 but everything I have done should be useful in the whole cortex-m series. A minimum library has been working for a while and I think that D really is my choice. There have been a little silence when I have investigated linker problems and I am not able to use all my time for this anyway. When we now have so many interested people, I think I should go on. My library is done with minimum set of files with minimum changes to them. There are about 20 changes required to get it compiled. This version can be run with 64 kb rom and 16 kb ram. It would be possible to get the library smaller by commenting out all unnecessary functions from all files. At this moment I want to keep the library as close to the original as possible. This library does not yet have threads, but I have planned a minimun thread library which is somewhere between fiber and thread. Garbage collector is the gcstub version, which just calls directly malloc and free. The library does not require libc but there should be a proper libgcc. (a libgcc for cortex-m3 and -m4 is not built by default when compiling gcc) The only functions needed outside are malloc, free, calloc and realloc and __aeabi_read_tp which returns the tls pointer. Next I think I will make a list of required changes and then I will make a simple makefile to compile the library. If anybody is interested, please send an email to me and I will send those files back to you.
Jan 08 2013
On Tuesday, 8 January 2013 at 20:13:54 UTC, Timo Sintonen wrote:Next I think I will make a list of required changes and then I will make a simple makefile to compile the library. If anybody is interested, please send an email to me and I will send those files back to you.You should definetely post that to github or somewhere (dropbox, ...)! I'd be really interested to see the files (and maybe some details about strange things you need to do to get whole toolchain compiled), but I cannot see your e-mail with webinterface of this list... BTW - on GitHub you could just fork phobos and do your changes as normal commits and that would be clearly visible to anyone (; 4\/3!!
Jan 08 2013
09-Jan-2013 00:42, Freddie Chopin пишет:On Tuesday, 8 January 2013 at 20:13:54 UTC, Timo Sintonen wrote:+1 for placing the work as a fork on github. It would also make sure the project is more visible and allow others to contribute easily. Plus you can scratch up the build instructions in a wiki page there (to avoid repeating it over personal emails and/or making a mail-list). Just compare the current DMD/Phobos to the era prior to placing it on GitHub :) -- Dmitry OlshanskyNext I think I will make a list of required changes and then I will make a simple makefile to compile the library. If anybody is interested, please send an email to me and I will send those files back to you.You should definetely post that to github or somewhere (dropbox, ...)! I'd be really interested to see the files (and maybe some details about strange things you need to do to get whole toolchain compiled), but I cannot see your e-mail with webinterface of this list... BTW - on GitHub you could just fork phobos and do your changes as normal commits and that would be clearly visible to anyone (;
Jan 08 2013
On Tuesday, 8 January 2013 at 20:42:07 UTC, Freddie Chopin wrote:You should definetely post that to github or somewhere (dropbox, ...)! I'd be really interested to see the files (and maybe some details about strange things you need to do to get whole toolchain compiled), but I cannot see your e-mail with webinterface of this list...The address is in the text in several places in this thread, but here it is: t.sintonen (at) luukku.comBTW - on GitHub you could just fork phobos and do your changes as normal commits and that would be clearly visible to anyone (;Of course this is the way to go. This just came so quickly. I should first write a makefile that works outside of my application and a list of changes. Because I have been messing around the files, I will also take a clean version of the original sources and write the changes again. Meanwhile I am asking you, have you read the instructions on http://gdcproject.org/wiki/Cross%20Compiler and have you been able to make the toolchain?
Jan 08 2013
On Wednesday, 9 January 2013 at 07:15:33 UTC, Timo Sintonen wrote:Meanwhile I am asking you, have you read the instructions on http://gdcproject.org/wiki/Cross%20Compiler and have you been able to make the toolchain?I've read this article, but actually I was hoping I could "drop" GDC into a linaro distribution of ARM bare-metal toolchain - https://launchpad.net/gcc-arm-embedded - it's a 4.7.x version, I don't know how big problem that is... So I haven't yet tried compiling the toolchain, but I guess that without your files it would not work anyway, right? (; 4\/3!!
Jan 09 2013
On Wednesday, 9 January 2013 at 08:31:01 UTC, Freddie Chopin wrote:but actually I was hoping I could "drop" GDC into a linaro distribution of ARM bare-metal toolchain - launchpad.net/gcc-arm-embedded - it's a 4.7.x version, I don't know how big problem that is... So I haven't yet tried compiling the toolchain, but I guess that without your files it would not work anyway, right? (;You can and in this case you should make the toolchain first without library. It is possible to compile programs with gdc without the library as long as only c style functions are used. A working linker script is needed to make the executable and a proper startup file is needed to make the executable work in the target platform. A suitable bootloader is needed to transfer the executable to the target processor. When all these are working, the runtime library is needed. The toolchain in https://launchpad.net/gcc-arm-embedded seems to be a good starting point for arm cortex processors. It has all the tools and also suitable linker scripts and startup files. But it is not aware of D. As mentioned earlier in this thread, nobody has made this yet. So there is not an easy way to go. As long as gdc is not part of the gcc package, some extra work is always needed. If the toolchain works, it is worth of try to replace gcc in there with the newest gcc with d patches. Some modifications are needed in the build script to enable d and disable libphobos.
Jan 09 2013
On 2013-01-08 17:52, Freddie Chopin wrote:Yes, we're talking about real bare-metal here (; I think D with it's safety fits really nicely in the embedded niche... I think that if D could be used on a system with 128kB of flash and 8kB of RAM that would be great. If it would require the chip to have more RAM it wouldn't be so great, but a 16kB or 32kB is still quite OK... This would probably require D's lib (phobos) to NOT depend on garbage collector (or maybe use it only in some high-level stuff that would be to big for such embedded system anyway).This guy has created a GC free version of druntime and Phobos: http://3d.benjamin-thaut.de/?p=20 -- /Jacob Carlborg
Jan 08 2013
On Tuesday, 8 January 2013 at 16:52:05 UTC, Freddie Chopin wrote:Well, RTOSes ("schedulers") like FreeRTOS don't do that much - you have threads, mutexes/semaphores, message queue and software timers - all of them but the last one is covered by D APIs, but now I thought that D probably just uses some OS services for that (like POSIX pthread.h), wrapping it up a little...That seems true - internally D just wraps POSIX (pthread.h especially) or whichever threading mechanism exists on the OS. Fortunately I have a rally nice and universal solution going around my head, which would make most of D runtime available for small embedded targets like Cortex-M3 (; If I could just stretch the day a bit, to - say - 96h... 4\/3!!
Jan 08 2013
After browsing the forums a bit I've stumbled across a discussion about C-style "volatile" and lack of something like that in D (I did not get too deep in the details yet), so I'd like to ask if there is something that can be used for the purpose of forcing memory accesses to happen ALWAYS, disregarding what sense such operations make to the compiler/optimizer? In MCUs it's for example common for one peripheral register (memory address) to perform two distinct functions, depending on whether you read or write: SPI->DR = data_to_send[0]; SPI->DR = data_to_send[1]; SPI->DR = data_to_send[2]; data_received[0] = SPI->DR; data_received[1] = SPI->DR; data_received[2] = SPI->DR; This cannot be mixed, this cannot be skipped, this cannot be concatenated, as each read/write has to take place exactly in the order specified. In C this is handled by making the memory address pointed "volatile": typedef struct SPI_s { volatile uint32_t DR; volatile uint32_t REG1; volatile uint32_t REG2; } SPI_t; #define SPI ((SPI_t*)0x12345678) How would you handle things like that in D? Is that possible? That's a crucial thing for system-programming (; 4\/3!!
Jan 15 2013
By request I have put my minimum library work visible at bitbucket.org/timosi/minlibd. It contains now the library. I hope it will contain other things for program development too, like makefiles and linker scripts and of course, documentation.
Jan 22 2013
On Tuesday, 22 January 2013 at 16:25:02 UTC, Timo Sintonen wrote:By request I have put my minimum library work visible at bitbucket.org/timosi/minlibd. It contains now the library. I hope it will contain other things for program development too, like makefiles and linker scripts and of course, documentation.Great! (; Any chance for adding any example that could be used to verify that everything works correctly? It does not matter for which microcontroller it would be, just anything for a start (; One more request - maybe you could share a compiled toolchain with the lib in a binary form (Windows)? Compiling that is probably not the easiest thing to do (; Thx again! 4\/3!!
Jan 22 2013
On 22 January 2013 17:02, Freddie Chopin <freddie_chopin op.pl> wrote:On Tuesday, 22 January 2013 at 16:25:02 UTC, Timo Sintonen wrote:Why are you upside-down. :) -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';By request I have put my minimum library work visible at bitbucket.org/timosi/minlibd. It contains now the library. I hope it will contain other things for program development too, like makefiles and linker scripts and of course, documentation.Great! (;
Jan 22 2013
On Tuesday, 22 January 2013 at 17:17:20 UTC, Iain Buclaw wrote:Against mainstream! <; 4\/3!!Great! (;Why are you upside-down. :)
Jan 22 2013
On Tuesday, 22 January 2013 at 17:02:58 UTC, Freddie Chopin wrote:Any chance for adding any example that could be used to verify that everything works correctly? It does not matter for which microcontroller it would be, just anything for a start (;I will add something when I have time. I have a simple malloc and a main program that sends one byte to uart.One more request - maybe you could share a compiled toolchain with the lib in a binary form (Windows)? Compiling that is probably not the easiest thing to do (;I have tried to avoid Windows since 1996 when I installed my first linux... The best place to ask for a toolchain might be those who have made the native Windows toolchain. It should not be a big job to change it to a different target. If I had time, I might also look at it. But this brings out an interesting question: If I have the same cross toolchain in Linux and Windows, and I compile same files with same settings, are the object files equal? If I compile some files in Windows and some in Linux, can I link them together and have a working executable? I think this should work in theory but does anybody have any real experience of cross compiling programs in both win and linux?
Jan 22 2013