1 /* 2 * Copyright (c) 2023 Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 22 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 23 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * @file : app.c 33 * @date : Set 26, 2023 34 * @author : Juan Manuel Cruz <jcruz@fi.uba.ar> <jcruz@frba.utn.edu.ar> 35 * @version v1.0.0 36 */ 37 38 /********************** inclusions *******************************************/ 39 /* Project includes */ 40 #include "main.h" 41 42 /* Demo includes */ 43 #include "logger.h" 44 #include "dwt.h" 45 46 /* Application & Tasks includes */ 47 #include "board.h" 48 #include "task_sensor.h" 49 #include "task_menu.h" 50 51 /********************** macros and definitions *******************************/ 52 #define G_APP_CNT_INI 0ul 53 #define G_APP_TICK_CNT_INI 0ul 54 55 #define TASK_X_WCET_INI 0ul 56 #define TASK_X_DELAY_MIN 0ul 57 58 typedef struct { 59 void (*task_init)(void *); // Pointer to task (must be a 60 // 'void (void *)' function) 61 void (*task_update)(void *); // Pointer to task (must be a 62 // 'void (void *)' function) 63 void *parameters; // Pointer to parameters 64 } task_cfg_t; 65 66 typedef struct { 67 uint32_t WCET; // Worst-case execution time (microseconds) 68 } task_dta_t; 69 70 /********************** internal data declaration ****************************/ 71 const task_cfg_t task_cfg_list[] = { 72 {task_sensor_init, task_sensor_update, NULL}, 73 {task_menu_init, task_menu_update, NULL} 74 }; 75 76 #define TASK_QTY (sizeof(task_cfg_list)/sizeof(task_cfg_t)) 77 78 /********************** internal functions declaration ***********************/ 79 80 /********************** internal data definition *****************************/ 81 const char *p_sys = " Bare Metal - Event-Triggered Systems (ETS)"; 82 const char *p_app = " App - Interactive Menu"; 83 84 /********************** external data declaration ****************************/ 85 uint32_t g_app_cnt; 86 uint32_t g_app_runtime_us; 87 88 volatile uint32_t g_app_tick_cnt; 89 90 task_dta_t task_dta_list[TASK_QTY]; 91 92 /********************** external functions definition ************************/ 93 void app_init(void) 94 { 95 uint32_t index; 96 97 /* Print out: Application Initialized */ 98 LOGGER_INFO(" "); 99 LOGGER_INFO("%s is running - Tick [mS] = %lu", GET_NAME(app_init), HAL_GetTick()); 100 101 LOGGER_INFO(p_sys); 102 LOGGER_INFO(p_app); 103 104 /* Init & Print out: Application execution counter */ 105 g_app_cnt = G_APP_CNT_INI; 106 LOGGER_INFO(" %s = %lu", GET_NAME(g_app_cnt), g_app_cnt); 107 108 /* Init Cycle Counter */ 109 cycle_counter_init(); 110 111 /* Go through the task arrays */ 112 for (index = 0; TASK_QTY > index; index++) 113 { 114 /* Run task_x_init */ 115 (*task_cfg_list[index].task_init)(task_cfg_list[index].parameters); 116 117 /* Init variables */ 118 task_dta_list[index].WCET = TASK_X_WCET_INI; 119 } 120 121 /* Protect shared resource */ 122 __asm("CPSID i"); /* disable interrupts */ 123 /* Init Tick Counter */ 124 g_app_tick_cnt = G_APP_TICK_CNT_INI; 125 126 g_task_sensor_tick_cnt = G_APP_TICK_CNT_INI; 127 g_task_menu_tick_cnt = G_APP_TICK_CNT_INI; 128 __asm("CPSIE i"); /* enable interrupts */ 129 } 130 131 void app_update(void) 132 { 133 uint32_t index; 134 bool b_time_update_required = false; 135 uint32_t cycle_counter_time_us; 136 137 /* Protect shared resource */ 138 __asm("CPSID i"); /* disable interrupts */ 139 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 140 { 141 /* Update Tick Counter */ 142 g_app_tick_cnt--; 143 b_time_update_required = true; 144 } 145 __asm("CPSIE i"); /* enable interrupts */ 146 147 /* Check if it's time to run tasks */ 148 while (b_time_update_required) 149 { 150 /* Update App Counter */ 151 g_app_cnt++; 152 g_app_runtime_us = 0; 153 154 /* Go through the task arrays */ 155 for (index = 0; TASK_QTY > index; index++) 156 { 157 cycle_counter_reset(); 158 159 /* Run task_x_update */ 160 (*task_cfg_list[index].task_update)(task_cfg_list[index].parameters); 161 162 cycle_counter_time_us = cycle_counter_get_time_us(); 163 164 /* Update variables */ 165 g_app_runtime_us += cycle_counter_time_us; 166 167 if (task_dta_list[index].WCET < cycle_counter_time_us) 168 { 169 task_dta_list[index].WCET = cycle_counter_time_us; 170 } 171 } 172 173 /* Protect shared resource */ 174 __asm("CPSID i"); /* disable interrupts */ 175 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 176 { 177 /* Update Tick Counter */ 178 g_app_tick_cnt--; 179 b_time_update_required = true; 180 } 181 else 182 { 183 b_time_update_required = false; 184 } 185 __asm("CPSIE i"); /* enable interrupts */ 186 } 187 } 188 189 void HAL_SYSTICK_Callback(void) 190 { 191 /* Update Tick Counter */ 192 g_app_tick_cnt++; 193 194 g_task_sensor_tick_cnt++; 195 g_task_menu_tick_cnt++; 196 } 197 198 /********************** end of file ******************************************/
