stm32f103rb_hal_blink

Non-blocking, event triggered blink example using HAL library
Index Commits Files Refs README
app/src/task_system.c (3106B)
   1 /*
   2  * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>.
   3  * Copyright (c) 2026 Martin Javier Klöckner <mklockner@fi.uba.ar>
   4  *
   5  * See file `LICENSE` for full details
   6  */
   7 
   8 #include "main.h"
   9 
  10 #include "logger.h"
  11 #include "dwt.h"
  12 
  13 #include "board.h"
  14 #include "app.h"
  15 #include "task_system_attribute.h"
  16 #include "task_system_interface.h"
  17 #include "task_actuator_attribute.h"
  18 #include "task_actuator_interface.h"
  19 
  20 #define G_TASK_SYS_CNT_INI       0ul
  21 #define G_TASK_SYS_TICK_CNT_INI  0ul
  22 
  23 #define G_LED_PERIOD_MS 2000ul
  24 #define G_LED_T_ON_MS   1500ul
  25 
  26 task_system_dta_t task_system_dta = {
  27     G_LED_PERIOD_MS, ST_SYS_LED_ON
  28 };
  29 
  30 #define SYSTEM_DTA_QTY (sizeof(task_system_dta)/sizeof(task_system_dta_t))
  31 
  32 void task_system_statechart(void);
  33 
  34 uint32_t g_task_system_cnt;
  35 
  36 // this is updated every ms by the HAL_SysTick
  37 volatile uint32_t g_task_system_tick_cnt;
  38 
  39 void task_system_init(void *parameters)
  40 {
  41     task_system_dta_t *p_task_system_dta;
  42     task_system_st_t state;
  43     // task_system_ev_t event;
  44     // bool b_event;
  45 
  46     LOGGER_INFO("Initializing `task_system`...");
  47 
  48     g_task_system_cnt = G_TASK_SYS_CNT_INI;
  49 
  50     init_queue_event_task_system();
  51 
  52     p_task_system_dta = &task_system_dta;
  53 
  54     state = ST_SYS_LED_ON;
  55     p_task_system_dta->state = state;
  56 
  57     LOGGER_INFO("Done initializing `task_system`");
  58 }
  59 
  60 void task_system_update(void *parameters)
  61 {
  62     bool b_time_update_required = false;
  63 
  64     __asm("CPSID i");
  65     if (G_TASK_SYS_TICK_CNT_INI < g_task_system_tick_cnt)
  66     {
  67         g_task_system_tick_cnt--;
  68         b_time_update_required = true;
  69     }
  70     __asm("CPSIE i");
  71 
  72     while (b_time_update_required)
  73     {
  74         // increment task tick counter
  75         g_task_system_cnt++;
  76 
  77         task_system_statechart();
  78 
  79         __asm("CPSID i");
  80         if (G_TASK_SYS_TICK_CNT_INI < g_task_system_tick_cnt)
  81         {
  82             g_task_system_tick_cnt--;
  83             b_time_update_required = true;
  84         }
  85         else
  86         {
  87             b_time_update_required = false;
  88         }
  89         __asm("CPSIE i");
  90     }
  91 }
  92 
  93 void task_system_statechart(void)
  94 {
  95     task_system_dta_t *p_task_system_dta = &task_system_dta;
  96 
  97     /*
  98     // system events unused
  99 
 100     if (true == any_event_task_system())
 101     {
 102         p_task_system_dta->flag = true;
 103         p_task_system_dta->event = get_event_task_system();
 104     }
 105     */
 106 
 107     switch (p_task_system_dta->state)
 108     {
 109         case ST_SYS_LED_ON:
 110 
 111             if (G_LED_T_ON_MS < g_task_system_cnt)
 112             {
 113                 put_event_task_actuator(EV_LED_OFF, ID_LED_A);
 114                 p_task_system_dta->state = ST_SYS_LED_OFF;
 115             }
 116 
 117             break;
 118 
 119         case ST_SYS_LED_OFF:
 120 
 121             if (G_LED_PERIOD_MS < g_task_system_cnt)
 122             {
 123                 g_task_system_cnt = G_TASK_SYS_CNT_INI;
 124                 put_event_task_actuator(EV_LED_ON, ID_LED_A);
 125                 p_task_system_dta->state = ST_SYS_LED_ON;
 126             }
 127 
 128             break;
 129 
 130         default:
 131 
 132             p_task_system_dta->tick  = 0;
 133             p_task_system_dta->state = ST_SYS_LED_ON;
 134 
 135             break;
 136     }
 137 }