on cortex-m0 PORT_IRQ_PROLOGE saves the LR register, which is then supplied to PORT_IRQ_EPILOGUE
Code: Select all
#define PORT_IRQ_PROLOGUE() \
regarm_t _saved_lr = (regarm_t)__builtin_return_address(0)
#define PORT_IRQ_EPILOGUE() _port_irq_epilogue(_saved_lr)
when optimization disabled gcc compiles to following code
Code: Select all
08003810 <Vector80>:
OSAL_IRQ_HANDLER(ST_HANDLER) {
8003810: b580 push {r7, lr}
8003812: b082 sub sp, #8
8003814: af00 add r7, sp, #0
8003816: 4673 mov r3, lr <----- save LR
OSAL_IRQ_PROLOGUE();
8003818: 607b str r3, [r7, #4]
...
800383e: 687b ldr r3, [r7, #4] <------ use LR
8003840: 0018 movs r0, r3
8003842: f7fc fd75 bl 8000330 <_port_irq_epilogue>
however, with optimization is enabled, when a macro is called, the value of the LR register is already destroyed.
Code: Select all
08003710 <Vector80>:
OSAL_IRQ_HANDLER(ST_HANDLER) {
8003710: b5f8 push {r3, r4, r5, r6, r7, lr}
8003712: 46de mov lr, fp
8003714: 4657 mov r7, sl
8003716: 464e mov r6, r9
8003718: 4645 mov r5, r8
gcc moves FP to LR
other handlers look similar
Code: Select all
08003400 <VectorBC>:
OSAL_IRQ_HANDLER(STM32_USB1_LP_HANDLER) {
8003400: b5f0 push {r4, r5, r6, r7, lr}
8003402: 46de mov lr, fp
8003404: 4657 mov r7, sl
8003406: 464e mov r6, r9
8003408: 4645 mov r5, r8
OSAL_IRQ_PROLOGUE();
800340a: 4673 mov r3, lr <----- LR has invalid value here
it seems to be the reason