This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Issues linking the startup file in a precompiled .lib

Background

On our company, we precompile our platform library into a .lib and provide these library to other developers.
Till the day, we've used the default startup provided in the Standard Peripheral Library from ST.

Goal

We need to allow the user to customize the Stack and Heap Size.

What we have tried

For this example we're using and STM32F103RB(Nucleo Board).


I've tried to split the startup we've been using in two; one will carry the Heap and Stack definitions and the other will be contain the vector definitions.
The file with the vectors definitions(stm32f1_md_vectors.s) will be included in the .lib file and the other will be linked by the Application developer and together with hiw own code and the .lib file.

These are the milestones I propose:

0) Compile the .lib and link it to an application to obtain the map.

1) Split the startup file in two

2) Assemble them and ensure they work together in the same way than the single startup

3) Assemble them and incorporate them into the .lib and ensure it works like point 2)

4) Assemble the vector stm32f1_md_vectors.s and incorporate in the .lib. Assemble the startup.s and link with the application and the .lib 

This is the code I'm using:

Code of the startup.s:

; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

                PRESERVE8
                THUMB

;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
                 IF      :DEF:__MICROLIB           
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __user_initial_stackheap
                 
__user_initial_stackheap

                 LDR     R0, =  Heap_Mem
                 LDR     R1, =(Stack_Mem + Stack_Size)
                 LDR     R2, = (Heap_Mem +  Heap_Size)
                 LDR     R3, = Stack_Mem
                 BX      LR

                 ALIGN

                 ENDIF

                 END


Code of the stm32f1_md_vectors.s file:

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                IMPORT __initial_sp
				EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

__Vectors       DCD     __initial_sp                    ; Top of Stack
                DCD     Reset_Handler                   ; Reset Handler
                DCD     NMI_Handler                     ; NMI Handler
                DCD     HardFault_Handler               ; Hard Fault Handler
                DCD     MemManage_Handler               ; MPU Fault Handler
                DCD     BusFault_Handler                ; Bus Fault Handler
                DCD     UsageFault_Handler              ; Usage Fault Handler
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     SVC_Handler                     ; SVCall Handler
                DCD     DebugMon_Handler                ; Debug Monitor Handler
                DCD     0                               ; Reserved
                DCD     PendSV_Handler                  ; PendSV Handler
                DCD     SysTick_Handler                 ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler                 ; Window Watchdog
                DCD     PVD_IRQHandler                  ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler               ; Tamper
                DCD     RTC_IRQHandler                  ; RTC
                DCD     FLASH_IRQHandler                ; Flash
                DCD     RCC_IRQHandler                  ; RCC
                DCD     EXTI0_IRQHandler                ; EXTI Line 0
                DCD     EXTI1_IRQHandler                ; EXTI Line 1
                DCD     EXTI2_IRQHandler                ; EXTI Line 2
                DCD     EXTI3_IRQHandler                ; EXTI Line 3
                DCD     EXTI4_IRQHandler                ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler        ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler        ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler        ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler        ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler        ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler        ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler        ; DMA1 Channel 7
                DCD     ADC1_IRQHandler                 ; ADC1
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     EXTI9_5_IRQHandler              ; EXTI Line 9..5
                DCD     TIM1_BRK_TIM15_IRQHandler       ; TIM1 Break and TIM15
                DCD     TIM1_UP_TIM16_IRQHandler        ; TIM1 Update and TIM16
                DCD     TIM1_TRG_COM_TIM17_IRQHandler   ; TIM1 Trigger and Commutation and TIM17
                DCD     TIM1_CC_IRQHandler              ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler                 ; TIM2
                DCD     TIM3_IRQHandler                 ; TIM3
                DCD     TIM4_IRQHandler                 ; TIM4
                DCD     I2C1_EV_IRQHandler              ; I2C1 Event
                DCD     I2C1_ER_IRQHandler              ; I2C1 Error
                DCD     I2C2_EV_IRQHandler              ; I2C2 Event
                DCD     I2C2_ER_IRQHandler              ; I2C2 Error
                DCD     SPI1_IRQHandler                 ; SPI1
                DCD     SPI2_IRQHandler                 ; SPI2
                DCD     USART1_IRQHandler               ; USART1
                DCD     USART2_IRQHandler               ; USART2
                DCD     USART3_IRQHandler               ; USART3
                DCD     EXTI15_10_IRQHandler            ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler             ; RTC Alarm through EXTI Line
                DCD     CEC_IRQHandler                  ; HDMI-CEC
                DCD     TIM12_IRQHandler                ; TIM12
                DCD     TIM13_IRQHandler                ; TIM13 
                DCD     TIM14_IRQHandler                ; TIM14
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     0                               ; Reserved
                DCD     TIM5_IRQHandler                 ; TIM5
                DCD     SPI3_IRQHandler                 ; SPI3
                DCD     UART4_IRQHandler                ; UART4
                DCD     UART5_IRQHandler                ; UART5
                DCD     TIM6_DAC_IRQHandler             ; TIM6 and DAC underrun
                DCD     TIM7_IRQHandler                 ; TIM7
                DCD     DMA2_Channel1_IRQHandler        ; DMA2 Channel1
                DCD     DMA2_Channel2_IRQHandler        ; DMA2 Channel2
                DCD     DMA2_Channel3_IRQHandler        ; DMA2 Channel3
                DCD     DMA2_Channel4_5_IRQHandler      ; DMA2 Channel4 & Channel5
                DCD     DMA2_Channel5_IRQHandler        ; DMA2 Channel5                
