aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/nRF5_SDK_15.0.0_a53641a/external/protothreads/pt-1.4/example-small.c
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/nRF5_SDK_15.0.0_a53641a/external/protothreads/pt-1.4/example-small.c')
-rw-r--r--thirdparty/nRF5_SDK_15.0.0_a53641a/external/protothreads/pt-1.4/example-small.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/thirdparty/nRF5_SDK_15.0.0_a53641a/external/protothreads/pt-1.4/example-small.c b/thirdparty/nRF5_SDK_15.0.0_a53641a/external/protothreads/pt-1.4/example-small.c
new file mode 100644
index 0000000..37c1716
--- /dev/null
+++ b/thirdparty/nRF5_SDK_15.0.0_a53641a/external/protothreads/pt-1.4/example-small.c
@@ -0,0 +1,97 @@
+/**
+ * This is a very small example that shows how to use
+ * protothreads. The program consists of two protothreads that wait
+ * for each other to toggle a variable.
+ */
+
+/* We must always include pt.h in our protothreads code. */
+#include "pt.h"
+
+#include <stdio.h> /* For printf(). */
+
+/* Two flags that the two protothread functions use. */
+static int protothread1_flag, protothread2_flag;
+
+/**
+ * The first protothread function. A protothread function must always
+ * return an integer, but must never explicitly return - returning is
+ * performed inside the protothread statements.
+ *
+ * The protothread function is driven by the main loop further down in
+ * the code.
+ */
+static int
+protothread1(struct pt *pt)
+{
+ /* A protothread function must begin with PT_BEGIN() which takes a
+ pointer to a struct pt. */
+ PT_BEGIN(pt);
+
+ /* We loop forever here. */
+ while(1) {
+ /* Wait until the other protothread has set its flag. */
+ PT_WAIT_UNTIL(pt, protothread2_flag != 0);
+ printf("Protothread 1 running\n");
+
+ /* We then reset the other protothread's flag, and set our own
+ flag so that the other protothread can run. */
+ protothread2_flag = 0;
+ protothread1_flag = 1;
+
+ /* And we loop. */
+ }
+
+ /* All protothread functions must end with PT_END() which takes a
+ pointer to a struct pt. */
+ PT_END(pt);
+}
+
+/**
+ * The second protothread function. This is almost the same as the
+ * first one.
+ */
+static int
+protothread2(struct pt *pt)
+{
+ PT_BEGIN(pt);
+
+ while(1) {
+ /* Let the other protothread run. */
+ protothread2_flag = 1;
+
+ /* Wait until the other protothread has set its flag. */
+ PT_WAIT_UNTIL(pt, protothread1_flag != 0);
+ printf("Protothread 2 running\n");
+
+ /* We then reset the other protothread's flag. */
+ protothread1_flag = 0;
+
+ /* And we loop. */
+ }
+ PT_END(pt);
+}
+
+/**
+ * Finally, we have the main loop. Here is where the protothreads are
+ * initialized and scheduled. First, however, we define the
+ * protothread state variables pt1 and pt2, which hold the state of
+ * the two protothreads.
+ */
+static struct pt pt1, pt2;
+int
+main(void)
+{
+ /* Initialize the protothread state variables with PT_INIT(). */
+ PT_INIT(&pt1);
+ PT_INIT(&pt2);
+
+ /*
+ * Then we schedule the two protothreads by repeatedly calling their
+ * protothread functions and passing a pointer to the protothread
+ * state variables as arguments.
+ */
+ while(1) {
+ protothread1(&pt1);
+ protothread2(&pt2);
+ }
+}