On 07/10/11 14:11, JMGross wrote:
> ----- Ursprüngliche Nachricht -----
> Von: David Brown
> An: mspgcc-users@lists.sourceforge.net
> Gesendet am: 06 Okt 2011 15:58:12
>
>> This isn't a flame war, but it is an interesting discussion!
>
> I agree. And it shouldn't get into one.
> However, I fear that people could get bored by a discussion that strays
> from teh msp topic to a way more general topic and is of
> rather limited interest for most
> (yet I appreciate everyone who _does_ listen to this kind of discussion
> just out of curiosity, takign a chance to learn something or to get his
> existing knowledge extended, confirmed or proved wrong - including myself)
>

I'm off on holiday very shortly, so I'm going to save people from 
getting bored!

>>> It depends on how you define a stack. Bascially, a stack is a LIFO buffer.
>>> Being able to access elements on the stack that are not on top of the stack
>>> is not a requirement for being a stack.
>> That's true.  The requirements for a structure to be a "stack" are that
>> you can add something to the top of it, and you can take something off
>> the top (LIFO).
>
>> In practice, most stacks have other operations, such as detecting stack
>> overflow and underflow, or accessing data further down the stack
>> (obviously that's /very/ useful for a stack holding local data).
>
> Not just useful, but vital. A stack that's just a LIFO buffer is not suitable
> for holding local variables. It is, however, suitable for saving registers,
> so they are free to be used as local variables. But this limites the size of 
> locals.
>
>> The SPARC has 32 registers.  8 of them, %g0..%g7, are "normal" registers
>> in that they hold the same data independent of function calls.
>
>> Then you have "in" %i0 .. %i7, "local" %l0..%l7 and "out" %o0..%o7.
>> These form a 24-register window onto the large register stack.  When you
>> make a function call, this window moves 16 registers in the stack so
>> that the "in" registers point to the same register stack entries that
>> were "out" before, and the "local" and "out" registers point to new
>> registers.
>
> I'm not sure about the 32 registers. 32 simultaneously accessible, yes.
> so 32 register names to be used in instructions.
>
> However, the different access 'names' address changeing storage places.
>
> I dimly remember, that after a small number of 'rotations', you arrived on 
> the first
> set again, so the storage locations formed a ring buffer. If a buffer 
> over/underrun
> happened, an exception was triggered, and it was the job of my monitor 
> software
> to catch it and save/restore the freshly 'appearing' register contents 
> to/from a fixed
> location, so the 'stack' size was virtually limitless.
>
> Without this code, the similarity with a typical stack was spoiled.
>

I didn't know the register window rotated like that - perhaps it varies 
according to exactly which SPARC you use.  Of course, I haven't actually 
used any SPARCs - only a SPARC-like architecture (the original Altera NIOS).

>> You have a LIFO structure - it's a stack.
> But you also have a FIFO structure with a fixed storage size.
> (just like those chain storage buffers used for analog delays half a lifetime 
> ago)
>
>>> So the MSPs stack is also a hardware stack.
>
>> I'd call it a "software stack" if it is in main memory (as is the case
>> for the msp430), and "hardware stack" if it is in a dedicated hardware
>> structure.  But the difference can be a bit fuzzy.
>
> Indeed. The MSP has a dedicated PUSH operation, that utilizes R1 only,
> so it is no plain software stack (even if you could simulate it in software
> completely, with some loss of performance).
> Also, the interrupt handling is completely in hardware and there is no way
> to simulate it in software at all. YOu can simulate the call itself in 
> software,
> but there is no way to exactly simulate RETI, as a software simulation would
> expose the chance that you get a new interrupt before you execued the return
> from the last, which increases stack usage and is different from RETI.
> So it's a hardware-assisted software stack? :)
>

Ah, we have slightly different definitions here.  When I said a 
"hardware stack" has dedicated hardware, I was thinking of something 
like the stack in the PIC (or the register set on a SPARC) where the 
stack contents itself is in special hardware - not just that the 
processor has a dedicated stack pointer register.

