[M3devel] Bare Metal Modula-3

Darko darko at darko.org
Sat Jan 5 09:24:00 CET 2013


That shouldn't be hard, there's a detailed guide here using GCC:

http://www.state-machine.com/arm/Building_bare-metal_ARM_with_GNU.pdf

Building an ARM cross compiler will be a bit more involved and although there don't seem to be any fundamental dependencies in the runtime I get the feeling separating the M3 minimalist portion from the OS dependent portion is going to be messy.
 


On Jan 4, 2013, at 6:40 PM, Jay K wrote:

> Get hello world running on your system first, written in C. Then get back to us. :)
> Seriously.
>  
> Ok, maybe not with stdio.
> At least this:
>  
> int main()
> {
>  malloc(1);
>  return 0;
> }
>  
>  
>  - Jay
>  
> Subject: Re: [M3devel] Bare Metal Modula-3
> From: darko at darko.org
> Date: Fri, 4 Jan 2013 16:45:27 -0800
> CC: m3devel at elegosoft.com
> To: jay.krell at cornell.edu
> 
> That's useful to know. It makes implementing memory allocation very straight forward. All I'd need to implement would be some calls for setting aside pages of memory and setting their read/write status, which would be directly supported by the hardware.
> 
> It also occurs to me I'd have to write some sort of loader, which shouldn't be difficult as long as I can link the m3 program into some sort of monolithic "raw" format that I can just copy into a fixed place in memory and start executing.
> 
> 
> 
> On Jan 4, 2013, at 4:36 PM, Jay K wrote:
> 
> Clarification regarding mmap.
>  
>  
> mmap has two fairly different purposes in Posix.
>  
>  
>  1) to "map a file" into memory 
>  2) to "allocate memory", probably with address and size page-aligned, probably for relatively large allocations (i.e. ones you don't mind rounding up to a page size).  
>  
>   #1 is the more obvious probably better known use. The one I knew of. The one it sounds like. 
>   #2 is what we use it for.  
>  
>  
> If we ever autoconf-m3core, it'd probably be reasonable to do something like:
>  
>  
> #if HAS_MMAP
> return mmap(...);
>  
> #elif HAS_CALLOC
>  
> void** p = (void**)calloc(size + sizeof(void*));
> if (!p) return p;
> p[0] = p;
> return p + 1;
>  
> #else
> #error
> #endif
>  
>  
> #if HAS_MMAP
> munmap(...);
>  
> #elif HAS_CALLOC
>  
> if (p)
>   free(((void**)p)[-1]);
>  
> #endif
>  
>  
> alternatively though, look for every directory named "POSIX" and make a copy of it, and modify as needed.
> Including assert(0) in places.
> Invent your own value for "OS_TYPE".
>  
>  
> Maybe
>  #define OS_TYPE_FOO 
>  #include ../POSIX/Foo.c 
>  
> and #ifndef OS_TYPE_FOO in Foo.c, if it isn't too messy.
>  
>  
> Sharing code can be good or bad.
>  
>  
> We don't actually use "memory protection".
> Er, well..maybe we do...we might have code that allocates stacks, and makes a page at either end inaccessible.
> This is nice. It might be required for "safety".
> It might also be a good idea to have a flag in Target.i3 that says the target needs calls in prologues to check for stack overflow, and use that instead.
> More portable -- i.e. doesn't require hardware page protection -- but bigger/bloated/slower.
>  
>  
>  
> Really you need to look at all the POSIX/PTHREAD/WIN32 directories, esp. in m3core and libm3.
> You make a much different system, you get to do the port.
> It is neither impossible nor a no-op.
>  
>  
>  - Jay
> 
> 
> 
> 
>  
> From: darko at darko.org
> Date: Fri, 4 Jan 2013 12:09:26 -0800
> To: dabenavidesd at yahoo.es
> CC: m3devel at elegosoft.com
> Subject: Re: [M3devel] Bare Metal Modula-3
> 
> It's not a realtime system, so that's not a problem. Have a look at my reply to Jay you'll see a fuller description of what I have in mind.
> 
> 
> On Jan 4, 2013, at 10:46 AM, Daniel Alejandro Benavides D. wrote:
> 
> Hi all:
> I think you just need runtime executive on top a machine would be enough.
> For instance VAXELN. 
> Problem is you would need realtime core services at the language level (somehow SPIN services with no protection overhead caused by language).
> Memory managament.  and threading are core services in VAXELN as part of system, just need bindings for each language.
> I guess you need and advanced distributed realtime system. Such was VMS 5 for rtVAX9000:
> http://books.google.com.co/books?id=TzUXAQAAMAAJ&dq="%2C+in+conjunction+with+VMS.+VAXELN%2C+which+provides+optimal+performance+for"&q="+which+provides+optimal+performance+for"#search_anchor
> 
> My hypothesis is that you can't bring up a realtime application in an embedded device like you want.
> I know of realtime OS in Modula-3, there must be several ones I guess, based on what I have researched but you can not trust whether they are embedded, that's the problem.
> Thanks in advance
> 
> 
> --- El vie, 4/1/13, Darko <darko at darko.org> escribió:
> 
> De: Darko <darko at darko.org>
> Asunto: [M3devel] Bare Metal Modula-3
> Para: "m3devel developers" <m3devel at elegosoft.com>
> Fecha: viernes, 4 de enero, 2013 04:16
> 
> I'm interested in deploying M3 into a kind-of embedded environment where efficiency and performance are key and I want to avoid installing an OS beyond a simple supervisor that manages the hardware. 
> 
> The services needed are threading, memory allocation and network access. I'm figuring the first two already exist in M3 and a network stack can be found.
> 
> The question I have is can all of the OS specific runtime can be removed? Beyond maybe a timer and possibly some memory protection functionality, what does M3 need to run threading and garbage collection?
> 
> - Darko
> 
> 
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20130105/9cfee80e/attachment-0002.html>


More information about the M3devel mailing list