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 ?
Take a look at https://github.com/undici77/KeilMapTools
I written KeilRtxStackSize in order to generate a .h with precalculated task stack size!