cancel
Showing results for 
Search instead for 
Did you mean: 

Function address fixing procedure in STM32F103 controller

NandhakumarGanesan
Associate II

Hi,

 

 We are using STM32F103 family controllers.

how to fix the function address , 

i have tried below mentioned procedure ,but i am getting error .

 

Linker script source:

/* Linker script for STM32F4 series with fixed function address */

/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}

/* Define sections */
SECTIONS
{
/* .text section - code */
.text :
{
*(.text)
*(.text.*)
*(.rodata)
*(.rodata*)
*(.glue_7)
*(.glue_7t)
*(.gcc_except_table)
*(.gcc_except_table.*)
*(.eh_frame)
*(.eh_frame*)
KEEP(*(.isr_vector))
KEEP(*(.init))
KEEP(*(.fini))
. = ALIGN(4);
} > FLASH

/* .data section - initialized data */
.data :
{
_sdata = .;
*(.data)
*(.data.*)
. = ALIGN(4);
_edata = .;
} > RAM AT > FLASH

/* .bss section - uninitialized data */
.bss :
{
_sbss = .;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
_ebss = .;
} > RAM

/* Other sections */

/* Fix function address at 0x800500 */
.myFunctionSection :
{
KEEP(*(.myFunctionSection))
} > FLASH AT 0x800500

/* Heap and stack section (optional) */
.heap :
{
*(.heap)
. = ALIGN(4);
} > RAM

.stack :
{
. = ALIGN(4);
_estack = .;
PROVIDE(end = .);
} > RAM

 

Main function source:

// Function declaration with memory section attribute
void myFunction(void) __attribute__((section(".mySection")));

// Function definition
void myFunction(void) {
// Your code here
}

// Main function
int main(void) {
// Call your fixed address function
myFunction();

while (1) {
// Your main application code
}
}

so kindly give correct procedure for  function address fixing. 

3 REPLIES 3
SofLit
ST Employee

Hello,

I didn't see the declaration of .mySection section in your linker file.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

WHY?

This is liable to be an ungodly nightmare.

0x800500 ?? You mean 0x08000500 ?

A better approach would be to put a TABLE of function pointers, like the Vector Table, and a established / consistent place for that to live. Say immediately after the vectors, perhaps in it's own FLASH_FNTBL memory section at the next 512-byte rounding after the vectors. Let the linker decide where in FLASH the function bodies and dependencies live.

FLASH_VECTBL (rx) : ORIGIN = 0x08000000, LENGTH = 512B

FLASH_FNTBL (rx) : ORIGIN = 0x08000200, LENGTH = 512B

FLASH (rx) : ORIGIN = 0x08000400, LENGTH = 512K-1K

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

hi,

 

Thanks for your response. 

my linker script file:

/*
******************************************************************************
**
** @file : LinkerScript.ld
**
** @author : Auto-generated by STM32CubeIDE
**
** @brief : Linker script for STM32F103C8Tx Device from STM32F1 series
** 64KBytes FLASH
** 20KBytes RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used
**
** Target : STMicroelectronics STM32
**
** Distribution: The file is distributed as is, without any warranty
** of any kind.
**
******************************************************************************
** @attention
**
** Copyright (c) 2024 STMicroelectronics.
** All rights reserved.
**
** This software is licensed under terms that can be found in the LICENSE file
** in the root directory of this software component.
** If no LICENSE file comes with this software, it is provided AS-IS.
**
******************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x200; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 64K

}

/* Sections */
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH

/* The program code and other data into "FLASH" Rom type memory */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)

KEEP (*(.init))
KEEP (*(.fini))

. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
} >FLASH


.myFunctionSection :
{
KEEP(*(.myFunctionSection))
} > FLASH

/* Constant data into "FLASH" Rom type memory */
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
} >FLASH

.ARM.extab : {
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(4);
} >FLASH

.ARM : {
. = ALIGN(4);
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
. = ALIGN(4);
} >FLASH

.preinit_array :
{
. = ALIGN(4);
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
} >FLASH

.init_array :
{
. = ALIGN(4);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
} >FLASH

.fini_array :
{
. = ALIGN(4);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
} >FLASH


/* Used by the startup to initialize data */
_sidata = LOADADDR(.data);

/* Initialized data sections into "RAM" Ram type memory */
.data :
{
. = ALIGN(4);
_sdata = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
*(.RamFunc) /* .RamFunc sections */
*(.RamFunc*) /* .RamFunc* sections */

. = ALIGN(4);
_edata = .; /* define a global symbol at data end */

} >RAM AT> FLASH

/* Uninitialized data section into "RAM" Ram type memory */
. = ALIGN(4);
.bss :
{
/* This is used by the startup in order to initialize the .bss section */
_sbss = .; /* define a global symbol at bss start */
__bss_start__ = _sbss;
*(.bss)
*(.bss*)
*(COMMON)

. = ALIGN(4);
_ebss = .; /* define a global symbol at bss end */
__bss_end__ = _ebss;
} >RAM

/* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >RAM

/* Remove information from the compiler libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}

.ARM.attributes 0 : { *(.ARM.attributes) }
}

 

I will try this way error is not happen but I can add Address in this way error is happening .

 

.myFunctionSection :
{
KEEP(*(.myFunctionSection))
} > FLASH

modified script:

.myFunctionSection :
{
KEEP(*(.myFunctionSection))
} > FLASH AT 0x8005000

 

After this modification error will happening.

 

so kindly give correct way for address fix for a function.