>> 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