In our university lab we intensively use FreeRTOS.
Students frequently write code that allows the flow of control
to leave a task function. On the ARM Cortex (as in other families)
this creates a crash that may be hard to track down.
To help debugging I use a hook-function that is called
whenever this problem arises. This hook’s address must
be put into the stack-frame when setting up the
task’s stack on creation of a task.
Alternatively you can also link a function that let’s
the task delete itself on exit with the same mechanism.
portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void pvParameters, portBASE_TYPE xRunPrivileged, portBASE_TYPE xUseFPU)
{
/ Simulate the stack frame as it would be created by a context switch interrupt. */
pxTopOfStack–;
/* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ pxTopOfStack = portINITIAL_XPSR; / xPSR */
pxTopOfStack–; pxTopOfStack = ( portSTACK_TYPE ) pxCode; / PC */
pxTopOfStack–;
*pxTopOfStack = (portSTACK_TYPE ) vApplicationReturnFromTaskProcedureHook; / LR /
pxTopOfStack -= 5; / R12, R3, R2 and R1. */
…
The last few versions do what you want already. It was discussed here a while back and decided not to automatically delete the task because that needs vTaskDelete() to be in the build and hides the error from users.