I have a product running RTX with 16 tasks
when I started the project I was relaxed about the RAM of the micro (STM32F205ZE) but in a recent code review I decided to look at the RAM usage and clean it up and make it "lean"
so I have a function to Start each task e.g.
void StartTPMTask(void) { #ifdef C_STACK_TEST memset(&TPM_task_stk[0],0xAA,(C_TPM_TASK_STK_SIZE*8)); #endif /*************************************/ if(OS_TPM_Task_id == 0) { OS_TPM_Task_id = os_tsk_create_user(TPM_task,eTask_Priority_TPM,&TPM_task_stk[0],sizeof(TPM_task_stk)); if(OS_TPM_Task_id) { #ifdef C_STACK_TEST AddStackToTest("TPM",OS_TPM_Task_id,&TPM_task_stk[0],C_TPM_TASK_STK_SIZE); #endif } } } <\pre> where as you can see I fill the stack RAM with a known value, that is later then examined when the task it "stopped" and the last thing before shutdown of the system all the stack data is written to a SD card e.g. an example of the print out *************** * Stack Data * 10:54:46 ************* 71.4% Used-00080 Size-00112 ID-02 Battery Monitoring Task 89.3% Used-00800 Size-00896 ID-03 Display Task Task 84.0% Used-01344 Size-01600 ID-04 Data Manager Task 17.2% Used-00088 Size-00512 ID-05 ALARM Task 71.4% Used-01096 Size-01536 ID-06 GSM Task 63.9% Used-00184 Size-00288 ID-07 TPM Task 67.2% Used-00344 Size-00512 ID-08 Can TX Task 64.3% Used-00072 Size-00112 ID-09 GSM Timeout Task 75.0% Used-00072 Size-00096 ID-10 Send Data Timer Task 28.0% Unused Total 5664 unused 1584 I leave the system running for at least 48 hours before I use the data to hopefully try and catch the exceptions where more stack data may be used than normal I feel "safe" only using 80% of the task stack but it grates to see that I roughly don't use 30% of the RAM allocated to stacks How do others go about setting task stack size and what safety margin do you use ?
There are 2 more strategies I suggest: 1. add --callgraph in Options for Target -> Linker tab it will produce .htm file named same as name of your executable instead of .axf it will be .htm, in there you can analyze call chains of your functions 2. In latest RTX (config file 4.70.1) you can enable Stack usage watermark which then in debugger OS Support shows maximum of stack that got written to, based on changes in predefined pattern (there is of course possibility that code matches pattern, but very minor, and also there is possibility that it wasn't hit during worst case scenario so in that way it is again just a good estimation of maximum stack requirement)
Thanks for the comments
I will look at the callgraph options and see what I can do with that
I tried the debugger support and stack used metric but "felt" it was unreliable. (eg settng the stack to a certain size using the value produced by the debugger used to cause stack overflow errors)
Take a look at https://github.com/undici77/KeilMapTools
I written KeilRtxStackSize in order to generate a .h with precalculated task stack size!