STM8L15x Standard Peripherals Drivers
|
Functions to be executed from RAM
Functions to be executed from RAM. More...
Functions to be executed from RAM.
=============================================================================== Functions to be executed from RAM =============================================================================== All the functions defined below must be executed from RAM exclusively, except for the FLASH_WaitForLastOperation function which can be executed from Flash. Steps of the execution from RAM differs from one toolchain to another: - For Cosmic Compiler: 1- Define a segment FLASH_CODE by the mean of " #pragma section (FLASH_CODE)". This segment is defined in the stm8l15x_flash.c file. 2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8l15x.h file, or define it in Cosmic compiler preprocessor to enable the FLASH_CODE segment definition. 3- In STVD Select Project\Settings\Linker\Category "input" and in the RAM section add the FLASH_CODE segment with "-ic" options. 4- In main.c file call the _fctcpy() function with first segment character as parameter "_fctcpy('F');" to load the declared moveable code segment (FLASH_CODE) in RAM before execution. 5- By default the _fctcpy function is packaged in the Cosmic machine library, so the function prototype "int _fctcopy(char name);" must be added in main.c file. - For Raisonance Compiler 1- Use the inram keyword in the function declaration to specify that it can be executed from RAM. This is done within the stm8l15x_flash.c file, and it's conditioned by RAM_EXECUTION definition. 2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8l15x.h file, or define it in Raisonance compiler preprocessor to enable the access for the inram functions. 3- An inram function code is copied from Flash to RAM by the C startup code. In some applications, the RAM area where the code was initially stored may be erased or corrupted, so it may be desirable to perform the copy again. Depending on the application memory model, the memcpy() or fmemcpy() functions should be used to perform the copy. � In case your project uses the SMALL memory model (code smaller than 64K), memcpy()function is recommended to perform the copy � In case your project uses the LARGE memory model, functions can be everywhere in the 24-bits address space (not limited to the first 64KB of code), In this case, the use of memcpy() function will not be appropriate, you need to use the specific fmemcpy() function (which copies objects with 24-bit addresses). - The linker automatically defines 2 symbols for each inram function: � __address__functionname is a symbol that holds the Flash address where the given function code is stored. � __size__functionname is a symbol that holds the function size in bytes. And we already have the function address (which is itself a pointer) 4- In main.c file these two steps should be performed for each inram function: � Import the "__address__functionname" and "__size__functionname" symbols as global variables: extern int __address__functionname; // Symbol holding the flash address extern int __size__functionname; // Symbol holding the function size � In case of SMALL memory model use, Call the memcpy() function to copy the inram function to the RAM destination address: memcpy(functionname, // RAM destination address (void*)&__address__functionname, // Flash source address (int)&__size__functionname); // Code size of the function � In case of LARGE memory model use, call the fmemcpy() function to copy the inram function to the RAM destination address: memcpy(functionname, // RAM destination address (void @far*)&__address__functionname, // Flash source address (int)&__size__functionname); // Code size of the function - For IAR Compiler: 1- Use the __ramfunc keyword in the function declaration to specify that it can be executed from RAM. This is done within the stm8l15x_flash.c file, and it's conditioned by RAM_EXECUTION definition. 2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8l15x.h file, or define it in IAR compiler preprocessor to enable the access for the __ramfunc functions. The Flash_DataProgram example provided within the STM8L15x_StdPeriph_Lib package details all the steps described above.