FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-glue/cst/cst_stack.c @ 832:c14bc60c6c30
gsm-fw/g23m-glue/cst: import from Leonardo source
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Thu, 23 Apr 2015 06:45:55 +0000 |
parents | |
children | 8140945526c2 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-glue/cst/cst_stack.c Thu Apr 23 06:45:55 2015 +0000 @@ -0,0 +1,163 @@ +/******************************************************************************* + * + * CST_STACK.C + * + * Tasks and HISRs stacks monitoring. + * + * (C) Texas Instruments 2000 + * + ******************************************************************************/ + +#include <stdio.h> +#include <string.h> + +#include "nucleus.h" +#include "cs_defs.h" +#include "tc_defs.h" + +// The following stack sizes are defined in int.s +#define IRQ_STACK_SIZE 128 // Number of bytes in IRQ stack +#define FIQ_STACK_SIZE 512 // Number of bytes in FIQ stack. +#define SYSTEM_SIZE 1024 // Define the system stack size + +int vsi_o_trace (char * caller, unsigned long tclass, char * text); +int vsi_t_sleep (char * caller, unsigned long tvalue); + +void CST_stack_trace() +{ + int jndex, count, char_count; + TC_TCB *head, *ptr; + extern CS_NODE *TCD_Created_Tasks_List; + extern CS_NODE *TCD_Created_HISRs_List; + unsigned untouched; + char *top_stack, *top, *bottom; + extern char *TCT_System_Limit; + char result[80]; + char name[9]; + + vsi_o_trace("CST", 0x08, "Stack Info ..."); + vsi_o_trace("CST", 0x08, " Name top bottom current untouched"); + vsi_o_trace("CST", 0x08, "-------------------------------------------------"); + + for (jndex=0; jndex<2; jndex++) + { + // make use of TCB and HCB having same structure from beginning to past stack info + if (jndex == 0) + ptr = head = (TC_TCB *)TCD_Created_Tasks_List; + else { + ptr = head = (TC_TCB *)TCD_Created_HISRs_List; + vsi_o_trace("CST", 0x08, "-------------------------------------------------"); + } + + count = 0; + do + { + untouched = 0; + top_stack = (char *)ptr->tc_stack_start; + while (*top_stack == 0xFE && top_stack <= (char *)ptr->tc_stack_end) + { + untouched++; + top_stack++; + } + + // Avoid to get a spurious character when tasks names are 8 characters long + memcpy (name, ptr->tc_name, 8); + name[8] = 0; + + sprintf(result, "%8s: %08x %08x %08x 0x%x", + name, + ptr->tc_stack_start, + ptr->tc_stack_end, + ptr->tc_stack_pointer, + untouched); + vsi_o_trace("CST", 0x08, result); + vsi_t_sleep("",30); + + ptr = (TC_TCB*) ptr->tc_created.cs_next; + } while (ptr != head && count++ < 50); //count is protection from infinite loops + } // end of for (jndex=0; jndex<2; jndex++) + + // stack allocation algorithm from the int.s function INT_Initialize() + // + // \ \ + // \----------\ + // \ \ + // \ \ + // \ \ + // \ SYSSTACK \ + // \ \ + // \ \ + // \ \ + // \----------\ + // \ \ + // \ IRQSTACK \ + // \ \ + // \----------\ + // \ \ + // \ \ + // \ FIQSTACK \ + // \ \ + // \ \ + // \----------\ + // \ \ + + untouched = 0; + top_stack = top = (char *)TCT_System_Limit; + bottom = (char *) ((unsigned)TCT_System_Limit + SYSTEM_SIZE); + while (*top_stack == 0xFE && top_stack <= bottom) + { + untouched++; + top_stack++; + } + + // "CST" being the current active task with its related CST_Stack, + // the System Stack is unused (current sp_svc = System Stack Bottom) + sprintf(result, "SYSSTACK: %08x %08x %08x 0x%x", + top, + bottom, + bottom, // current sp_svc = System Stack Bottom + untouched); + vsi_o_trace("CST", 0x08, "-------------------------------------------------"); + vsi_o_trace("CST", 0x08, result); + vsi_t_sleep("",30); + + untouched = 0; + top_stack = top = bottom + 4; + bottom = (char *) ((unsigned)bottom + IRQ_STACK_SIZE); + while (*top_stack == 0xFE && top_stack <= bottom) + { + untouched++; + top_stack++; + } + + // Since the processor is in supervisor mode (no IRQ & no FIQ), + // current sp_irq = IRQ Stack bottom + sprintf(result, "IRQSTACK: %08x %08x %08x 0x%x", + top, + bottom, + bottom, // current sp_irq = IRQ Stack bottom + untouched); + vsi_o_trace("CST", 0x08, result); + vsi_t_sleep("",30); + + untouched = 0; + top_stack = top = bottom + 4; + bottom = (char *) ((unsigned)bottom + FIQ_STACK_SIZE); + while (*top_stack == 0xFE && top_stack <= bottom) + { + untouched++; + top_stack++; + } + + // Since the processor is in supervisor mode (no IRQ & no FIQ), + // current sp_fiq = FIQ Stack bottom + sprintf(result, "FIQSTACK: %08x %08x %08x 0x%x", + top, + bottom, + bottom, // current sp_fiq = FIQ Stack bottom + untouched); + vsi_o_trace("CST", 0x08, result); + vsi_o_trace("CST", 0x08, "-------------------------------------------------"); + vsi_t_sleep("",30); +} +