__Vectors_End

__Vectors_Size  EQU  __Vectors_End - __Vectors

                AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
     IMPORT  __main
     IMPORT  SystemInit
                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler     PROC
                EXPORT  NMI_Handler                      [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler                [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler                [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler                 [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler               [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler                      [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler                 [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler                   [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler                  [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler                  [WEAK]
                EXPORT  PVD_IRQHandler                   [WEAK]
                EXPORT  TAMPER_IRQHandler                [WEAK]
                EXPORT  RTC_IRQHandler                   [WEAK]
                EXPORT  FLASH_IRQHandler                 [WEAK]
                EXPORT  RCC_IRQHandler                   [WEAK]
                EXPORT  EXTI0_IRQHandler                 [WEAK]
                EXPORT  EXTI1_IRQHandler                 [WEAK]
                EXPORT  EXTI2_IRQHandler                 [WEAK]
                EXPORT  EXTI3_IRQHandler                 [WEAK]
                EXPORT  EXTI4_IRQHandler                 [WEAK]
                EXPORT  DMA1_Channel1_IRQHandler         [WEAK]
                EXPORT  DMA1_Channel2_IRQHandler         [WEAK]
                EXPORT  DMA1_Channel3_IRQHandler         [WEAK]
                EXPORT  DMA1_Channel4_IRQHandler         [WEAK]
                EXPORT  DMA1_Channel5_IRQHandler         [WEAK]
                EXPORT  DMA1_Channel6_IRQHandler         [WEAK]
                EXPORT  DMA1_Channel7_IRQHandler         [WEAK]
                EXPORT  ADC1_IRQHandler                  [WEAK]
                EXPORT  EXTI9_5_IRQHandler               [WEAK]
                EXPORT  TIM1_BRK_TIM15_IRQHandler        [WEAK]
                EXPORT  TIM1_UP_TIM16_IRQHandler         [WEAK]
                EXPORT  TIM1_TRG_COM_TIM17_IRQHandler    [WEAK]
                EXPORT  TIM1_CC_IRQHandler               [WEAK]
                EXPORT  TIM2_IRQHandler                  [WEAK]
                EXPORT  TIM3_IRQHandler                  [WEAK]
                EXPORT  TIM4_IRQHandler                  [WEAK]
                EXPORT  I2C1_EV_IRQHandler               [WEAK]
                EXPORT  I2C1_ER_IRQHandler               [WEAK]
                EXPORT  I2C2_EV_IRQHandler               [WEAK]
                EXPORT  I2C2_ER_IRQHandler               [WEAK]
                EXPORT  SPI1_IRQHandler                  [WEAK]
                EXPORT  SPI2_IRQHandler                  [WEAK]
                EXPORT  USART1_IRQHandler                [WEAK]
                EXPORT  USART2_IRQHandler                [WEAK]
                EXPORT  USART3_IRQHandler                [WEAK]
                EXPORT  EXTI15_10_IRQHandler             [WEAK]
                EXPORT  RTCAlarm_IRQHandler              [WEAK]
                EXPORT  CEC_IRQHandler                   [WEAK]
                EXPORT  TIM12_IRQHandler                 [WEAK]
                EXPORT  TIM13_IRQHandler                 [WEAK]
                EXPORT  TIM14_IRQHandler                 [WEAK]
                EXPORT  TIM5_IRQHandler                  [WEAK]
                EXPORT  SPI3_IRQHandler                  [WEAK]
                EXPORT  UART4_IRQHandler                 [WEAK]
                EXPORT  UART5_IRQHandler                 [WEAK]                
                EXPORT  TIM6_DAC_IRQHandler              [WEAK]
                EXPORT  TIM7_IRQHandler                  [WEAK]
                EXPORT  DMA2_Channel1_IRQHandler         [WEAK]
                EXPORT  DMA2_Channel2_IRQHandler         [WEAK]
                EXPORT  DMA2_Channel3_IRQHandler         [WEAK]
                EXPORT  DMA2_Channel4_5_IRQHandler       [WEAK]
                EXPORT  DMA2_Channel5_IRQHandler         [WEAK]                

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_IRQHandler
DMA1_Channel3_IRQHandler
DMA1_Channel4_IRQHandler
DMA1_Channel5_IRQHandler
DMA1_Channel6_IRQHandler
DMA1_Channel7_IRQHandler
ADC1_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM15_IRQHandler
TIM1_UP_TIM16_IRQHandler
TIM1_TRG_COM_TIM17_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
CEC_IRQHandler
TIM12_IRQHandler
TIM13_IRQHandler
TIM14_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Channel1_IRQHandler
DMA2_Channel2_IRQHandler
DMA2_Channel3_IRQHandler
DMA2_Channel4_5_IRQHandler
DMA2_Channel5_IRQHandler
                B       .

                ENDP

                ALIGN

				END


And the scatter:

LR_IROMPROGRAM1 0x08000000 0x1C800  {    ; load region size_region   
   ER_IROM1 0x08000000 0x1C800 {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

LR_IROMDATA1 0x0801F800 0x800  {    ; load region size_region   
   ER_EMPTY1 0x0801F800 EMPTY 0x800  {  
     ;Empty region not zero-initialized in run time
  }
}



Outcome
2) It works when I compile the files together in a sample project.

3) It succeds in incorporating them in the.lib , but when I try to link them with the application, it seems the RESET area isn't found. This is the linker output:

"..\..\.\output\generated\gf_hal.sct", line 10 (column 9): Error: L6236E: No section matches selector - no section to be FIRST/LAST.
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 1 error messages.
Error: Linker error 1


I attach three maps: the one obtained in the steps 0, 2 and 3.


Tomorrow I'll try to reproduce the steps 2 and 3 with a minimal library(and no propetary code) so I can provide sample projects.

  • I've tried to split the startup we've been using in two; one will carry the Heap and Stack definitions and the other will be contain the vector definitions.

    That most likely won't work.  Libraries are a pull service: the linker can pull from them what it needs.  But it won't know that it needs to pull the in-library part of your start-up, because it sees no particular reason to do that. 

    The start-up file is not just the file the microcontroller code starts from.  In a library-based build it's also the file the linker starts its discovery of things needed to complete the program from.  Start-up pulls in the run-time library by requiring things from it, that pulls in the file with main() in it by trying to call main(), and that pulls the whole program along with it.

    Because of that, start-up files are singularly ill-fitted for inclusion in libraries.

  • Do you have any proprietary code in the startup file? If not, let the user supply

    Consider also if you can just import the size values.

  • I've realized in the startup file I created I didn't set the proper AREA for the User Stack and Heap initialization (.text). So I changed the files, and added the export's/ import's that were missing. These are the new files:

    Code of the stm32f1_md_vectors.s file:

    ; Vector Table Mapped to Address 0 at Reset
                    AREA    RESET, DATA, READONLY
                    IMPORT __initial_sp
    				    EXPORT  __Vectors
                    EXPORT  __Vectors_End
                    EXPORT  __Vectors_Size
    
    __Vectors       DCD     __initial_sp                    ; Top of Stack
                    DCD     Reset_Handler                   ; Reset Handler
                    DCD     NMI_Handler                     ; NMI Handler
                    DCD     HardFault_Handler               ; Hard Fault Handler
                    DCD     MemManage_Handler               ; MPU Fault Handler
                    DCD     BusFault_Handler                ; Bus Fault Handler
                    DCD     UsageFault_Handler              ; Usage Fault Handler
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     SVC_Handler                     ; SVCall Handler
                    DCD     DebugMon_Handler                ; Debug Monitor Handler
                    DCD     0                               ; Reserved
                    DCD     PendSV_Handler                  ; PendSV Handler
                    DCD     SysTick_Handler                 ; SysTick Handler
    
                    ; External Interrupts
                    DCD     WWDG_IRQHandler                 ; Window Watchdog
                    DCD     PVD_IRQHandler                  ; PVD through EXTI Line detect
                    DCD     TAMPER_IRQHandler               ; Tamper
                    DCD     RTC_IRQHandler                  ; RTC
                    DCD     FLASH_IRQHandler                ; Flash
                    DCD     RCC_IRQHandler                  ; RCC
                    DCD     EXTI0_IRQHandler                ; EXTI Line 0
                    DCD     EXTI1_IRQHandler                ; EXTI Line 1
                    DCD     EXTI2_IRQHandler                ; EXTI Line 2
                    DCD     EXTI3_IRQHandler                ; EXTI Line 3
                    DCD     EXTI4_IRQHandler                ; EXTI Line 4
                    DCD     DMA1_Channel1_IRQHandler        ; DMA1 Channel 1
                    DCD     DMA1_Channel2_IRQHandler        ; DMA1 Channel 2
                    DCD     DMA1_Channel3_IRQHandler        ; DMA1 Channel 3
                    DCD     DMA1_Channel4_IRQHandler        ; DMA1 Channel 4
                    DCD     DMA1_Channel5_IRQHandler        ; DMA1 Channel 5
                    DCD     DMA1_Channel6_IRQHandler        ; DMA1 Channel 6
                    DCD     DMA1_Channel7_IRQHandler        ; DMA1 Channel 7
                    DCD     ADC1_IRQHandler                 ; ADC1
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     EXTI9_5_IRQHandler              ; EXTI Line 9..5
                    DCD     TIM1_BRK_TIM15_IRQHandler       ; TIM1 Break and TIM15
                    DCD     TIM1_UP_TIM16_IRQHandler        ; TIM1 Update and TIM16
                    DCD     TIM1_TRG_COM_TIM17_IRQHandler   ; TIM1 Trigger and Commutation and TIM17
                    DCD     TIM1_CC_IRQHandler              ; TIM1 Capture Compare
                    DCD     TIM2_IRQHandler                 ; TIM2
                    DCD     TIM3_IRQHandler                 ; TIM3
                    DCD     TIM4_IRQHandler                 ; TIM4
                    DCD     I2C1_EV_IRQHandler              ; I2C1 Event
                    DCD     I2C1_ER_IRQHandler              ; I2C1 Error
                    DCD     I2C2_EV_IRQHandler              ; I2C2 Event
                    DCD     I2C2_ER_IRQHandler              ; I2C2 Error
                    DCD     SPI1_IRQHandler                 ; SPI1
                    DCD     SPI2_IRQHandler                 ; SPI2
                    DCD     USART1_IRQHandler               ; USART1
                    DCD     USART2_IRQHandler               ; USART2
                    DCD     USART3_IRQHandler               ; USART3
                    DCD     EXTI15_10_IRQHandler            ; EXTI Line 15..10
                    DCD     RTCAlarm_IRQHandler             ; RTC Alarm through EXTI Line
                    DCD     CEC_IRQHandler                  ; HDMI-CEC
                    DCD     TIM12_IRQHandler                ; TIM12
                    DCD     TIM13_IRQHandler                ; TIM13 
                    DCD     TIM14_IRQHandler                ; TIM14
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     0                               ; Reserved
                    DCD     TIM5_IRQHandler                 ; TIM5
                    DCD     SPI3_IRQHandler                 ; SPI3
                    DCD     UART4_IRQHandler                ; UART4
                    DCD     UART5_IRQHandler                ; UART5
                    DCD     TIM6_DAC_IRQHandler             ; TIM6 and DAC underrun
                    DCD     TIM7_IRQHandler                 ; TIM7
                    DCD     DMA2_Channel1_IRQHandler        ; DMA2 Channel1
                    DCD     DMA2_Channel2_IRQHandler        ; DMA2 Channel2
                    DCD     DMA2_Channel3_IRQHandler        ; DMA2 Channel3
                    DCD     DMA2_Channel4_5_IRQHandler      ; DMA2 Channel4 & Channel5
                    DCD     DMA2_Channel5_IRQHandler        ; DMA2 Channel5                
    __Vectors_End
    
    __Vectors_Size  EQU  __Vectors_End - __Vectors
    
                    AREA    |.text|, CODE, READONLY
    
    ; Reset handler
    Reset_Handler    PROC
                     EXPORT  Reset_Handler             [WEAK]
         IMPORT  __main
         IMPORT  SystemInit
                     LDR     R0, =SystemInit
                     BLX     R0
                     LDR     R0, =__main
                     BX      R0
                     ENDP
    
    ; Dummy Exception Handlers (infinite loops which can be modified)
    
    NMI_Handler     PROC
                    EXPORT  NMI_Handler                      [WEAK]
                    B       .
                    ENDP
    HardFault_Handler\
                    PROC
                    EXPORT  HardFault_Handler                [WEAK]
                    B       .
                    ENDP
    MemManage_Handler\
                    PROC
                    EXPORT  MemManage_Handler                [WEAK]
                    B       .
                    ENDP
    BusFault_Handler\
                    PROC
                    EXPORT  BusFault_Handler                 [WEAK]
                    B       .
                    ENDP
    UsageFault_Handler\
                    PROC
                    EXPORT  UsageFault_Handler               [WEAK]
                    B       .
                    ENDP
    SVC_Handler     PROC
                    EXPORT  SVC_Handler                      [WEAK]
                    B       .
                    ENDP
    DebugMon_Handler\
                    PROC
                    EXPORT  DebugMon_Handler                 [WEAK]
                    B       .
                    ENDP
    PendSV_Handler  PROC
                    EXPORT  PendSV_Handler                   [WEAK]
                    B       .
                    ENDP
    SysTick_Handler PROC
                    EXPORT  SysTick_Handler                  [WEAK]
                    B       .
                    ENDP
    
    Default_Handler PROC
    
                    EXPORT  WWDG_IRQHandler                  [WEAK]
                    EXPORT  PVD_IRQHandler                   [WEAK]
                    EXPORT  TAMPER_IRQHandler                [WEAK]
                    EXPORT  RTC_IRQHandler                   [WEAK]
                    EXPORT  FLASH_IRQHandler                 [WEAK]
                    EXPORT  RCC_IRQHandler                   [WEAK]
                    EXPORT  EXTI0_IRQHandler                 [WEAK]
                    EXPORT  EXTI1_IRQHandler                 [WEAK]
                    EXPORT  EXTI2_IRQHandler                 [WEAK]
                    EXPORT  EXTI3_IRQHandler                 [WEAK]
                    EXPORT  EXTI4_IRQHandler                 [WEAK]
                    EXPORT  DMA1_Channel1_IRQHandler         [WEAK]
                    EXPORT  DMA1_Channel2_IRQHandler         [WEAK]
                    EXPORT  DMA1_Channel3_IRQHandler         [WEAK]
                    EXPORT  DMA1_Channel4_IRQHandler         [WEAK]
                    EXPORT  DMA1_Channel5_IRQHandler         [WEAK]
                    EXPORT  DMA1_Channel6_IRQHandler         [WEAK]
                    EXPORT  DMA1_Channel7_IRQHandler         [WEAK]
                    EXPORT  ADC1_IRQHandler                  [WEAK]
                    EXPORT  EXTI9_5_IRQHandler               [WEAK]
                    EXPORT  TIM1_BRK_TIM15_IRQHandler        [WEAK]
                    EXPORT  TIM1_UP_TIM16_IRQHandler         [WEAK]
                    EXPORT  TIM1_TRG_COM_TIM17_IRQHandler    [WEAK]
                    EXPORT  TIM1_CC_IRQHandler               [WEAK]
                    EXPORT  TIM2_IRQHandler                  [WEAK]
                    EXPORT  TIM3_IRQHandler                  [WEAK]
                    EXPORT  TIM4_IRQHandler                  [WEAK]
                    EXPORT  I2C1_EV_IRQHandler               [WEAK]
                    EXPORT  I2C1_ER_IRQHandler               [WEAK]
                    EXPORT  I2C2_EV_IRQHandler               [WEAK]
                    EXPORT  I2C2_ER_IRQHandler               [WEAK]
                    EXPORT  SPI1_IRQHandler                  [WEAK]
                    EXPORT  SPI2_IRQHandler                  [WEAK]
                    EXPORT  USART1_IRQHandler                [WEAK]
                    EXPORT  USART2_IRQHandler                [WEAK]
                    EXPORT  USART3_IRQHandler                [WEAK]
                    EXPORT  EXTI15_10_IRQHandler             [WEAK]
                    EXPORT  RTCAlarm_IRQHandler              [WEAK]
                    EXPORT  CEC_IRQHandler                   [WEAK]
                    EXPORT  TIM12_IRQHandler                 [WEAK]
                    EXPORT  TIM13_IRQHandler                 [WEAK]
                    EXPORT  TIM14_IRQHandler                 [WEAK]
                    EXPORT  TIM5_IRQHandler                  [WEAK]
                    EXPORT  SPI3_IRQHandler                  [WEAK]
                    EXPORT  UART4_IRQHandler                 [WEAK]
                    EXPORT  UART5_IRQHandler                 [WEAK]                
                    EXPORT  TIM6_DAC_IRQHandler              [WEAK]
                    EXPORT  TIM7_IRQHandler                  [WEAK]
                    EXPORT  DMA2_Channel1_IRQHandler         [WEAK]
                    EXPORT  DMA2_Channel2_IRQHandler         [WEAK]
                    EXPORT  DMA2_Channel3_IRQHandler         [WEAK]
                    EXPORT  DMA2_Channel4_5_IRQHandler       [WEAK]
                    EXPORT  DMA2_Channel5_IRQHandler         [WEAK]                
    
    WWDG_IRQHandler
    PVD_IRQHandler
    TAMPER_IRQHandler
    RTC_IRQHandler
    FLASH_IRQHandler
    RCC_IRQHandler
    EXTI0_IRQHandler
    EXTI1_IRQHandler
    EXTI2_IRQHandler
    EXTI3_IRQHandler
    EXTI4_IRQHandler
    DMA1_Channel1_IRQHandler
    DMA1_Channel2_IRQHandler
    DMA1_Channel3_IRQHandler
    DMA1_Channel4_IRQHandler
    DMA1_Channel5_IRQHandler
    DMA1_Channel6_IRQHandler
    DMA1_Channel7_IRQHandler
    ADC1_IRQHandler
    EXTI9_5_IRQHandler
    TIM1_BRK_TIM15_IRQHandler
    TIM1_UP_TIM16_IRQHandler
    TIM1_TRG_COM_TIM17_IRQHandler
    TIM1_CC_IRQHandler
    TIM2_IRQHandler
    TIM3_IRQHandler
    TIM4_IRQHandler
    I2C1_EV_IRQHandler
    I2C1_ER_IRQHandler
    I2C2_EV_IRQHandler
    I2C2_ER_IRQHandler
    SPI1_IRQHandler
    SPI2_IRQHandler
    USART1_IRQHandler
    USART2_IRQHandler
    USART3_IRQHandler
    EXTI15_10_IRQHandler
    RTCAlarm_IRQHandler
    CEC_IRQHandler
    TIM12_IRQHandler
    TIM13_IRQHandler
    TIM14_IRQHandler
    TIM5_IRQHandler
    SPI3_IRQHandler
    UART4_IRQHandler
    UART5_IRQHandler
    TIM6_DAC_IRQHandler
    TIM7_IRQHandler
    DMA2_Channel1_IRQHandler
    DMA2_Channel2_IRQHandler
    DMA2_Channel3_IRQHandler
    DMA2_Channel4_5_IRQHandler
    DMA2_Channel5_IRQHandler
                    B       .
    
                    ENDP
    
                    ALIGN
    
    ;*******************************************************************************
    ; User Stack and Heap initialization
    ;*******************************************************************************
                     IF      :DEF:__MICROLIB
    
                     IMPORT  __initial_sp
                     IMPORT  __heap_base
                     IMPORT  __heap_limit
    
                     ELSE
    
                     IMPORT  __use_two_region_memory
                     EXPORT  __user_initial_stackheap
    
    __user_initial_stackheap
                     IMPORT Stack_Size
                     IMPORT Heap_Size
                     IMPORT Heap_Mem
                     IMPORT Stack_Mem
    
                     LDR     R0, =  Heap_Mem
                     LDR     R1, =(Stack_Mem + Stack_Size)
                     LDR     R2, = (Heap_Mem +  Heap_Size)
                     LDR     R3, = Stack_Mem
                     BX      LR
    
                     ALIGN
    
                     ENDIF
    
                     END
    
    				END
    
    

    Code of the startup.s:

    ; Amount of memory (in bytes) allocated for Stack
    ; Tailor this value to your application needs
    ; <h> Stack Configuration
    ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Stack_Size      EQU     0x00000400
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    
    
    ; <h> Heap Configuration
    ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; </h>
    
    Heap_Size       EQU     0x00000200
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    
                    PRESERVE8
                    EXPORT __initial_sp
                    EXPORT __heap_base
                    EXPORT __heap_limit
                    EXPORT Stack_Size
                    EXPORT Heap_Size
                    EXPORT Heap_Mem
                    EXPORT Stack_Mem
                    THUMB
                    END
    


    Outcome:

    Now i have an error when the stm32f1_md_vectors is assembled:

    \..\GEZE_Framework\04_Implementation\drivers\MCU_MicrocontrollerTuning\platform_stm32f1\stm32lib\cmsis\0stm32f1_md_vectors.s", line 319 (column 32): Error: A1150E: Bad symbol, not defined or external
      319 0000001e                  LDR     R1, =(Stack_Mem + Stack_Size)
                                                  ^
    "..\..\..\GEZE_Framework\04_Implementation\drivers\MCU_MicrocontrollerTuning\platform_stm32f1\stm32lib\cmsis\0stm32f1_md_vectors.s", line 319: Error: A1284E: Literal pool too distant, use LTORG to assemble it within 4KB
      319 0000001e                  LDR     R1, =(Stack_Mem + Stack_Size)
    "..\..\..\GEZE_Framework\04_Implementation\drivers\MCU_MicrocontrollerTuning\platform_stm32f1\stm32lib\cmsis\0stm32f1_md_vectors.s", line 320 (column 33): Error: A1150E: Bad symbol, not defined or external
      320 00000020                  LDR     R2, = (Heap_Mem +  Heap_Size)
                                                   ^
    "..\..\..\GEZE_Framework\04_Implementation\drivers\MCU_MicrocontrollerTuning\platform_stm32f1\stm32lib\cmsis\0stm32f1_md_vectors.s", line 320: Error: A1284E: Literal pool too distant, use LTORG to assemble it within 4KB
      320 00000020                  LDR     R2, = (Heap_Mem +  Heap_Size)
    4 Errors, 0 Warnings
    Error: Assembly error 1
    

  • Till the day, we've used the default startup provided in the Standard Peripheral Library from ST.

    Is it correct to say that that startup file is assembled at your end, and shipped to your customers as an object file?

    We need to allow the user to customize the Stack and Heap Size.

    The SPACE/FILL directive to the assembler does the job of allocating the given amount of space, but such an allocation is an assembling-time activity. Once the object file is prepared, one cannot, in general, stretch the region (for e.g., by forcing an address-change) and make it larger, without also overlapping the region with the space allocated for adjacent symbols.

    It seems that you want to

    1. ship object code of the startup files, and
    2. still allow your customers to select the stack and heap sizes at link-time.

    If so, it is too late to change the SPACE/FILL directives; the startup's source isn't available.

    To support your goal, one must avoid defining the stack and heap sizes in the assembler's source. Instead, one must rely on the linker/scatter script to:

    1. define appropriate symbols,
    2. adjust the location counter with the help of a symbol, representing the size, which the customers can define on their linker command line, and
    3. have the startup and other sources at your end import those symbols. That is, the object files shipped to your customers already know that they need to import the stack/heap symbols defined in the linker/scatter script.

    Some examples:

    1. Here is an example with GNU ld.
    2. Here is an example with Arm's linker, though I can't say if it does or doesn't support specifying sizes by defining new symbols, and specifying a default size if the customer did not define the required symbol.

    The above:

    1. assumes that you do ship the linker/scatter script to your customers, for them to link their applications with, and
    2. doesn't help with the selective nature of the library archives; but that is a separate problem.

    Edit: Hmm.. I can't downvote my own, accidental upvote without reducing the count to 0. Nevermind, I can live with whatever such self-votes are supposed to imply :)

  • I'm just trying to assemble them and incorporate them in the .lib with the same behaviour of the original start-up.

    That's just it: the step of putting the file into the library already changes the behaviour of the linker.  It changes that object file from one that the linker always processes to one that will only be looked at to see if can fulfill a need that the linker knows about.  If it doesn't come up in such searches, it'll never ever enter the playing field.

  • I neither use Keil nor STM parts, I use plain gcc+make on SiLabs EFM32GG series.  However, this info may be useful to you...

    I prebuild startup.c and system.c, as supplied by vendor, into a .a. startup.c has #defines for HEAP_SIZE and STACK_SIZE, with local defaults (as I recall, 1K stack, 3K heap).

    In apps that need non-default stack or heap, we simply COPY the startup.c to the local project, name it in our dependencies, e.g.

    app.axf: app.o startup.o

    and supply a define (a target-specific variable actually, for those that know GNU make well)

    startup.o : CPPFLAGS += -D__HEAP_SIZE=0x2000

    We don't actually need to EDIT the copied startup.c at all, just merely have it locally.  I have found that with the gcc toolchain, a .o on the cmd line overrides a .o found in a .a.

    I can verify from my app.map file that my heap would indeed be 0x2000.

    I see that your start up file is in assembler. I imagine my usage pattern would still work for me, after all, make has rules for building a .o from a .c but also from a .s.

    Stuart