From faed89a33d39b13b88fbd3d680173b03055f4b49 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 16 Apr 2011 09:18:36 +0000 Subject: C++ demo for STM32. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2880 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-G++/main.cpp | 176 ++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 demos/ARMCM3-STM32F103-G++/main.cpp (limited to 'demos/ARMCM3-STM32F103-G++/main.cpp') diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp new file mode 100644 index 000000000..ce626ee9c --- /dev/null +++ b/demos/ARMCM3-STM32F103-G++/main.cpp @@ -0,0 +1,176 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011 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 . +*/ + +#include "ch.hpp" +#include "hal.h" +#include "test.h" +#include "evtimer.h" + +using namespace chibios_rt; + +/* + * LED blink sequences. + * NOTE: Sequences must always be terminated by a GOTO instruction. + * NOTE: The sequencer language could be easily improved but this is outside + * the scope of this demo. + */ +#define SLEEP 0 +#define GOTO 1 +#define STOP 2 +#define BITCLEAR 3 +#define BITSET 4 + +typedef struct { + uint8_t action; + uint32_t value; +} seqop_t; + +// Flashing sequence for LED1. +static const seqop_t LED1_sequence[] = +{ + {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 200}, + {BITSET, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 800}, + {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 400}, + {BITSET, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 600}, + {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 600}, + {BITSET, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 400}, + {BITCLEAR, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 800}, + {BITSET, PAL_PORT_BIT(GPIOC_LED)}, + {SLEEP, 200}, + {GOTO, 0} +}; + +/* + * Sequencer thread class. It can drive LEDs or other output pins. + * Any sequencer is just an instance of this class, all the details are + * totally encapsulated and hidden to the application level. + */ +class SequencerThread : public EnhancedThread<128> { +private: + const seqop_t *base, *curr; // Thread local variables. + +protected: + virtual msg_t Main(void) { + while (true) { + switch(curr->action) { + case SLEEP: + Sleep(curr->value); + break; + case GOTO: + curr = &base[curr->value]; + continue; + case STOP: + return 0; + case BITCLEAR: + palClearPort(GPIOC, curr->value); + break; + case BITSET: + palSetPort(GPIOC, curr->value); + break; + } + curr++; + } + } + +public: + SequencerThread(const seqop_t *sequence) : EnhancedThread<128>("sequencer") { + + base = curr = sequence; + } +}; + +/* + * Tester thread class. This thread executes the test suite. + */ +class TesterThread : public EnhancedThread<128> { + +protected: + virtual msg_t Main(void) { + + return TestThread(&SD2); + } + +public: + TesterThread(void) : EnhancedThread<128>("tester") { + } +}; + +/* + * Executed as an event handler at 500mS intervals. + */ +static void TimerHandler(eventid_t id) { + + (void)id; + if (palReadPad(GPIOA, GPIOA_BUTTON)) { + TesterThread tester; + tester.Wait(); + }; +} + +/* + * Application entry point. + */ +int main(void) { + static const evhandler_t evhndl[] = { + TimerHandler + }; + static EvTimer evt; + struct EventListener el0; + + /* + * System initializations. + * - HAL initialization, this also initializes the configured device drivers + * and performs the board-specific initializations. + * - Kernel initialization, the main() function becomes a thread and the + * RTOS is active. + */ + halInit(); + System::Init(); + + /* + * Activates the serial driver 2 using the driver default configuration. + */ + sdStart(&SD2, NULL); + + evtInit(&evt, 500); // Initializes an event timer. + evtStart(&evt); // Starts the event timer. + chEvtRegister(&evt.et_es, &el0, 0); // Registers a listener on the source. + + /* + * Starts several instances of the SequencerThread class, each one operating + * on a different LED. + */ + SequencerThread blinker1(LED1_sequence); + + /* + * Serves timer events. + */ + while (true) + Event::Dispatch(evhndl, Event::WaitOne(ALL_EVENTS)); + + return 0; +} -- cgit v1.2.3 From d43e444377e2f1e0db7ed93116e79c58c1520db7 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 17 Apr 2011 14:41:19 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@2884 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-G++/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'demos/ARMCM3-STM32F103-G++/main.cpp') diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp index ce626ee9c..aab7331fc 100644 --- a/demos/ARMCM3-STM32F103-G++/main.cpp +++ b/demos/ARMCM3-STM32F103-G++/main.cpp @@ -106,7 +106,7 @@ public: /* * Tester thread class. This thread executes the test suite. */ -class TesterThread : public EnhancedThread<128> { +class TesterThread : public EnhancedThread<256> { protected: virtual msg_t Main(void) { @@ -115,7 +115,7 @@ protected: } public: - TesterThread(void) : EnhancedThread<128>("tester") { + TesterThread(void) : EnhancedThread<256>("tester") { } }; -- cgit v1.2.3 From de5dcbba856524599a8f06d3a9bdbf1b01db44c2 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 21 Jan 2012 14:29:42 +0000 Subject: License text updated with new year. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3846 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-G++/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'demos/ARMCM3-STM32F103-G++/main.cpp') diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp index aab7331fc..431367d55 100644 --- a/demos/ARMCM3-STM32F103-G++/main.cpp +++ b/demos/ARMCM3-STM32F103-G++/main.cpp @@ -1,6 +1,6 @@ /* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011 Giovanni Di Sirio. + 2011,2012 Giovanni Di Sirio. This file is part of ChibiOS/RT. -- cgit v1.2.3 From 184a71345c6a36a9a8664eda8fbcc3ea728267a8 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 2 Feb 2013 10:58:09 +0000 Subject: Updated license years. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5102 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-G++/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'demos/ARMCM3-STM32F103-G++/main.cpp') diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp index 431367d55..7ad1d49de 100644 --- a/demos/ARMCM3-STM32F103-G++/main.cpp +++ b/demos/ARMCM3-STM32F103-G++/main.cpp @@ -1,6 +1,6 @@ /* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012 Giovanni Di Sirio. + 2011,2012,2013 Giovanni Di Sirio. This file is part of ChibiOS/RT. -- cgit v1.2.3 From 853216256ad4cdacf5f94edb7d6b738c6be165a1 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 30 Mar 2013 10:32:37 +0000 Subject: Relicensing parts of the tree under the Apache 2.0 license. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5521 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-G++/main.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) (limited to 'demos/ARMCM3-STM32F103-G++/main.cpp') diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp index 7ad1d49de..1aab98265 100644 --- a/demos/ARMCM3-STM32F103-G++/main.cpp +++ b/demos/ARMCM3-STM32F103-G++/main.cpp @@ -1,21 +1,17 @@ /* - ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, - 2011,2012,2013 Giovanni Di Sirio. + ChibiOS/RT - Copyright (C) 2006-2013 Giovanni Di Sirio - This file is part of ChibiOS/RT. + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at - 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. + http://www.apache.org/licenses/LICENSE-2.0 - 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 . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. */ #include "ch.hpp" -- cgit v1.2.3 From 4f0b993b4416e13f480ff4b4249244d3b2ac861b Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sun, 12 May 2013 08:47:26 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5728 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM3-STM32F103-G++/main.cpp | 53 +++++++++++++++---------------------- 1 file changed, 21 insertions(+), 32 deletions(-) (limited to 'demos/ARMCM3-STM32F103-G++/main.cpp') diff --git a/demos/ARMCM3-STM32F103-G++/main.cpp b/demos/ARMCM3-STM32F103-G++/main.cpp index 1aab98265..59ff88986 100644 --- a/demos/ARMCM3-STM32F103-G++/main.cpp +++ b/demos/ARMCM3-STM32F103-G++/main.cpp @@ -17,7 +17,6 @@ #include "ch.hpp" #include "hal.h" #include "test.h" -#include "evtimer.h" using namespace chibios_rt; @@ -65,16 +64,16 @@ static const seqop_t LED1_sequence[] = * Any sequencer is just an instance of this class, all the details are * totally encapsulated and hidden to the application level. */ -class SequencerThread : public EnhancedThread<128> { +class SequencerThread : public BaseStaticThread<128> { private: const seqop_t *base, *curr; // Thread local variables. protected: - virtual msg_t Main(void) { + virtual msg_t main(void) { while (true) { switch(curr->action) { case SLEEP: - Sleep(curr->value); + sleep(curr->value); break; case GOTO: curr = &base[curr->value]; @@ -93,7 +92,7 @@ protected: } public: - SequencerThread(const seqop_t *sequence) : EnhancedThread<128>("sequencer") { + SequencerThread(const seqop_t *sequence) : BaseStaticThread<128>() { base = curr = sequence; } @@ -102,40 +101,29 @@ public: /* * Tester thread class. This thread executes the test suite. */ -class TesterThread : public EnhancedThread<256> { +class TesterThread : public BaseStaticThread<256> { protected: - virtual msg_t Main(void) { + virtual msg_t main(void) { + + setName("tester"); return TestThread(&SD2); } public: - TesterThread(void) : EnhancedThread<256>("tester") { + TesterThread(void) : BaseStaticThread<256>() { } }; -/* - * Executed as an event handler at 500mS intervals. - */ -static void TimerHandler(eventid_t id) { - - (void)id; - if (palReadPad(GPIOA, GPIOA_BUTTON)) { - TesterThread tester; - tester.Wait(); - }; -} +/* Static threads instances.*/ +static TesterThread tester; +static SequencerThread blinker1(LED1_sequence); /* * Application entry point. */ int main(void) { - static const evhandler_t evhndl[] = { - TimerHandler - }; - static EvTimer evt; - struct EventListener el0; /* * System initializations. @@ -145,28 +133,29 @@ int main(void) { * RTOS is active. */ halInit(); - System::Init(); + System::init(); /* * Activates the serial driver 2 using the driver default configuration. */ sdStart(&SD2, NULL); - evtInit(&evt, 500); // Initializes an event timer. - evtStart(&evt); // Starts the event timer. - chEvtRegister(&evt.et_es, &el0, 0); // Registers a listener on the source. - /* * Starts several instances of the SequencerThread class, each one operating * on a different LED. */ - SequencerThread blinker1(LED1_sequence); + blinker1.start(NORMALPRIO + 10); /* * Serves timer events. */ - while (true) - Event::Dispatch(evhndl, Event::WaitOne(ALL_EVENTS)); + while (true) { + if (palReadPad(GPIOA, GPIOA_BUTTON)) { + tester.start(NORMALPRIO); + tester.wait(); + }; + BaseThread::sleep(MS2ST(500)); + } return 0; } -- cgit v1.2.3