| 88 |
88 |
static int _shellcmd_configcb(BaseSequentialStream* stream, int argc, char* argv[]);
|
| 89 |
89 |
static int _shellcmd_infocb(BaseSequentialStream* stream, int argc, char* argv[]);
|
| 90 |
90 |
static int _shellcmd_shutdowncb(BaseSequentialStream* stream, int argc, char* argv[]);
|
| 91 |
|
#if ((CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
|
91 |
#if (((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
| 92 |
92 |
static int _shellcmd_cpuloadcb(BaseSequentialStream* stream, int argc, char* argv[]);
|
| 93 |
|
#endif /* (CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE) */
|
|
93 |
#endif /* ((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE) */
|
| 94 |
94 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
|
| 95 |
95 |
static int _shellcmd_kerneltestcb(BaseSequentialStream* stream, int argc, char* argv[]);
|
| 96 |
96 |
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
|
| ... | ... | |
| 147 |
147 |
static AOS_SHELL_COMMAND(_shellcmd_shutdown, "module:shutdown", _shellcmd_shutdowncb);
|
| 148 |
148 |
#endif /* (AMIROOS_CFG_SSSP_ENABLE == true) */
|
| 149 |
149 |
|
| 150 |
|
#if ((CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
|
150 |
#if (((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
| 151 |
151 |
|
| 152 |
152 |
/**
|
| 153 |
153 |
* @brief Shell command to read out CPU load.
|
| 154 |
154 |
*/
|
| 155 |
155 |
static AOS_SHELL_COMMAND(_shellcmd_cpuload, "module:cpuload", _shellcmd_cpuloadcb);
|
| 156 |
156 |
|
| 157 |
|
#endif /* (CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE) */
|
|
157 |
#endif /* ((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE) */
|
| 158 |
158 |
|
| 159 |
159 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
|
| 160 |
160 |
|
| ... | ... | |
| 643 |
643 |
#endif /* (AMIROOS_CFG_BOOTLOADER == X) */
|
| 644 |
644 |
}
|
| 645 |
645 |
|
| 646 |
|
#if ((CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
|
646 |
#if (((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
| 647 |
647 |
|
| 648 |
648 |
/**
|
| 649 |
649 |
* @brief Callback function for the module:cpuload shell command.
|
| ... | ... | |
| 663 |
663 |
|
| 664 |
664 |
// local variables
|
| 665 |
665 |
rttime_t sum = 0;
|
| 666 |
|
thread_t* thd = chRegFirstThread();
|
|
666 |
thread_t* thd = aosThreadGetFirst();
|
| 667 |
667 |
|
| 668 |
668 |
// accumulate system load
|
| 669 |
669 |
do {
|
| 670 |
670 |
sum += thd->stats.cumulative;
|
| 671 |
|
thd = chRegNextThread(thd);
|
|
671 |
thd = aosThreadGetNext(thd);
|
| 672 |
672 |
} while (thd);
|
| 673 |
673 |
sum += ch.kernel_stats.m_crit_thd.cumulative;
|
| 674 |
674 |
sum += ch.kernel_stats.m_crit_isr.cumulative;
|
| 675 |
675 |
|
| 676 |
676 |
// retrieve, calculate and print performance measures
|
| 677 |
677 |
chprintf(stream, "threads & critical zones:\n");
|
| 678 |
|
thd = chRegFirstThread();
|
|
678 |
thd = aosThreadGetFirst();
|
| 679 |
679 |
do {
|
|
680 |
#if (CH_CFG_USE_REGISTRY == TRUE)
|
| 680 |
681 |
chprintf(stream, "\t%22s: %6.2f%%\n",
|
| 681 |
682 |
(thd->name != NULL) ? thd->name : "<unnamed thread>",
|
| 682 |
683 |
(double)((float)thd->stats.cumulative / (float)sum * 100.f));
|
| 683 |
|
thd = chRegNextThread(thd);
|
|
684 |
#else
|
|
685 |
chprintf(stream, "\t thread 0x%08X: %6.2f%%\n", (unsigned int)thd, (double)((float)thd->stats.cumulative / (float)sum * 100.f));
|
|
686 |
#endif
|
|
687 |
thd = aosThreadGetNext(thd);
|
| 684 |
688 |
} while (thd);
|
| 685 |
689 |
chprintf(stream, "\t%22s: %6.2f%%\n",
|
| 686 |
690 |
"thread critical zones",
|
| ... | ... | |
| 701 |
705 |
return 0;
|
| 702 |
706 |
}
|
| 703 |
707 |
|
| 704 |
|
#endif /* (CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE) */
|
|
708 |
#endif /* ((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE) */
|
| 705 |
709 |
|
| 706 |
710 |
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
|
| 707 |
711 |
|
| ... | ... | |
| 780 |
784 |
{
|
| 781 |
785 |
size_t threads = 0;
|
| 782 |
786 |
|
| 783 |
|
#if (CH_CFG_USE_REGISTRY == TRUE)
|
| 784 |
|
thread_t* tp = chRegFirstThread();
|
|
787 |
thread_t* tp = aosThreadGetFirst();
|
| 785 |
788 |
while (tp) {
|
| 786 |
789 |
threads += (tp->state != CH_STATE_FINAL) ? 1 : 0;
|
| 787 |
|
tp = chRegNextThread(tp);
|
|
790 |
tp = aosThreadGetNext(tp);
|
| 788 |
791 |
}
|
| 789 |
|
#elif (CH_CFG_USE_THREADHIERARCHY == TRUE)
|
| 790 |
|
enum {
|
| 791 |
|
TRAVERSE_DOWN,
|
| 792 |
|
TRAVERSE_UP,
|
| 793 |
|
} traverse = TRAVERSE_UP;
|
| 794 |
|
thread_t* tp = chThdGetSelfX();
|
| 795 |
|
// traverse to root thread
|
| 796 |
|
while (tp->parent) {
|
| 797 |
|
tp = tp->parent;
|
| 798 |
|
}
|
| 799 |
|
// systematically count all threads
|
| 800 |
|
traverse = TRAVERSE_DOWN;
|
| 801 |
|
while (tp) {
|
| 802 |
|
if (traverse == TRAVERSE_DOWN && tp->children) {
|
| 803 |
|
tp = tp->children;
|
| 804 |
|
} else {
|
| 805 |
|
threads += (tp->state != CH_STATE_FINAL) ? 1 : 0;
|
| 806 |
|
if (tp->sibling) {
|
| 807 |
|
tp = tp->sibling;
|
| 808 |
|
traverse = TRAVERSE_DOWN;
|
| 809 |
|
} else {
|
| 810 |
|
tp = tp->parent;
|
| 811 |
|
traverse = TRAVERSE_UP;
|
| 812 |
|
}
|
| 813 |
|
}
|
| 814 |
|
}
|
| 815 |
|
#endif
|
| 816 |
792 |
|
| 817 |
793 |
return threads;
|
| 818 |
794 |
}
|
| ... | ... | |
| 870 |
846 |
aosShellAddCommand(&aos.shell, &_shellcmd_config);
|
| 871 |
847 |
aosShellAddCommand(&aos.shell, &_shellcmd_info);
|
| 872 |
848 |
aosShellAddCommand(&aos.shell, &_shellcmd_shutdown);
|
| 873 |
|
#if ((CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
|
849 |
#if (((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE)) || defined(__DOXYGEN__)
|
| 874 |
850 |
aosShellAddCommand(&aos.shell, &_shellcmd_cpuload);
|
| 875 |
|
#endif /* (CH_CFG_USE_REGISTRY == TRUE) && (CH_DBG_STATISTICS == TRUE) */
|
|
851 |
#endif /* ((CH_CFG_USE_REGISTRY == TRUE) || (CH_CFG_USE_THREADHIERARCHY == TRUE)) && (CH_DBG_STATISTICS == TRUE) */
|
| 876 |
852 |
#if (AMIROOS_CFG_TESTS_ENABLE == true)
|
| 877 |
853 |
aosShellAddCommand(&aos.shell, &_shellcmd_kerneltest);
|
| 878 |
854 |
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
|