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

library problem with boot sector

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



Joined: 31 Jul 2018
Posts: 8

View user's profile Send private message

library problem with boot sector
PostPosted: Tue Jun 11, 2019 6:11 am     Reply with quote

I'm trying to create a boot sector (uodate software with serial line).
I wrote several simple routines to see how they are put in the final code and to see if the boot sector contains only the software required.
The problem is that I use the math.h library (outside the boot block) and on the listing file I see a long sequence of DATA that is from the math.h library.
I see that in the math.h library there are 4 arrays of numbers that are not declared as constant, and are
double pas_64[5] line 1474 of math.h
double pas_64[5] line 1477 of math.h
double pat_64[6] line 1690 of math.h
double pat_64[6] line 1693 of math.h

If I add the const keyword to all of them (double const pas_64[5]) the DATAs are moved outside the boot sector.

I don't understand why the compiler, that understand that the arrays are constant numbers because put them in the FLASH section of memory, put the arrays in the boot sector if const is not present and outside the boot sector in const is present.

This behaviour is dangerous, because I have a part of a library inside a boot sector, that never changes during software update, and the boot sector is larger than I need.

How can I do to force the compiler to put in the ORG section only the code that I need? I don't want to change a standard library to work properly...

The problem is present also if I include the library without using it at all.

I use the 5.074 version of the compiler

Thank You

Fabrizio Borra - Lupo srl
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Tue Jun 11, 2019 6:38 am     Reply with quote

The compiler does _not_ "understand that the arrays are constant numbers because put them in the FLASH section of memory".

Remember that a non constant variable that is initialised 'with' a value, has
to have that initialisation value stored somewhere. It is this value
that you are seeing stored in the flash. Not the actual variable.

Now it is actually slightly wasteful, that these values that can be constants
are not being actually used from flash. However Accessing RAM is quicker,
which is probably why this is done. If your #ORG that says to avoid the
boot area, is used before the math library is loaded, and includes the 'default'
keyword, the maths definitions are merrily moved up as required.
lupoccs



Joined: 31 Jul 2018
Posts: 8

View user's profile Send private message

PostPosted: Tue Jun 11, 2019 8:30 am     Reply with quote

This is my code.
It makes no sense, because is only a code to "fill" the memory to check the addresses of the function inside and outside the boot sector
The code below is the original with the boot DATA inside

I moved the
Code:

#include <mymath.h>
after
#org default

but nothing changes in the boot sector

What is my mistake?

Thank You
Code:

#define DEBUG               0
//  #define DEBUG             1

#define INIBOOT  0x15000 // boot sector address
#define ENDBOOT  0x157EB // boot sector end

#include <33EP128MC206.h>
#if (DEBUG == 1)
  #device ICD=TRUE
  //#device ICD=ICSP2
  #device ICSP=2
  #FUSES NOPROTECT                //  Code protected from reads
#else
  #FUSES PROTECT                //  Code protected from reads
  #FUSES CKSFSM                 //  Clock Switching is enabled, fail Safe clock monitor is enabled
#endif
#FUSES NOWRT                    //  Program Memory Not Write Protected
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOJTAG                   //JTAG disabled
#FUSES CKSFSM                   //Clock Switching is enabled, fail Safe clock monitor is enabled

#use delay(clock=140MHz,crystal=8MHz,restart_wdt)

#include <mymath.h>

#define N_BYTE_USB_BUFFER   100 //numero byte USB_buffer a 8 bit

#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C5
#use i2c(MASTER, RESTART_WDT, I2C1, sda=EEPROM_SDA, scl=EEPROM_SCL,FAST=400000, stream=PER_1 )

void main1loop(void);
int16 divide(int16 uno, int16 due);

const int16 tablinquad[33] = {0,313,625,938,1250,1563,1875,2188,2501,2813,3126,3438,3751,4063,4376,4689,5001,5314,5626,5939,6252,6564,6877,7189,7502,7814,8127,8440,8752,9065,9377,9690,10000};

char USB_Buffer[N_BYTE_USB_BUFFER];
int inbuffer_USB;
int outbuffer_USB;
int nbytebuffer_USB;

#ORG INIBOOT - 10, INIBOOT -1
void main_start()
{
   main1loop();
}

#ORG INIBOOT, ENDBOOT default

int16 moltiplica(int16 uno, int16 due);