>> This I have to challenge - either you are wrong, or I'm in danger of
>> learning something...
> I'm exposed to this risk all the time. :)
> Mos tof my knowledge comes from observation, not from reading books.
> Books are the second source when observation is not enough or gives
> ambiguous results when analyzed.
>
>>> Of course, if you define a stack as 'a stack is where local variables go',
>>> then you're right by definition. But it is NOT the only way. And other
>>> implementations, as scarce as they might be, do not automatically
>>> implement a stack.
>>> Take a look at vprintf(). It implements variable parameters without stack.
>>> What you can do explicitely in your code to use vprintf could be done by
>>> the compiler implicitely for printf.
>
>> vprintf is not a C variable argument function.  It is a function with
>> two parameters - one points to a format string, the other is a structure
>> holding information about a list of arguments.
>
>>> In fact, the typical implementation of printf just passes the current stack
>>> pointer to vprintf, where the parameters are handled completely
>>> independent of the storage location.
>
>> And where are the variable arguments stored?  On the stack.
>
> Here you lost the track. When I can turn the stack-stored variable parameter
> list passed to printf into a fixed parameter list for vprintf (without 
> moving/copying
> the data!), then there is no reason why I cannot just implement variable 
> parameter
> lists that way.
>
> Flex does it this way: the variable parameter part is passed as an array 
> object to the
> called function. Well, Flex is ActionScript and as a script language, the 
> usage of a
> stack for parameter passing is less obvious/desireable.
>
> But a compiler could as well take the variable parameters, store them in an
> allocated space of any kind, and pass apointer to this location as a single 
> parameter.
> That's basically what printf does before it calls vprintf.
> Whether the storage location was the stack (as the C compiler usually does) or
> somewhere else, is just an internal thing of the compiler.
>
>> If you /don't/ have a stack, where can you store them?  In some cases,
>> the compiler can determine in advance how many arguments there are and
>> how much space is needed - it can then store them in statically
>> allocated memory,
>
> The compiler always knows at compile-time. Only the called function does not 
> know
> how many parameters are coming. The calling function always knows.
> Sure, one could construct a case where the callign function pushes a variable
> number of parameters on the stack, based on runtime requirements.
> But this would require usage of inline assembly and is not in the scope
> of the C language. As it requires manually dealing with something (the stack)
> that is not in the scope of the C language at all.
>
> So for the called function, instead of implicitely using the stack pointer 
> for access
> to the variable parameter list, the compiler could just pass the poitner to a 
> fixed or
> dynamically allocated location, and the called function just uses this 
> pointer for access.
> Just a compiler implementation thing.
>

I see what you are getting at now.  I concede this point (for now, 
anyway :-)

But you still don't get to do recursion without a stack, or another data 
structure that is acting like a stack.

>>> Even recursion is doable without a stack. Yet I agree (and already did)
>>> that a stack is the easiest solution, so it is by far the most successful 
>>> one.
>
>> As you say, there is no doubt that a stack is the easiest way to hold
>> data for such code.  But I really am curious to know of any other
>> solution that does not boil down to a logical stack.
>
> A typical stack isn't suitable if you have structures where the called 
> function
> does not immediately return. Multi-treading/tasking is such a situation.
> Of course you can say 'every thread then has its own stack' and that is how
> it is usally handled. But if you follow this path to its end,
> you'll end up with as many stacks as you have data to store and then there
> is no more difference between a stack and a heap.
> Usually, stacks for new threads _are_ allocated on the heap dynamically.
> And even if you allocate them statically, or in hardware, what is it then?
> A LIFO with the ability to slice-out elements from locations within? :)
>

Efficient data structures for multi-threading is very difficult - as are 
structures to support things like co-routines which don't follow a nice 
simple LIFO system.

mvh.,

David


------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2dcopy2
_______________________________________________
Mspgcc-users mailing list
Mspgcc-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mspgcc-users

Reply via email to