I can’t believe that mine is the only project that requires such diligence.
Sure, every embedded programmer faces this complex problem 🙂
On the side of FreeRTOS things are relatively simple: the kernel and API’s have a low and predictable usage of stack and heap. We programmers decide how much of the heap will be allocated by the API’s.
Things get more complex if you use things like TCP/IP, or if you have ‘users’ giving variable input and commands.
To simplify things, use a fixed (or at least a predictable) number of tasks.
To save stack space, look if several tasks can be combined. Often this requires the use of so-called status machines, each one handling a sub-task.
Some people say: observe the maximum needs of an application and multiply it by two (if you have that available).
I’m sure you have found these functions:
size_t xPortGetFreeHeapSize( void );
size_t xPortGetMinimumEverFreeHeapSize( void );
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
or this one:
TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
uint32_t * const pulTotalRunTime );
What is the best format for such files
Whatever is comfortable for you: BMP, PNG, JPEG, or even a document is OK.
You can put them here as an attachment.