diff options
-rw-r--r-- | demos/Win32-MinGW/main.c | 57 | ||||
-rw-r--r-- | os/kernel/include/memcore.h | 1 | ||||
-rw-r--r-- | os/kernel/src/chmemcore.c | 30 | ||||
-rw-r--r-- | os/kernel/src/chregistry.c | 2 | ||||
-rw-r--r-- | readme.txt | 6 |
5 files changed, 83 insertions, 13 deletions
diff --git a/demos/Win32-MinGW/main.c b/demos/Win32-MinGW/main.c index 11123bffb..b43ad24db 100644 --- a/demos/Win32-MinGW/main.c +++ b/demos/Win32-MinGW/main.c @@ -32,7 +32,60 @@ static Thread *cdtp; static Thread *shelltp1;
static Thread *shelltp2;
-void cmd_test(BaseChannel *chp, int argc, char *argv[]) {
+static void cmd_mem(BaseChannel *chp, int argc, char *argv[]) {
+ size_t n, size;
+ char buf[52];
+
+ (void)argv;
+ if (argc > 0) {
+ shellPrintLine(chp, "Usage: mem");
+ return;
+ }
+ n = chHeapStatus(NULL, &size);
+ sprintf(buf, "core free memory : %i bytes", chCoreFree());
+ shellPrintLine(chp, buf);
+ sprintf(buf, "heap fragments : %i", n);
+ shellPrintLine(chp, buf);
+ sprintf(buf, "heap free total : %i bytes", size);
+ shellPrintLine(chp, buf);
+}
+
+static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) {
+ static const char *states[] = {
+ "READY",
+ "CURRENT",
+ "SUSPENDED",
+ "WTSEM",
+ "WTMTX",
+ "WTCOND",
+ "SLEEPING",
+ "WTEXIT",
+ "WTOREVT",
+ "WTANDEVT",
+ "SNDMSG",
+ "WTMSG",
+ "FINAL"
+ };
+ Thread *tp;
+ char buf[60];
+
+ (void)argv;
+ if (argc > 0) {
+ shellPrintLine(chp, "Usage: threads");
+ return;
+ }
+ shellPrintLine(chp, " addr stack prio refs state time");
+ tp = chRegFirstThread();
+ do {
+ sprintf(buf, "%8p %8p %4i %4i %9s %i",
+ tp, tp->p_ctx.esp, tp->p_prio, tp->p_refs - 1,
+ states[tp->p_state], tp->p_time);
+ shellPrintLine(chp, buf);
+ tp = chRegNextThread(tp);
+ } while (tp != NULL);
+}
+
+static void cmd_test(BaseChannel *chp, int argc, char *argv[]) {
Thread *tp;
(void)argv;
@@ -50,6 +103,8 @@ void cmd_test(BaseChannel *chp, int argc, char *argv[]) { }
static const ShellCommand commands[] = {
+ {"mem", cmd_mem},
+ {"threads", cmd_threads},
{"test", cmd_test},
{NULL, NULL}
};
diff --git a/os/kernel/include/memcore.h b/os/kernel/include/memcore.h index 7c11e03c3..d9675f1db 100644 --- a/os/kernel/include/memcore.h +++ b/os/kernel/include/memcore.h @@ -64,6 +64,7 @@ extern "C" { void core_init(void);
void *chCoreAlloc(size_t size);
void *chCoreAllocI(size_t size);
+ size_t chCoreFree(void);
#ifdef __cplusplus
}
#endif
diff --git a/os/kernel/src/chmemcore.c b/os/kernel/src/chmemcore.c index 65962bde1..6cf42788b 100644 --- a/os/kernel/src/chmemcore.c +++ b/os/kernel/src/chmemcore.c @@ -32,9 +32,8 @@ static uint8_t *nextmem; static uint8_t *endmem;
/**
- * @brief Low level memory manager initialization. - *
- * @note Internal use only.
+ * @brief Low level memory manager initialization.
+ * @note Internal use only.
*/
void core_init(void) {
#if CH_MEMCORE_SIZE == 0
@@ -50,15 +49,15 @@ void core_init(void) { }
/**
- * @brief Allocates a memory block.
+ * @brief Allocates a memory block.
* @details The size of the returned block is aligned to the alignment
* type @p align_t so it is not possible to allocate less than
* <code>sizeof(align_t)</code>.
*
*
- * @param[in] size the size of the block to be allocated
- * @return A pointer to the allocated memory block.
- * @retval NULL allocation failed, core memory exhausted. + * @param[in] size the size of the block to be allocated
+ * @return A pointer to the allocated memory block.
+ * @retval NULL allocation failed, core memory exhausted. */
void *chCoreAlloc(size_t size) {
void *p;
@@ -70,14 +69,14 @@ void *chCoreAlloc(size_t size) { }
/**
- * @brief Allocates a memory block.
+ * @brief Allocates a memory block.
* @details The size of the returned block is aligned to the alignment
* type @p align_t so it is not possible to allocate less than
* <code>sizeof(align_t)</code>.
*
- * @param[in] size the size of the block to be allocated.
- * @return A pointer to the allocated memory block.
- * @retval NULL allocation failed, core memory exhausted.
+ * @param[in] size the size of the block to be allocated.
+ * @return A pointer to the allocated memory block.
+ * @retval NULL allocation failed, core memory exhausted.
*/
void *chCoreAllocI(size_t size) {
void *p;
@@ -90,6 +89,15 @@ void *chCoreAllocI(size_t size) { return p;
}
+/**
+ * @brief Core memory left.
+ *
+ * @return The size, in bytes, of the free core memory. + */
+size_t chCoreFree(void) {
+
+ return (size_t)(endmem - nextmem);
+}
#endif /* CH_USE_MEMCORE */
/** @} */
diff --git a/os/kernel/src/chregistry.c b/os/kernel/src/chregistry.c index 186d97e35..b02d5f1fb 100644 --- a/os/kernel/src/chregistry.c +++ b/os/kernel/src/chregistry.c @@ -33,6 +33,8 @@ * the main thread unless it terminated.
* @note A reference is added to the returned thread in order to make sure
* it status is not lost.
+ * @note This function cannot return @p NULL because there is always at
+ * least one thread in the system.
*
* @return A reference to the first thread. */
diff --git a/readme.txt b/readme.txt index 1f67010fd..98024b9e0 100644 --- a/readme.txt +++ b/readme.txt @@ -62,7 +62,11 @@ - NEW: Implemented a new threads registry subsystem, the registry allows to
enumerate the active threads at runtime. The registry is meant as both
a runtime API and a support for debuggers.
-
+- NEW: New chCoreFree() API that returns the core memory left.
+- NEW: Added to the simulators shell demos two new commands: threads and mem,
+ that show the active threads (using the new registry) and the memory
+ allocators state.
+
*** 1.5.0 ***
- FIX: Fixed missing dependencies check for CH_USE_DYNAMIC (bug 2942757)
(backported in 1.4.1).
|