AnsweredAssumed Answered

Download a function into ram and excute it on hcs12

Question asked by hongjian zhang on Nov 30, 2017
Latest reply on Dec 5, 2017 by Daniel Martynek

Our customer has a request on our bootloader, that is, the flash diver must not stored into the flash, it should download from can cummunication and then excute it to do flash download operation. I had noted that our community have some question about how to excute a function on ram, but they were all store into the flash, and when needed or program start, copy to ram, they are still store in flash.  what I need is when: excute compile, I can get a section of target file in ram. not place in flash.  and i have tried to do this, so I modified the prm file: use the ram as read-only type and place function in it, but I couldn't find any code in the ram place in the s19 file. 

 

The test main.c is like this:

 

#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */

#define TEST_OLD PT1AD_PT1AD3
#define TEST_TEMP PTR_PTR4
#define TEST_NEW PORTB_PB3

#define TEST_IO TEST_NEW

#pragma CODE_SEG ROM_INTO_RAM2
void Test(void)
{
static volatile unsigned int test_cnt;

test_cnt ++;
if (test_cnt > 40000)
{
test_cnt = 0;
TEST_IO = TRUE;
}
/*TEST_IO = FALSE;*/
}
#pragma CODE_SEG DEFAULT

void main(void)
{
/* put your own code here */
unsigned int cnt2;
EnableInterrupts;

DDR1AD_DDR1AD3 = TRUE;
DDRR_DDRR4 = TRUE;
DDRB_DDRB3 = TRUE;

for(;;)
{
Test();

if (cnt2 ++ > 30000)
{
cnt2 = 0;
TEST_IO = FALSE;
}
_FEED_COP(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}

 

and the prm file is as below:

 

/* This is a linker parameter file for the MC9S12HY64 */
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */

/* Register space */
/* IO_SEG = PAGED 0x0000 TO 0x03FF; intentionally not defined */

/* RAM */
RAM = READ_WRITE 0x3000 TO 0x3EFF;

RAM2 = READ_ONLY 0x3F00 TO 0x3FFF;

/* D-Flash */
DFLASH = READ_ONLY 0x010400 TO 0x0113FF;

/* non-paged FLASHs */
ROM_1400 = READ_ONLY 0x1400 TO 0x2FFF;
ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
/* VECTORS = READ_ONLY 0xFF00 TO 0xFFFF; intentionally not defined: used for VECTOR commands below */
//OSVECTORS = READ_ONLY 0xFF80 TO 0xFFFF; /* OSEK interrupt vectors (use your vector.o) */

/* paged FLASH: 0x8000 TO 0xBFFF; addressed through PPAGE */
PAGE_0C = READ_ONLY 0x0C8000 TO 0x0C93FF;
PAGE_0C_B000 = READ_ONLY 0x0CB000 TO 0x0CBFFF;
PAGE_0E = READ_ONLY 0x0E8000 TO 0x0EBFFF;
/* PAGE_0D = READ_ONLY 0x0D8000 TO 0x0DBFFF; not used: equivalent to ROM_4000 */
/* PAGE_0F = READ_ONLY 0x0F8000 TO 0x0FBEFF; not used: equivalent to ROM_C000 */
END

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
_PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
//.ostext, /* OSEK */
NON_BANKED, /* runtime routines which must not be banked */
COPY /* copy down information: how to initialize variables */
/* in case you want to use ROM_4000 here as well, make sure
that all files (incl. library files) are compiled with the
option: -OnB=b */
INTO ROM_C000/*, ROM_1400, ROM_4000*/;

DEFAULT_ROM INTO PAGE_0C, PAGE_0C_B000, PAGE_0E;

ROM_INTO_RAM2 INTO RAM2;
//.stackstart, /* eventually used for OSEK kernel awareness: Main-Stack Start */
SSTACK, /* allocate stack first to avoid overwriting variables on overflow */
//.stackend, /* eventually used for OSEK kernel awareness: Main-Stack End */
DEFAULT_RAM INTO RAM;

//.vectors INTO OSVECTORS; /* OSEK */
END

ENTRIES /* keep the following unreferenced variables */
/* OSEK: always allocate the vector table and all dependent objects */
//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart
END

STACKSIZE 0x100

VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */
//VECTOR 0 Entry /* reset vector: this is the default entry point for an Assembly application. */
//INIT Entry /* for assembly applications: that this is as well the initialization entry point */

Outcomes