CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

PCD Hex has offset?

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Swys



Joined: 24 Feb 2010
Posts: 22

View user's profile Send private message

PCD Hex has offset?
PostPosted: Mon May 24, 2010 12:22 pm     Reply with quote

Hi all,

I am trying to write a wireless bootloader at the moment. I am using version 4.107 of the PCD compiler with a PIC24HJGP504.

Whenever I compile a program in MPLAB and I go to View -> Program Memory, I see that at the first memory location is a GOTO to 0x200 (as expected). But when I look at the HEX file, this GOTO points to 0x400, giving each address an offset of 0x200.

Can anyone tell me why this is, or give me a solution for this?
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Mon May 24, 2010 2:05 pm     Reply with quote

Are you sure that is not just the difference between byte addresses, and word addresses?.....

Best Wishes
Gary Smithson



Joined: 13 Feb 2004
Posts: 22

View user's profile Send private message Visit poster's website

PostPosted: Mon May 24, 2010 11:07 pm     Reply with quote

Ttelmah is correct. What you're seeing is the difference between the HEX file, which is always in terms of byte address, and the PIC24 which is in terms of word address.

I've just finished a PIC24 bootloader and hammered through these details. I can confirm that write_program_memory () and erase_program_memory () do work in version 4.107; but note that the parameters they require are word address rather than the byte addresses coming from the HEX file.

Gary
Swys



Joined: 24 Feb 2010
Posts: 22

View user's profile Send private message

PostPosted: Tue May 25, 2010 8:26 am     Reply with quote

Thanks for the replies guys.

So, will it be enough for me to just subtract 0x200 from each address in the HEX file, since that is the final difference between the HEX file address and the PIC word address? Or is there something I'm missing?

Gary, can you please send me your bootloader code so I can have a look at it?
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Tue May 25, 2010 8:36 am     Reply with quote

There is no offset.
The 'point' is that 0x200 _words_, is 0x400 _bytes_. Intel hex format, is always in bytes.
If you start subtracting things the result will just be wrong...
If you want to know the word address being referred to, you just have to divide the byte address by two.

Best Wishes
Gary Smithson



Joined: 13 Feb 2004
Posts: 22

View user's profile Send private message Visit poster's website

PostPosted: Tue May 25, 2010 8:49 am     Reply with quote

If you were to observe other addresses randomly in the HEX file you would find that it is not an offset of 0x200. The HEX address is = PIC address * 2. Take the address from the HEX file and divide it by 2 before passing it to write_program_memory ().

I do apologize but the bootloader source is owned by my customer and I am not able to share it.

Bootloaders usually share large portions of core functionality. If you search this forum there are likely good examples. Also, there should be examples installed by CCS in the Examples directory.

Gary
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Tue May 25, 2010 9:17 am     Reply with quote

Just a quick note. The other posters are right about dividing by two. But, unless the compiler is really good at optimization you really should shift right one bit instead of dividing by two. That is:

WordAddress = ByteAddress >> 1;

instead of

WordAddress = ByteAddress / 2;

It's a small thing... I mean, they both do the same thing. But if you are going to divide or multiply by a multiple of two then it's more efficient to shift.
Ttelmah



Joined: 11 Mar 2010
Posts: 19513

View user's profile Send private message

PostPosted: Tue May 25, 2010 9:31 am     Reply with quote

Yes.
However CCS, is actually 'good' at this optimisation, and if you ask it to divide an integer by two, it will just perform the shift. Doing it yourself though, is always 'safer'.

Best Wishes
Swys



Joined: 24 Feb 2010
Posts: 22

View user's profile Send private message

PostPosted: Wed May 26, 2010 12:40 am     Reply with quote

Great! Thank you all. I will implement this as soon as possible. I will put the address division in the software I will use to upload the firmware. I want the firmware to stay as generic as possible, so that I can use it with as little changes as possible whenever I use it with other PICs. But this leads to the following question:

Is it only the 16-bit PICs that use word addressing, or is this standard across the board?
Swys



Joined: 24 Feb 2010
Posts: 22

View user's profile Send private message

PostPosted: Wed May 26, 2010 12:45 am     Reply with quote

Wait, I guess that was a stupid question. Am I right when I say that:

8-bit PICs use 1 byte for addressing,
16-bit PICs use 2 bytes for addressing (i.e. divide HEX address by 2) and
32-bit PICs use 3 bytes for addressing (i.e. divide HEX address by 3) ?
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Wed May 26, 2010 2:54 am     Reply with quote

Quote:
32-bit PICs use 3 bytes for addressing (i.e. divide HEX address by 3) ?

What's your calculation? 32 / 8 = 3?
Swys



Joined: 24 Feb 2010
Posts: 22

View user's profile Send private message

PostPosted: Wed May 26, 2010 4:58 am     Reply with quote

Quote:
What's your calculation? 32 / 8 = 3?


Yes, is it correct for me to do it that way?
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Wed May 26, 2010 5:51 am     Reply with quote

Swys wrote:
Quote:
What's your calculation? 32 / 8 = 3?


Yes, is it correct for me to do it that way?


32/8 is 4 not 3
Swys



Joined: 24 Feb 2010
Posts: 22

View user's profile Send private message

PostPosted: Wed May 26, 2010 6:40 am     Reply with quote

Well now, that's quite embarrassing...

Anyway, yes, that's what I meant. But is it ok for me to do it that way...well, dividing by 4?

[Can't believe I missed that one...]
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group