FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [December 2015 Threads] ARM Cortex-M3 crashed with --use_frame_pointerPosted by bettermanlu on December 11, 2015 Our current project includes FreeRTOS, and I added --useframepointer to Keil uVision's ARMGCC compiler option. But after loading firmware into STM32F104 chip, then runs it, it crashed. Without --useframepointer, everything is OK. The hard fault handler shows that faultStackAddress is 0x40FFFFDC, which points to a reserved area. Does anyone has any idea of this error? Thanks a lot.
~~~~
_asm void HardFaultHandler(void)
{
TST lr, #4
ITE EQ
MRSEQ r0, MSP
MRSNE r0, PSP
B _cpp(HardFaultHandler)
}
void HardFaultHandler(uint32t *faultStackAddress)
{
}
~~~~
I stepped into each line of code, and the crash happened in below function in FreeRTOS's port.c after I called vTaskDelete(NULL);
~~~~
void vPortYieldFromISR( void )
{
/* Set a PendSV to request a context switch. */
portNVICINTCTRLREG = portNVICPENDSVSET_BIT;
}
~~~~
But seems like this is not the root cause, because when I deleted vTaskDelete(NULL), crash still happened.
ARM Cortex-M3 crashed with --use_frame_pointerPosted by rtel on December 11, 2015 I'm afraid without reading the compiler documentation, or inspecting the changes to the generated assembler code, I don't know why this would be. The code assumes the compiler generates ARM EABI compliant code, maybe using the frame pointer changes that? Why do you need that compiler option?
ARM Cortex-M3 crashed with --use_frame_pointerPosted by bettermanlu on December 14, 2015 We'd like to unwind ARM Cortex M3 stack when crash happened, so we need to save FP(Frame Pointer) to the stack. That's why we add --useframepointer to Keil uVision's ARMGCC compiler option.
ARM Cortex-M3 crashed with --use_frame_pointerPosted by bettermanlu on January 13, 2016 I found that if I comment out the xTimerCreateTimerTask() in vTaskStartScheduler() function, the crash does not happen. Any thoughts? Thanks.
ARM Cortex-M3 crashed with --use_frame_pointerPosted by bettermanlu on January 13, 2016 My test code for your reference:
~~~~
include "FreeRTOSConfig.h"
include "FreeRTOS.h"
include "task.h"
include
void crashTask(void *param)
{
unsigned int i = 0;
/* halt the hardware. */
while(1)
{
i += 1;
}
vTaskDelete(NULL);
}
void testCrashTask()
{
xTaskCreate(crashTask, (const signed char *)"crashTask", configMINIMALSTACKSIZE, NULL, 1, NULL);
}
void HardFaultHandler(unsigned int *faultStackAddress);
/* The fault handler implementation calls a function called HardFaultHandler(). */
if defined(_CCARM)
_asm void HardFaultHandler(void)
{
TST lr, #4
ITE EQ
MRSEQ r0, MSP
MRSNE r0, PSP
B _cpp(HardFault_Handler)
}
else
void HardFaultHandler(void)
{
__asm("TST lr, #4");
__asm("ITE EQ");
__asm("MRSEQ r0, MSP");
__asm("MRSNE r0, PSP");
__asm("B HardFault_Handler");
}
endif
void HardFaultHandler(unsigned int *faultStackAddress)
{
int i = 0;
while(1)
{
i += 1;
}
}
void nvicInit(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
int main()
{
nvicInit();
testCrashTask();
vTaskStartScheduler();
}
/* For now, the stack depth of IDLE has 88 left. if want add func to here,
you should increase it. /
void vApplicationIdleHook(void)
{ / ATTENTION: all funcs called within here, must not be blocked */
//workerProbe();
}
void debugSendTraceInfo(unsigned int taskNbr)
{
}
~~~~
ARM Cortex-M3 crashed with --use_frame_pointerPosted by rtel on January 13, 2016 The timer task is a standard task, written in C, so there is nothing special about it that I am aware of. It does however give a big clue as to where you could focus your debugging. See how far you get through the function - it is actually quite small.
ARM Cortex-M3 crashed with --use_frame_pointerPosted by bettermanlu on January 14, 2016 Seems like SP is corrupted.
Another odd thing is that if I debug it and step into the TimerTask's portYIELDWITHINAPI() function call, then resume the application. It does not crash. So my guess is that this might due to certain time sequence. But I could not find the root cause of it.
Any thoughts? Thanks.
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.
|