| 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"); | |
| } | |
| } | |