summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2013-10-22 16:22:14 -0700
committerBernard Xiong <[email protected]>2013-10-22 16:22:14 -0700
commitd327f4a25a155866eafcb2f1292545ff15839b97 (patch)
tree0c3ed9f1408f09dfdc95563e4354eb299e9d9b99 /examples
parenta3bf5e2d9b12482a0552bb96bfa091e4b80c79df (diff)
parenta391e0a89307258b54e2599368963ce95fa7e7d3 (diff)
Merge pull request #183 from grissiom/log_trace-in-mem
Log trace in mem
Diffstat (limited to 'examples')
-rw-r--r--examples/log_trace/memlog.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/examples/log_trace/memlog.c b/examples/log_trace/memlog.c
new file mode 100644
index 0000000000..a94e77fe7e
--- /dev/null
+++ b/examples/log_trace/memlog.c
@@ -0,0 +1,52 @@
+#include <rtthread.h>
+#include <rtdevice.h>
+#include <log_trace.h>
+
+#define PIPE_SZ 2048
+#define PIPE_NAME "lgpipe"
+
+static rt_uint8_t pipebuf[PIPE_SZ];
+static struct rt_pipe_device pipedev;
+
+static rt_uint8_t outbuf[1024];
+void memlog_flush(void)
+{
+ rt_size_t remainsz, readsz;
+ rt_device_t console;
+
+ console = rt_console_get_device();
+
+ if (!console)
+ return;
+
+ rt_device_control((rt_device_t)&pipedev, PIPE_CTRL_GET_SPACE, &remainsz);
+ if (remainsz == 0)
+ {
+ rt_kprintf("logtrace pipe "PIPE_NAME" is full, some log may lost\n");
+ }
+
+ readsz = rt_device_read((rt_device_t)&pipedev, 0, outbuf, sizeof(outbuf));
+ if (readsz)
+ rt_device_write(console, 0, outbuf, readsz);
+}
+
+void memlog_init(void)
+{
+ rt_err_t res;
+
+ /* make sure the RT_PIPE_FLAG_BLOCK_RD is not set. The Idle should not be
+ * blocked. RT_PIPE_FLAG_FORCE_WR will let the pipe discard some old data
+ * when pipe is full. */
+ res = rt_pipe_init(&pipedev, PIPE_NAME, RT_PIPE_FLAG_FORCE_WR,
+ pipebuf, sizeof(pipebuf));
+ if (res != RT_EOK)
+ {
+ rt_kprintf("init pipe device failed: %d\n", res);
+ return;
+ }
+
+ log_trace_set_device(PIPE_NAME);
+
+ rt_thread_idle_sethook(memlog_flush);
+}
+