View previous topic :: View next topic |
Author |
Message |
wirelessage
Joined: 08 Aug 2012 Posts: 34
|
loader.c code clarification |
Posted: Tue Apr 07, 2015 10:27 am |
|
|
My bootloader code started with the sample code provided by ccs.
While reviewing the code in loader.c , I am trying to understand the rationale for this CONDITION:
Code: | if (addr < LOADER_ADDR || addr > LOADER_END) && addr < 0x300000) |
what is the rationale to write to program memory if the addr is less than the LOADER_ADDR???
Code: |
#define LOADER_SIZE 0x5FF
#define LOADER_END 0x7FF
#define LOADER_ADDR LOADER_END-LOADER_SIZE
|
Shouldn't it always be:
Code: | if (addr > LOADER_END && addr < 0x300000)
|
I have a PIC18F2680... so 0x300000 is where the fuses are set.
--------------------------------------------------------------
I am referring to the following section of the code:
Code: | if (buffer[0] == ':') {
count = atoi_b16 (&buffer[1]); // Get the number of bytes from the buffer
// Get the lower 16 bits of address
l_addr = make16(atoi_b16(&buffer[3]),atoi_b16(&buffer[5]));
line_type = atoi_b16 (&buffer[7]);
addr = make32(h_addr,l_addr);
#if defined(__PCM__) // PIC16 uses word addresses
addr /= 2;
#endif
// If the line type is 1, then data is done being sent
if (line_type == 1) {
done = TRUE;
do_ACKLOD = TRUE;
#if defined(__PCM__)
} else if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < 0x2000){
#elif defined(__PCH__)
} else if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < 0x300000){
#endif
checksum = 0; // Sum the bytes to find the check sum value
for (i=1; i<(buffidx-3); i+=2)
checksum += atoi_b16 (&buffer[i]);
checksum = 0xFF - checksum + 1;
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Apr 07, 2015 12:40 pm |
|
|
I think you have an older version of the compiler. The latest version
uses getenv() to find the top of program memory:
Code: | #define LOADER_END getenv("PROGRAM_MEMORY")-1 |
The latest version has this:
Code: | if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < getenv("PROGRAM_MEMORY"))
|
That line just says to me: Don't overwrite the loader, and don't write
beyond the end of program memory.
Also, the latest version of loader.c puts the loader right up against
the end of Program Memory:
Code: | #define LOADER_END getenv("PROGRAM_MEMORY")-1
// Code in here sets the loader size. It's 0x3FF for PCH.
#define LOADER_ADDR LOADER_END-LOADER_SIZE
|
|
|
|
wirelessage
Joined: 08 Aug 2012 Posts: 34
|
|
Posted: Tue Apr 07, 2015 3:18 pm |
|
|
PCM Programmer:
My loader is at the top of the program memory. Loader is from 0x200 to 0x7FF in my case. In your example, it looks to be at the bottom of the program memory.
So, question that comes to my mind:
Should it matter if it is at the top or bottom of program memory?
If the loader is at the top of program memory (like my code):
it should be:
Code: | if( addr > LOADER_END && addr < 0x300000 ) | //PCH - PIC18F2680.
OR
Code: | if( addr > LOADER_END && addr < getenv("PROGRAM MEMORY") ) |
If the loader is at the bottom of program memory, it looks to me that the condition should be:
Code: | if( addr < LOADER_ADDR && addr < getenv("PROGRAM MEMORY") ) |
The "or" condition does not make sense to me. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19550
|
|
Posted: Wed Apr 08, 2015 1:43 am |
|
|
That is what the OR handles.
Think about it.
You need first to test that the address is <0x300000. Otherwise it is not writeable.
So if the address is less than this and is _either_ above the top of the loader (so handling a loader in the bottom of memory), _or_ below the bottom of the loader (for a loader at the top of memory), then the address is one that can be written. This is what the line as posted by PCM_programmer gives. Exactly right.
As written, it allows the loader to be _anywhere_ in memory. Top, bottom, middle etc., just blocking writes in the area where the loader sits. |
|
|
wirelessage
Joined: 08 Aug 2012 Posts: 34
|
|
Posted: Mon Apr 13, 2015 1:16 pm |
|
|
Thanks a lot guys!
Good discussion.
Regards. |
|
|
|