Revision 50d6d0b6
core/src/aos_system.c | ||
---|---|---|
1008 | 1008 |
|
1009 | 1009 |
/** |
1010 | 1010 |
* @brief Stops the system and all related threads (not the thread this function is called from). |
1011 |
* |
|
1012 |
* @note Only the control thread (detected by initial thread priority) may call this function. |
|
1011 | 1013 |
*/ |
1012 | 1014 |
void aosSysStop(void) |
1013 | 1015 |
{ |
1016 |
// only the control thread may call this function |
|
1017 |
aosDbgAssert(chThdGetPriorityX() == AOS_THD_CTRLPRIO); |
|
1018 |
|
|
1019 |
// local variables |
|
1020 |
tprio_t prio; |
|
1021 |
thread_t* tp; |
|
1022 |
#if (AMIROOS_CFG_DBG == true) |
|
1023 |
aos_timestamp_t tprint = 0; |
|
1024 |
aos_timestamp_t tnow; |
|
1025 |
#endif /* (AMIROOS_CFG_DBG == true) */ |
|
1026 |
|
|
1014 | 1027 |
// wait until the calling thread is the only remaining active thread |
1015 | 1028 |
#if (CH_CFG_NO_IDLE_THREAD == TRUE) |
1016 | 1029 |
while (_numActiveThreads() > 1) { |
1017 | 1030 |
#else /* (CH_CFG_NO_IDLE_THREAD == TRUE) */ |
1018 | 1031 |
while (_numActiveThreads() > 2) { |
1019 | 1032 |
#endif /* (CH_CFG_NO_IDLE_THREAD == TRUE) */ |
1020 |
aosDbgPrintf("waiting for all threads to terminate...\n"); |
|
1021 |
chThdYield(); |
|
1033 |
|
|
1034 |
#if (AMIROOS_CFG_DBG == true) |
|
1035 |
aosSysGetUptime(&tnow); |
|
1036 |
// print a message once per second |
|
1037 |
if (tnow - tprint >= MICROSECONDS_PER_SECOND) { |
|
1038 |
aosDbgPrintf("waiting for all threads to terminate...\n"); |
|
1039 |
tprint = tnow; |
|
1040 |
} |
|
1041 |
#endif /* (AMIROOS_CFG_DBG == true) */ |
|
1042 |
|
|
1043 |
// detect highest priority of all threads but the calling one |
|
1044 |
prio = NOPRIO; |
|
1045 |
chSysLock(); |
|
1046 |
tp = aosThreadGetFirst(); |
|
1047 |
while (tp) { |
|
1048 |
// skip the calling thread |
|
1049 |
if (tp != chThdGetSelfX()) { |
|
1050 |
#if (CH_CFG_USE_MUTEXES == TRUE) |
|
1051 |
const tprio_t tprio = tp->realprio; |
|
1052 |
#else /* (CH_CFG_USE_MUTEXES == TRUE) */ |
|
1053 |
const tprio_t tprio = tp->prio; |
|
1054 |
#endif /* (CH_CFG_USE_MUTEXES == TRUE) */ |
|
1055 |
if (tprio > prio) { |
|
1056 |
prio = tprio; |
|
1057 |
} |
|
1058 |
} |
|
1059 |
tp = aosThreadGetNext(tp); |
|
1060 |
} |
|
1061 |
chSysUnlock(); |
|
1062 |
|
|
1063 |
aosDbgAssert(prio <= chThdGetPriorityX()); |
|
1064 |
|
|
1065 |
// lower calling thread priority as required or yield CPU to another thread with equal priority |
|
1066 |
if (prio < chThdGetPriorityX()) { |
|
1067 |
chThdSetPriority(prio); |
|
1068 |
} else { |
|
1069 |
chThdYield(); |
|
1070 |
} |
|
1022 | 1071 |
} |
1023 | 1072 |
|
1073 |
// restore priority |
|
1074 |
chThdSetPriority(AOS_THD_CTRLPRIO); |
|
1075 |
|
|
1024 | 1076 |
return; |
1025 | 1077 |
} |
1026 | 1078 |
|
Also available in: Unified diff