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

Forcing a boot loader live in a restricted address range

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



Joined: 15 May 2010
Posts: 10

View user's profile Send private message

Forcing a boot loader live in a restricted address range
PostPosted: Sat Sep 18, 2010 8:47 pm     Reply with quote

I want to have the compiler bomb out when a boot loader I'm currently
developing exceeds 1K in size. The boot loader occupies 0x0000 to 0x3FF
and I'd like the compiler to throw an error if the size of the boot loader
exceeds 1024 bytes.

I tried to use:

Code:

#pragma org 0x0400,0x3FFF {}


to reserve all program memory except the bottom 1024 bytes, but the CCS compiler complains as follows:

Code:


CCS PCM C Compiler
Registered to: Stephen Rodgers
bloader
in /home/srodgers/projects/notfree/pic-projects/bootloader/
 
Compiling:  bloader.c
1 Errors,  0 Warnings,  Time: 2 Seconds
Error[300]   bloader.c 17 : More info:   Segment at 00000-007FF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 00800-00FFF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 01000-017FF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 01800-01FFF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 02000-027FF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 02800-02FFF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 03000-037FF (0000 used)
Error[300]   bloader.c 17 : More info:   Segment at 03800-03FFF (0000 used)
Error[300]   bloader.c 17 : More info:   Attempted to create: 00400-03FFF  for #org
Error[126]   bloader.c 17 : Invalid ORG range
      1 Errors,  0 Warnings.


Additional data:

Processor: PIC16F1938
CCS compiler 4.108 for Linux

Code snippet from boot loader:

Code:

/*
/ Boot loader program
*/

#include <16F1938.h>
#pragma reserve 0x16C:0x16F
#pragma nolist
#include <stdlib.h>
#pragma list
#pragma fuses HS, PLL, WDT, PUT, NOLVP
#pragma use delay(clock=32Mhz, restart_wdt)
#pragma use fast_io(ALL)
#pragma use rs232(baud=57600, UART1, ERRORS, RESTART_WDT)

#include "bootloader.h"

#pragma org 0x0400,0x3FFF {}


PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Sep 19, 2010 6:31 pm     Reply with quote

What's in bootloader.h ?
What are your defined values for LOADER_START and LOADER_SIZE ?
hwstar



Joined: 15 May 2010
Posts: 10

View user's profile Send private message

PostPosted: Tue Sep 21, 2010 10:25 am     Reply with quote

bootloader.h contains #defines for TOTAL_PROGRAM_MEMORY LOADER_START, LOADER_SIZE, APP_START, and APP_SIZE

Here's what's in bootloader.h

Code:

#define TOTAL_PROGRAM_MEMORY 0x4000
#define LOADER_START 0x0000
#define LOADER_SIZE  0x400
#define APP_START  LOADER_SIZE
#define APP_SIZE (TOTAL_PROGRAM_MEMORY - LOADER_SIZE)


Give the above bootloader.h constants, the #pragma org statement actually reads as follows in bloader.c:

#pragma org APP_START, TOTAL_PROGRAM_MEMORY-1 {}

What I'm attempting to do is to exclude the use of 0x0400 to 0x3FFF by the boot loader program.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Sep 21, 2010 12:01 pm     Reply with quote

Quote:
the #pragma org statement actually reads as follows in bloader.c:

I can't find any CCS file called bloader.c.
I need a compilable program so I can attempt to solve the problem.
Make it as short as possible. Don't post CCS files that I already have.
I need to be able to copy and paste your program into an MPLAB project
so I can study the problem.
hwstar



Joined: 15 May 2010
Posts: 10

View user's profile Send private message

PostPosted: Tue Sep 21, 2010 7:39 pm     Reply with quote

Ok, I reduced it down to this:
Code:

#include <16F1938.h>
#pragma fuses HS, PLL, WDT, PUT, NOLVP
// Clock speed
#pragma use delay(clock=32Mhz, restart_wdt)
#define TOTAL_PROGRAM_MEMORY 16384              // Number of words of program memory (2x words) PIC16F1938
#define LOADER_SIZE     0x400                   // Loader size in words
#define APP_SIZE (TOTAL_PROGRAM_MEMORY - LOADER_SIZE)

#pragma org LOADER_SIZE, TOTAL_PROGRAM_MEMORY -1 {} /*** Remove this and it compiles perfectly! ***/

// Top level

main()
{
        for(;;);
}

/*
* END
*/




Additional note: Adding a #pragma org 0 before the address range excluded reduces the number of error messages to 1 and you only get:

Code:

Error[126]   bloader.c 191 : Invalid ORG range  Reset vector is at 0x0000
      1 Errors,  0 Warnings.



What I'm trying to do is reserve most of the program memory for the
app, and if the boot loader gets too large, I want it to fail in the compilation process.


Steve.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Sep 22, 2010 10:02 pm     Reply with quote

It took me a while to remember what this one was. The answer is that
you have to block off the memory with one #org statement per ROM
page. See the program below.

I tested the following program with vs. 4.112. If I uncomment the last
delay_cycles(1), which is a NOP, the compiler will give an "Out of Rom"
error.
Code:

#include <16F1938.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

// Prevent the compiler from using any ROM above the first 1K.
#org 0x0400, 0x07FF {}  // Rom page 0 (upper half only)
#org 0x0800, 0x0FFF {}  // Rom page 1 (2K words)
#org 0x1000, 0x17FF {}  // Rom page 2 (2K words)
#org 0x1800, 0x1FFF {}  // Rom page 3 (2K words)
#org 0x2000, 0x27FF {}  // Rom page 4 (2K words)
#org 0x2800, 0x2FFF {}  // Rom page 5 (2K words)
#org 0x3000, 0x37FF {}  // Rom page 6 (2K words)
#org 0x3800, 0x3FFF {}  // Rom page 7 (2K words)


//==========================================
void main()
{
float a, b, c;

printf("Hello World\n\r");
printf("abcdeghijklmnopqrstuvwxyz\n\r");
printf("0123456789ABCDEF\n\r");

c = a * b;
c = a / b;
c = a + b;
c = a - b;

c = a * 1.234;
c = a / 1.234;
c = a + 1.234;
c = a - 1.234;

c = a * a;

delay_cycles(1);
//delay_cycles(1);


while(1);
}
hwstar



Joined: 15 May 2010
Posts: 10

View user's profile Send private message

PostPosted: Thu Sep 23, 2010 12:20 pm     Reply with quote

Thanks for the tip. Will try it this evening.

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