SV: SV: [Icc-avr] Bootloader problem
Steven Lose
sl at ecpower.dk
Thu Nov 1 01:51:07 PST 2007
Hi.
You're right; I'm not a native English speaker too. ;o)
But an extra cast may be needed in front of tmpLo:
uint8_t tmpLo = RxChar();
uint8_t tmpHi = RxChar();
PageAddressHigh = (uint16_t)tmpLo | (((uint16_t) tmpHi) << 8);
And if this is 1000 lines below the define of PageAddressHigh, you might be unsure. "Did I declare it as char or int?"
That's why I always use letters in front to remind me
Unsigned int uiPageAddressHigh
Med venlig hilsen / Best regards / mit freundlichen Grüßen
EC POWER A/S
Steven Lose
Software Ingeniør
Tlf.: +45 87434100
Direkte tlf. +45 58286608
Email: sl at ecpower.dk
www.ecpower.dk
-----Oprindelig meddelelse-----
Fra: icc-avr-bounces at imagecraft.com [mailto:icc-avr-bounces at imagecraft.com] På vegne af David Brown
Sendt: 1. november 2007 09:27
Til: Discussion list for ICCAVR and ICCtiny Users. You do NOT need tosubscribe to icc-announce if you are a member of this.
Emne: Re: SV: [Icc-avr] Bootloader problem
(Rant - could people please not post hideous html emails on mailing
lists like this? Plain text email works much better, and makes it
easier to track attributions and quotations from different posters.)
C does not *execute* from left to right. It *parses* from left to
right, but the order of expressions within a sequence is not guaranteed
in any way. The concept to understand here is "sequence points". The
various expressions and statements of your program are separated by
these sequence points, and the compiler's generated code preserves the
order at each point. Thus all source code before a sequence point is
executed before the given point, and none of the code from after that
point has run. (Note that we are talking about the code's effect on the
C virtual machine - optimising can re-order or change the code at any
time, as long as it *acts* the same in the end.)
Important sequence points are the ";" at the end of statements, just
before a function call or return, and at the && and || operators. Other
operators do not have sequence points, and there are no sequence points
when evaluating function parameters.
Thus the code:
(A && B)
will first evaluate A, then B (assuming that A evaluated to non-zero).
However, the code
(A + B)
can evaluate A first, or B first - the order is not determined, as there
is no sequence point.
Similarly,
foo(A, B)
may evaluate A or B first. You might have come across this with
examples like "foo(i, i++)" being undefined in C, since the order of
evaluation is not specified.
Thus the code:
PageAddressHigh = RxChar() + (RxChar() << 8);
is wrong.
A good way to write this, ensuring that evaluation order is correct and
is clear from the code, is:
uint8_t tmpLo = RxChar();
uint8_t tmpHi = RxChar();
PageAddressHigh = tmpLo | (((uint16_t) tmpHi) << 8);
mvh.,
David
Steven Lose wrote:
> Hi Sylvian.
>
>
>
> C executes from left to right, so #1 will be executes first.
>
>
>
> Just like this:
>
>
>
> If( ucCount && --!ucCount)
>
> {
>
> }
>
>
>
> Will detect the transition from non zero to zero
>
>
>
> But, is it readable?
>
> I avoid it and make an extra line, then it is clear what happens.
>
>
>
> Hence you ask, it is not clear what is happening, and then it is best to
> avoid it.
>
> Or as some would says, if you read some code and have to stop at a line
> and use time to understand what is happening, then it is not clear enough.
>
>
>
> Med venlig hilsen / Best regards / mit freundlichen Grüßen
>
> *EC POWER A/S*
>
> *Steven Lose*
>
> Software Ingeniør
>
> Tlf.: +45 87434100
>
> Direkte tlf. +45 58286608
>
> Email: sl at ecpower.dk <blocked::mailto:bsl at ecpower.dk>
>
> www.ecpower.dk <http://www.ecpower.dk>
>
> ------------------------------------------------------------------------
>
> *Fra:* icc-avr-bounces at imagecraft.com
> [mailto:icc-avr-bounces at imagecraft.com] *På vegne af *Sylvain Bissonnette
> *Sendt:* 1. november 2007 03:44
> *Til:* Discussion list for ICCAVR and ICCtiny Users. You do NOT
> needtosubscribetoicc-announce if you are a member of this.
> *Emne:* Re: [Icc-avr] Bootloader problem
>
>
>
> Hi Rodney,
>
>
>
> Thanks for your email that can not be more clear! a last question,
> if I have
>
>
>
> PageAddressHigh = RxChar() + (RxChar() << 8);
>
> #1 #2
>
>
>
> witch one of the 2 RxChar() will be execute first?
>
>
>
> Thanks
>
> Sylvain
>
>
>
>
>
> ----- Original Message -----
>
> *From:* Rodney Pearson <mailto:rodney at junipersys.com>
>
> *To:* Discussion list for ICCAVR and ICCtiny Users. You do NOT
> needtosubscribeto icc-announce if you are a member of this.
> <mailto:icc-avr at imagecraft.com>
>
> *Sent:* Wednesday, October 31, 2007 9:01 AM
>
> *Subject:* RE: [Icc-avr] Bootloader problem
>
>
>
> Sylvain -
>
>
>
> To repeat what John mentioned in his email and to answer your question:
>
>
>
> 1 - Make a copy of init.s (found in ICCAVR/libsrc.avr). Name it
> something like 'initboot.s'
>
> 2 - Make a copy of the appropriate crtbootXXX.s file based on the
> device (found in ICCARV/libsrc.avr). Name it whatever makes sense.
>
> 3 - Edit the new crtboot.s file to include the 'initbot.s'
>
> 4 - Edit the 'initboot.s' to only set up the HW & SW stack
> pointers. Remove unneeded code.
>
> 5 - Open the new crtboot.s (if not already open) in ICCAVR
>
> 6 - Go to File->Compile File->Start Up File to Object. This will
> gernerate a new *.o library with the same name as the crtboot.s file.
>
> 7 - Copy the new startup library to the library directory (ICCAVR/lib)
>
> 8 - You will need to tell the compiler to use the new startup
> library when building the bootloader:
>
> A - Go to Compiler
> Options->Target->Advanced->Non-default Startup
>
> B - Enter in the name of the new startup library
> (include the .o extension)
>
> C - Perform a "Rebuild All" to force the compiler to
> perform a clean build and use the new library (not technically
> necessary, but I've found that the
>
> compiler will sometimes not use the new library
> until it needs to perform a clean build.)
>
> 9 - You should be good to go.
>
> 10 - You can verify that the new startup library code is included by
> looking at the output listing and comparing it the changes you made
> in the 'initboot.s' file
>
>
>
> See the ICCAVR help "Startup File" for a bit more explanation on the
> startup code and how to use it.
>
>
>
> Cheers!
>
>
>
> Rodney Pearson
>
> Software Engineer
>
> Juniper Systems, Inc.
>
> www.junipersys.com
>
>
>
> ------------------------------------------------------------------------
>
> *From:* icc-avr-bounces at imagecraft.com
> [mailto:icc-avr-bounces at imagecraft.com] *On Behalf Of *Sylvain
> Bissonnette
> *Sent:* Tuesday, October 30, 2007 5:47 PM
> *To:* Discussion list for ICCAVR and ICCtiny Users. You do NOT
> needtosubscribetoicc-announce if you are a member of this.
> *Subject:* Re: [Icc-avr] Bootloader problem
>
>
>
> Hi Rodney,
>
>
>
> Hmmm, it's 256 word, 256k for a bootloader is a little big, If
> I modify the init.s what I must do to say to the
>
> compiler to use my init.s and not the original one?
>
>
>
> Thanks
>
> Sylvain
>
> ----- Original Message -----
>
> *From:* Rodney Pearson <mailto:rodney at junipersys.com>
>
> *To:* Discussion list for ICCAVR and ICCtiny Users. You do NOT
> needtosubscribeto icc-announce if you are a member of this.
> <mailto:icc-avr at imagecraft.com>
>
> *Sent:* Tuesday, October 30, 2007 4:37 PM
>
> *Subject:* RE: [Icc-avr] Bootloader problem
>
>
>
> Hi Sylvain -
>
>
>
> I'm assuming you meant 256 bytes, not 256k? (words? Bytes?)
>
>
>
> Either way you can save space in the start up file be removing
> the code that initializes the memory of SRAM (assuming you are
> not using SRAM in the same manner as "normal" application
> code). Take a look in the init.s startup file - that is where
> the initialization code is located. It is in Assembly.
>
>
>
> Cheers!
>
>
>
> Rodney Pearson
>
> Software Engineer
>
> Juniper Systems, Inc.
>
> www.junipersys.com
>
>
>
> ------------------------------------------------------------------------
>
> *From:* icc-avr-bounces at imagecraft.com
> [mailto:icc-avr-bounces at imagecraft.com] *On Behalf Of *Sylvain
> Bissonnette
> *Sent:* Tuesday, October 30, 2007 3:42 PM
> *To:* Discussion list for ICCAVR and ICCtiny Users. You do NOT
> needtosubscribetoicc-announce if you are a member of this.
> *Subject:* [Icc-avr] Bootloader problem
>
>
>
> Hi,
>
>
>
> I'm currently working on my MegaLoad bootloader and I want
> to fit this one in 256k size. when compiling
>
> I get not large enough... I need only couple of byte more. I
> don't use any interrupt, is there some way to
>
> get a bit more maybe in the startup file? but I never had work
> with the startup and I don't really now how
>
> to do this. Any help will be welcome.
>
>
>
> Thanks
>
> Sylvain Bissonnette
>
>
_______________________________________________
Icc-avr mailing list
Icc-avr at imagecraft.com
http://dragonsgate.net/mailman/listinfo/icc-avr
More information about the Icc-avr
mailing list