Hi,

static is also good for initialising recursively with zero/null,
because a static delaration without explicit initialisation means 
recursively initialisation with zero/null.
That's good for initialisation of big objects, e. g. of type pthread_t.

Regards,

Rolf

mspgcc-users@lists.sourceforge.net schrieb am 04.11.05 18:02:26:
> 
> >> that people can't really get the hang of. static is even worse.
> 
> That's because it has TWO meanings, depending on context:
>    "private to this file" and "don't store on stack - store in a fixed RAM 
> location."
> 
> The initialisation & recursion etc issues caused by the second usage also 
> cause problems!
> 
> Isn't C wonderful? :)
> 
> Richard
> 
> 
> ----- Original Message ----- 
> From: "Steve Underwood" <ste...@coppice.org>
> To: <mspgcc-users@lists.sourceforge.net>
> Sent: Friday, November 04, 2005 3:16 PM
> Subject: Re: [Mspgcc-users] Attn Steve Underwood, mspgcc online manual 
> section 7, "tips and tricks", opinions and questions
> 
> 
> > Kris Heidenstrom wrote:
> >
> >>Hi all,
> >>
> >>I couldn't find an email address for Steve Underwood, who wrote the very 
> >>good online manual for mspgcc, so I'm posting
> >>this message on the mspgcc-users forum (even though I'm not a user :-)
> >>
> >>In response to the "tips and trick [sic] for efficient programming" 
> >>section. I agree with most of these recommendations
> >>and thank you for a good quality piece of work. I think some explanations 
> >>would be appropriate, rather than just the
> >>guidelines. I have specific comments on a few points:
> >>
> >>
> >>>5. Avoid using global variables of small size - it is a waste of RAM.
> >>>
> >>
> >>I don't understand this at all. It's normal for an embedded program to 
> >>have lots of global variables, and many of these
> >>will be bytes. If you mean what you wrote, I disagree and I don't see your 
> >>point. If you mean something else, perhaps
> >>you could make the wording clearer. By "small size" do you mean smaller 
> >>than a byte?
> >>
> > Have you looked at the typical embedded programmer's work? 90% of all 
> > their variable are global. It derives from poor assembly language 
> > programming, I guess, and the style is carried over to poor C programming.
> >
> >>>6. Avoid using volatiles, unless they are really necessary.
> >>>
> >>
> >>No one would ever declare a variable volatile unless there was a good 
> >>reason to. Are you saying that the compiler can
> >>optimise better with variables which aren't volatile? That's normal for 
> >>any compiler AFAIK.
> >>
> > Do you have any idea how small a percentage of embedded C programmers 
> > understand what volatile really means, and where it is needed?
> >
> > Lots of people who have used the IAR tools complain about GCC being 
> > broken, because changes to a global are not sensed. The IAR compiler is 
> > too dumb to optimise away most things, and you can be sloppy and leave out 
> > all the volatiles. Most programmers do. At the other extreme, some people 
> > put volatile in front of everything. That looses you a lot of space and 
> > speed optimisation with GCC.
> >
> > const is another important keyword, especially for embedded systems, that 
> > people can't really get the hang of. static is even worse.
> >
> >>>7. Use int instead of char or unsigned char if you want an 8 bit integer.
> >>>
> >>
> >>What? An unsigned char _is_ 8 bits wide. Do you mean the case where you 
> >>need eight bits _plus sign_? That would be a
> >>9-bit integer.
> >>
> > If you use a char or unsigned char as a simple small integer, like a loop 
> > counter, the code will be bigger and slower than using the natural integer 
> > of the machine - an int. Perhaps I use expand the wording there.
> >
> >>>18. If you execute
> >>>    while ((long) a & 0x80000l);
> >>>    the program will hang, unless 'a' is declared volatile. So, do it!
> >>>
> >>
> >>That would be a really weird and pointless thing to write, unless you 
> >>_know_ that 'a' is volatile and _will_ be changed
> >>elsewhere, e.g. by an interrupt handler. And I think you mean "So, _don't_ 
> >>do it!"
> >>
> > Maybe the wording could be better. My intention by "do it" is do declare 
> > the thing volatile. I should change the order too, to group this with 
> > other volatile related points.
> >
> >>>19. Delay loops are very sophisticated routines.
> >>>[...]
> >>>
> >>
> >>I don't think delay loops are necessarily "poor programming style" in the 
> >>context of an embedded system where the MCU
> >>clock frequency is known and the device has a (fairly) predictable number 
> >>of cycles per instruction. If you want to
> >>delay by a few microseconds, a loop is the obvious way - you could use a 
> >>timer (if you have one spare), with or without
> >>an interrupt, but this would add lots of overhead, and a very short tight 
> >>delay would not be achievable. True the
> >>maximum execution time is not defined if interrupts are used and 
> >>interrupts are enabled during the loop, but this is
> >>often not the case - it depends on the context in which the code is used. 
> >>In any case, it's not always necessary to have
> >>a maximum limit on the delay time - for a safety timeout, for example, 
> >>it's just necessary to avoid getting stuck
> >>forever in a loop somewhere due to some hardware failure. Instead of 
> >>saying words to the effect of "don't do it", you
> >>could suggest how to trick the compiler into not optimising the loop away 
> >>into the ether. For example, adding an
> >>"asm("nop")" (or mspgcc's equivalent) in the body of the loop might be 
> >>enough; if there's no recommendable way to do
> >>this, perhaps you should add a feature to the compiler to specifically 
> >>support short delays, e.g. it could generate the
> >>loop itself, given a number of CPU cycles for the delay. Short delay loops 
> >>are common in embedded systems software; some
> >>conventions that apply to other programming situations apply less or not 
> >>at all to an embedded system. Just a
> >>suggestion.
> >>
> > Delay loops are often the only appropriate way to get a small predictable 
> > delay. There's nothing wrong with that. There is something wrong with
> >    for (i = 0;  i < 10;  i++);
> > GCC will optimise it clean away, unless i is a global volatile. Even if i 
> > a global volatile, the speed of the loop is totally uncertain. The 
> > brief_pause routine I show in the manual is what I would call a good pause 
> > routine - compact and basically predictable. Sure, and interrupt could 
> > extend it, but these things are usually there to impose a well defined 
> > minimum delay. Adding _NOP() is wasteful - maybe only a little, but still 
> > poor style when you are programming a 1k chip.
> >
> >>
> >>>Do not do anything unless you know what you're doing :)
> >>>
> >>
> >>Very good advice for all embedded systems programmers!
> >>
> >>
> > Steve
> >
> >
> >
> > -------------------------------------------------------
> > SF.Net email is sponsored by:
> > Tame your development challenges with Apache's Geronimo App Server. 
> > Download
> > it for free - -and be entered to win a 42" plasma tv or your very own
> > Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
> > _______________________________________________
> > Mspgcc-users mailing list
> > Mspgcc-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/mspgcc-users
> >
> > 
> 
> 
> 
> -------------------------------------------------------
> SF.Net email is sponsored by:
> Tame your development challenges with Apache's Geronimo App Server. Download
> it for free - -and be entered to win a 42" plasma tv or your very own
> Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
> _______________________________________________
> Mspgcc-users mailing list
> Mspgcc-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users



Reply via email to