aboutsummaryrefslogtreecommitdiffstats
path: root/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF
diff options
context:
space:
mode:
Diffstat (limited to 'demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF')
-rw-r--r--demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/main.c40
-rw-r--r--demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/readme.txt29
2 files changed, 40 insertions, 29 deletions
diff --git a/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/main.c b/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/main.c
index 145e068..25ffd87 100644
--- a/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/main.c
+++ b/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/main.c
@@ -66,33 +66,37 @@ static char buffer_a, buffer_b, buffer_c;
static const char text[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
-/*
- * Reads from the front buffer.
+/**
+ * @brief Reads from the front buffer.
+ *
+ * @return Buffered character from @p text or special symbol.
+ * @retval '.' No new front buffer within timeout.
*/
static char read_front(void) {
const char *front;
msg_t error;
+ char c;
/* Wait until a new front buffer gets available with prepared data */
- chSysLock();
- error = tribufWaitReadyTimeoutS(&tribuf_handler, reader_timeout);
- if (error == MSG_TIMEOUT) {
- chSysUnlock();
- return (reader_timeout == TIME_IMMEDIATE) ? '.' : '@';
+ error = tribufWaitReadyTimeout(&tribuf_handler, reader_timeout);
+ if (error == MSG_OK) {
+ /* Retrieve the new front buffer */
+ tribufSwapFront(&tribuf_handler);
+ front = (const char *)tribufGetFront(&tribuf_handler);
+
+ /* Read data from the new front buffer */
+ c = front[0];
+ } else {
+ c = '.'; /* Timeout placeholder */
}
- chSysUnlock();
-
- /* Retrieve the new front buffer */
- tribufSwapFront(&tribuf_handler);
- front = (const char *)tribufGetFront(&tribuf_handler);
-
- /* Read data from the new front buffer */
- return front[0];
+ return c;
}
/*
- * Overwrites the back buffer with the provided character.
+ * @brief Overwrites the back buffer with the provided character.
+ *
+ * @param[in] c Character to store into the current back buffer.
*/
static void write_back(char c) {
@@ -123,9 +127,11 @@ static THD_FUNCTION(reader_thread, arg) {
old_priority = chThdGetPriorityX();
for (;;) {
+ /* Read from the fron buffer and print the retrieved character */
c = read_front();
chprintf(chout, "%c", c);
+ /* Change priority, suspend or delay */
osalSysLock();
palTogglePad(GPIOG, GPIOG_LED3_GREEN);
if (old_priority != reader_priority) {
@@ -160,9 +166,11 @@ static THD_FUNCTION(writer_thread, arg) {
for (;;) {
for (i = 0; i < sizeof(text); ++i) {
+ /* Write the next character on the current back buffer */
c = text[i];
write_back(c);
+ /* Change priority, suspend or delay */
osalSysLock();
palTogglePad(GPIOG, GPIOG_LED4_RED);
if (old_priority != writer_priority) {
diff --git a/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/readme.txt b/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/readme.txt
index 7a0b396..cc7f406 100644
--- a/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/readme.txt
+++ b/demos/STM32/RT-STM32F429-DISCOVERY-TRIBUF/readme.txt
@@ -8,20 +8,23 @@ The demo runs on an ST STM32F429I-Discovery board.
** The Demo **
-A simple command shell is activated on virtual serial port SD1.
-TODO
+This demo shows how to use a triple buffer handler, with one writer thread and
+one reader thread.
+The writer thread puts a character into the current back buffer, thus swapping
+the back buffer with the orphan buffer for a new write. The writer then sleeps
+for a specified delay in milliseconds.
+The reader thread gets waits (if there is a timeout) until the orphan buffer
+contains available data, becoming the new front buffer. The character is read
+from the new front buffer and printed. The reader then sleeps for a specified
+delay in milliseconds.
+A simple command shell is activated on virtual serial port SD1 or SDU1.
+Via command line it is possible to start, stop, set the delay, and set the
+thread priority of the reader and writer threads.
+The reader can also be assigned a wait timeout in milliseconds, with special
+cases of "*" for infinite timeout, and "-" (or 0 ms) for none.
** Build Procedure **
-The demo has been tested by using the free Codesourcery GCC-based toolchain
-and YAGARTO. just modify the TRGT line in the makefile in order to use
+The demo has been tested by using the free GNU Tools ARM Embedded toolchain
+and ChibiStudio. Just modify the TRGT line in the makefile in order to use
different GCC toolchains.
-
-** Notes **
-
-Some files used by the demo are not part of ChibiOS/RT but are copyright of
-ST Microelectronics and are licensed under a different license.
-Also note that not all the files present in the ST library are distributed
-with ChibiOS/RT, you can find the whole library on the ST web site:
-
- http://www.st.com