void main(void)
{
   int16 pippo = 0;
   int16 pluto;
   int16 vari1;
   int16 vari2;
   int16 dimerase;
   int16 dimwrite;
   int32 address;
   int32 nextaddress;
   int8 buffer[32];
   int datimiei[48];

   output_high(PIN_B2);
   
   for (pluto = 0; pluto < N_BYTE_USB_BUFFER; pluto++)
   {
      USB_Buffer[pluto] = 0;
   }
   inbuffer_USB = 0;
   outbuffer_USB = 0;
   nbytebuffer_USB = 0;
   address = 0;
   nextaddress = 0;

   dimerase = getenv("FLASH_ERASE_SIZE");
   dimerase /= 2;
   dimwrite = getenv("FLASH_WRITE_SIZE");
   
   for(pluto = 0; pluto < 48; pluto++)
   {
      datimiei[pluto] = 0;
   }
   pippo = 0;
   pluto = 0;

   for(pluto = 0; pluto < 32; pluto++)
   {
      buffer[pluto] = 0xAA;
   }

   while(TRUE)
   {
      pippo++;
      if(pippo >= 30)
      {
         pippo = 0;
         main_start();
      }
      pluto = tablinquad[pippo];
      vari1 = moltiplica(pippo,pluto);
      vari2 = divide(pippo,pluto);
   }
}

int16 moltiplica(int16 uno, int16 due)
{
   int16 variab;
   variab = uno * due;
   return variab;
}

#ORG default


int16 divide(int16 uno, int16 due)
{
   float TempFloat;
   int16 variab;
   
   TempFloat = ((float)110 * PI) / 180;
   TempFloat = ((((((float)(100)) / 100) * 3999) / 3) * (1 + (cos(TempFloat) / cos(1.0471975512 - TempFloat))));
   
   variab = uno * due;
   return variab;
}

void main1loop(void)
{
   char pippo;
   
   pippo = ' ';
}
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jun 11, 2019 9:26 am     Reply with quote

This thread has a big discussion of placement of constants in flash memory:
http://www.ccsinfo.com/forum/viewtopic.php?t=54956
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Tue Jun 11, 2019 10:36 am     Reply with quote

and the ORG statement, needs to be specifying the range to use as well
as 'default'. #ORG default on it's own just sets the ORG back to normal
with nothing at all reserved.

You need this statement:
#ORG INIBOOT, ENDBOOT default

before you load the math.h library. Then math.h, and your main will both
be placed in the memory you want.
lupoccs



Joined: 31 Jul 2018
Posts: 8

View user's profile Send private message

PostPosted: Wed Jun 12, 2019 1:54 am     Reply with quote

You are right, if I put the math library after ORG with iniboot endboot default both main and math library are in the boot sector, but my question was different.
I don't want math library in the boot sector, and my original program leave this library outside the boot sector, but I want to know how to leave outside the boot sector also the constants to initialize the RAM array inside the math library. You said that the constants used to initialize the math array in RAM must be stored "somewhere", I want to know how to do in order to make this "somewhere" outside the boot sector.
Thank You.
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Wed Jun 12, 2019 5:00 am     Reply with quote

The point is that you can put the math code anywhere you want.

Just an #ORG START,END default

Then load 'math.h', and the ORG will specify where this is to be put.
lupoccs



Joined: 31 Jul 2018
Posts: 8

View user's profile Send private message

PostPosted: Thu Jun 13, 2019 2:31 am     Reply with quote

I tried successfully to put the math.h in a specific flash range with an #ORG START,END default , but the constants to initialize the array still remains in the boot sector.....

Thank You
temtronic



Joined: 01 Jul 2010
Posts: 9244
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Jun 13, 2019 5:02 am     Reply with quote

Maybe I'm totally wrong but...
Do you TOTALLY erase the PIC before programming it? Do you CONFIRM the PIC is 100% erased ? I know the programming device/ap can be set to NOT erase 'blocks' of memory so I'm wondering if the data in the 'boot block' , is really 'left over' from a previous attempt ?

Just trying to help eliminate possible causes.

Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19545

View user's profile Send private message

PostPosted: Thu Jun 13, 2019 8:03 am     Reply with quote

If you want the compiler to not put anything in the bottom of memory, then
#build the code with the start address set above this. Otherwise, no matter
where you 'locate' the other code components, the compiler is always going
to consider all of the memory as being available.
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