aboutsummaryrefslogtreecommitdiffstats
path: root/demos/Posix-GCC/main.c
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-02-21 11:29:54 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2010-02-21 11:29:54 +0000
commit0a09cc089d0c8947b4309952482a24a1cafd2477 (patch)
treeeda41b0dbd6e1edc56dede5e3a52a113df65ec34 /demos/Posix-GCC/main.c
parent1c03b33539fac79a32ac10db444a1b0a7af0d65f (diff)
downloadChibiOS-0a09cc089d0c8947b4309952482a24a1cafd2477.tar.gz
ChibiOS-0a09cc089d0c8947b4309952482a24a1cafd2477.tar.bz2
ChibiOS-0a09cc089d0c8947b4309952482a24a1cafd2477.zip
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1650 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'demos/Posix-GCC/main.c')
-rw-r--r--demos/Posix-GCC/main.c222
1 files changed, 222 insertions, 0 deletions
diff --git a/demos/Posix-GCC/main.c b/demos/Posix-GCC/main.c
new file mode 100644
index 000000000..28e136bc8
--- /dev/null
+++ b/demos/Posix-GCC/main.c
@@ -0,0 +1,222 @@
+/*
+ ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.
+
+ This file is part of ChibiOS/RT.
+
+ ChibiOS/RT is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS/RT is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdio.h>
+
+#include "ch.h"
+#include "hal.h"
+#include "test.h"
+#include "shell.h"
+
+#define SHELL_WA_SIZE THD_WA_SIZE(4096)
+#define CONSOLE_WA_SIZE THD_WA_SIZE(4096)
+#define TEST_WA_SIZE THD_WA_SIZE(4096)
+
+#define cputs(msg) chMsgSend(cdtp, (msg_t)msg)
+
+static Thread *cdtp;
+static Thread *shelltp1;
+static Thread *shelltp2;
+
+void cmd_test(BaseChannel *chp, int argc, char *argv[]) {
+ Thread *tp;
+
+ (void)argv;
+ if (argc > 0) {
+ shellPrintLine(chp, "Usage: test");
+ return;
+ }
+ tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(),
+ TestThread, chp);
+ if (tp == NULL) {
+ shellPrintLine(chp, "out of memory");
+ return;
+ }
+ chThdWait(tp);
+}
+
+static const ShellCommand commands[] = {
+ {"test", cmd_test},
+ {NULL, NULL}
+};
+
+static const ShellConfig shell_cfg1 = {
+ (BaseChannel *)&SD1,
+ commands
+};
+
+static const ShellConfig shell_cfg2 = {
+ (BaseChannel *)&SD2,
+ commands
+};
+
+/*
+ * Console print server done using synchronous messages. This makes the access
+ * to the C printf() thread safe and the print operation atomic among threads.
+ * In this example the message is the zero termitated string itself.
+ */
+static msg_t console_thread(void *arg) {
+
+ (void)arg;
+ while (!chThdShouldTerminate()) {
+ puts((char *)chMsgWait());
+ fflush(stdout);
+ chMsgRelease(RDY_OK);
+ }
+ return 0;
+}
+
+/**
+ * @brief Shell termination handler.
+ *
+ * @param[in] id event id.
+ */
+static void termination_handler(eventid_t id) {
+
+ (void)id;
+ if (shelltp1 && chThdTerminated(shelltp1)) {
+ chThdWait(shelltp1);
+ shelltp1 = NULL;
+ chThdSleepMilliseconds(10);
+ cputs("Init: shell on SD1 terminated");
+ chSysLock();
+ chOQResetI(&SD1.oqueue);
+ chSysUnlock();
+ }
+ if (shelltp2 && chThdTerminated(shelltp2)) {
+ chThdWait(shelltp2);
+ shelltp2 = NULL;
+ chThdSleepMilliseconds(10);
+ cputs("Init: shell on SD2 terminated");
+ chSysLock();
+ chOQResetI(&SD2.oqueue);
+ chSysUnlock();
+ }
+}
+
+/**
+ * @brief SD1 status change handler.
+ *
+ * @param[in] id event id.
+ */
+static void sd1_handler(eventid_t id) {
+
+ sdflags_t flags;
+
+ (void)id;
+ flags = sdGetAndClearFlags(&SD1);
+ if ((flags & SD_CONNECTED) && (shelltp1 == NULL)) {
+ cputs("Init: connection on SD1");
+ shelltp1 = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO + 1);
+ }
+ if (flags & SD_DISCONNECTED) {
+ cputs("Init: disconnection on SD1");
+ chSysLock();
+ chIQResetI(&SD1.iqueue);
+ chSysUnlock();
+ }
+}
+
+/**
+ * @brief SD2 status change handler.
+ *
+ * @param[in] id event id.
+ */
+static void sd2_handler(eventid_t id) {
+
+ sdflags_t flags;
+
+ (void)id;
+ flags = sdGetAndClearFlags(&SD2);
+ if ((flags & SD_CONNECTED) && (shelltp2 == NULL)) {
+ cputs("Init: connection on SD2");
+ shelltp2 = shellCreate(&shell_cfg2, SHELL_WA_SIZE, NORMALPRIO + 10);
+ }
+ if (flags & SD_DISCONNECTED) {
+ cputs("Init: disconnection on SD2");
+ chSysLock();
+ chIQResetI(&SD2.iqueue);
+ chSysUnlock();
+ }
+}
+
+static evhandler_t fhandlers[] = {
+ termination_handler,
+ sd1_handler,
+ sd2_handler
+};
+
+/*------------------------------------------------------------------------*
+ * Simulator main. *
+ *------------------------------------------------------------------------*/
+int main(void) {
+ EventListener sd1fel, sd2fel, tel;
+
+ /*
+ * HAL initialization.
+ */
+ halInit();
+
+ /*
+ * ChibiOS/RT initialization.
+ */
+ chSysInit();
+
+ /*
+ * Serial ports (simulated) initialization.
+ */
+ sdStart(&SD1, NULL);
+ sdStart(&SD2, NULL);
+
+ /*
+ * Shell manager initialization.
+ */
+ shellInit();
+ chEvtRegister(&shell_terminated, &tel, 0);
+
+ /*
+ * Console thread started.
+ */
+ cdtp = chThdCreateFromHeap(NULL, CONSOLE_WA_SIZE, NORMALPRIO + 1,
+ console_thread, NULL);
+
+ /*
+ * Initializing connection/disconnection events.
+ */
+ cputs("Shell service started on SD1, SD2");
+ cputs(" - Listening for connections on SD1");
+ (void) sdGetAndClearFlags(&SD1);
+ chEvtRegister(&SD1.sevent, &sd1fel, 1);
+ cputs(" - Listening for connections on SD2");
+ (void) sdGetAndClearFlags(&SD2);
+ chEvtRegister(&SD2.sevent, &sd2fel, 2);
+
+ /*
+ * Events servicing loop.
+ */
+ while (!chThdShouldTerminate())
+ chEvtDispatch(fhandlers, chEvtWaitOne(ALL_EVENTS));
+
+ /*
+ * Clean simulator exit.
+ */
+ chEvtUnregister(&SD1.sevent, &sd1fel);
+ chEvtUnregister(&SD2.sevent, &sd2fel);
+ return 0;
+}