[Cryptech-Commits] [sw/stm32] 02/03: Add HAL_Delay as an alias for task_delay, but don't wedge if the tasker isn't running yet.

git at cryptech.is git at cryptech.is
Mon May 1 19:39:03 UTC 2017


This is an automated email from the git hooks/post-receive script.

paul at psgd.org pushed a commit to branch no-rtos
in repository sw/stm32.

commit 1ac75ba3d15f9b22966accbe6bd9793953396fc5
Author: Paul Selkirk <paul at psgd.org>
AuthorDate: Mon May 1 15:38:16 2017 -0400

    Add HAL_Delay as an alias for task_delay, but don't wedge if the tasker isn't running yet.
---
 task.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/task.c b/task.c
index bc6eded..2e2ddec 100644
--- a/task.c
+++ b/task.c
@@ -108,14 +108,13 @@ tcb_t *task_add(char *name, funcp_t func, void *cookie, void *stack, size_t stac
     if (tail == NULL) {
         /* Empty list; initialize it to this task. */
         t->next = t;
-        tail = t;
     }
     else {
         /* Otherwise insert at the end of the list. */
         t->next = tail->next;
         tail->next = t;
-        tail = t;
     }
+    tail = t;
 
     return t;
 }
@@ -124,6 +123,11 @@ tcb_t *task_add(char *name, funcp_t func, void *cookie, void *stack, size_t stac
  *
  * This function is called repeatedly when the system is idle (there are
  * no runnable tasks).
+ *
+ * The idle function should NOT call task_delay or HAL_Delay, because that
+ * will cause fatal recursion. We could add a recursion guard to
+ * task_yield, but we're not currently using the idle hook, and I'm
+ * thinking about removing it entirely.
  */
 static void default_idle_hook(void) { }
 static funcp_t idle_hook = default_idle_hook;
@@ -170,6 +174,12 @@ void task_yield(void)
 {
     tcb_t *next;
 
+    /* If there are no defined tasks, exit immediately so we don't get
+     * caught in the idle loop.
+     */
+    if (tail == NULL)
+	return;
+
     /* Find the next runnable task. Loop if every task is waiting. */
     while (1) {
         next = next_task();
@@ -326,7 +336,12 @@ void task_delay(uint32_t delay)
     while ((HAL_GetTick() - tickstart) < delay)
 	task_yield();
 }
+void HAL_Delay(uint32_t delay) __attribute__((alias("task_delay")));
 
+/* Simple mutex-like locks. A real mutex would require the unlocker to be
+ * the current owner, but then we have to define and return errors, when
+ * all we want at the moment is simple mutual exclusion.
+ */
 void task_mutex_lock(task_mutex_t *mutex)
 {
     while (mutex->locked)



More information about the Commits mailing list