function decode_stack(sp) { var i; var a = new Array(); sp += 4; /* skip stored ulCriticalNesting */ a[16] = Debug.evaluate("*(unsigned long*)" + sp); for (i = 0; i <= 15; i++) { sp += 4; a[i] = Debug.evaluate("*(unsigned long*)" + sp); } return a; } function add_task(task, state) { var tcb, task_name, current_task, regs; current_task = Debug.evaluate("pxCurrentTCB"); tcb = Debug.evaluate("*(tskTCB *)" + task); task_name = Debug.evaluate("(char*)&(*(tskTCB *)" + task + ").pcTaskName[0]"); task_name = "#" + tcb.uxTCBNumber + " \"" + task_name + "\""; if (task == current_task) { state = "executing"; regs = []; } else { regs = decode_stack(tcb.pxTopOfStack); } Threads.add(task_name, tcb.uxPriority, state, regs); } function add_list(list, state) { var i, index, item, task; if (list && list.uxNumberOfItems>0) { index = list.xListEnd.pxNext; for (i = 0; i < list.uxNumberOfItems; i++) { item = Debug.evaluate("*(ListItem_t *)" + index); task = item ? item.pvOwner : 0; if (task) add_task(task, state); index = item.pxNext; } } } function update() { var i, list, lists, max_priority; Threads.clear(); if( Debug.evaluate("pxCurrentTCB") == 0 ) return; max_priority = Debug.evaluate("uxTopUsedPriority"); Threads.newqueue("Ready"); for (i = max_priority; i >= 0; i--) { list = Debug.evaluate("pxReadyTasksLists[" + i + "]"); add_list(list, "ready"); } Threads.newqueue("Blocked"); list = Debug.evaluate("pxDelayedTaskList"); if (list) { list = Debug.evaluate("*(xList *)" + list); add_list(list, "blocked"); } list = Debug.evaluate("pxOverflowDelayedTaskList"); if (list) { list = Debug.evaluate("*(xList *)" + list); add_list(list, "blocked"); } Threads.newqueue("Suspended"); list = Debug.evaluate("xSuspendedTaskList"); if (list) { add_list(list, "suspended"); } }