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_system.h" 49 #include "task_actuator.h" 50 #include "task_sensor.h" 51 52 /********************** macros and definitions *******************************/ 53 #define G_APP_CNT_INI 0ul 54 #define G_APP_TICK_CNT_INI 0ul 55 56 #define TASK_X_WCET_INI 0ul 57 #define TASK_X_DELAY_MIN 0ul 58 59 typedef struct { 60 void (*task_init)(void *); // Pointer to task (must be a 61 void (*task_update)(void *); // Pointer to task (must be a 62 void *parameters; // Pointer to parameters 63 } task_cfg_t; 64 65 typedef struct { 66 uint32_t WCET; // Worst-case execution time (microseconds) 67 } task_dta_t; 68 69 /********************** internal data declaration ****************************/ 70 const task_cfg_t task_cfg_list[] = { 71 {task_sensor_init, task_sensor_update, NULL}, 72 {task_system_init, task_system_update, NULL}, 73 {task_actuator_init, task_actuator_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 - Model Integration - C codig"; 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_system_tick_cnt = G_APP_TICK_CNT_INI; 128 g_task_actuator_tick_cnt = G_APP_TICK_CNT_INI; 129 __asm("CPSIE i"); /* enable interrupts */ 130 } 131 132 void app_update(void) 133 { 134 uint32_t index; 135 bool b_time_update_required = false; 136 uint32_t cycle_counter_time_us; 137 138 /* Protect shared resource */ 139 __asm("CPSID i"); /* disable interrupts */ 140 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 141 { 142 /* Update Tick Counter */ 143 g_app_tick_cnt--; 144 b_time_update_required = true; 145 } 146 __asm("CPSIE i"); /* enable interrupts */ 147 148 /* Check if it's time to run tasks */ 149 while (b_time_update_required) 150 { 151 /* Update App Counter */ 152 g_app_cnt++; 153 g_app_runtime_us = 0; 154 155 /* Go through the task arrays */ 156 for (index = 0; TASK_QTY > index; index++) 157 { 158 cycle_counter_reset(); 159 160 /* Run task_x_update */ 161 (*task_cfg_list[index].task_update)(task_cfg_list[index].parameters); 162 163 cycle_counter_time_us = cycle_counter_get_time_us(); 164 165 /* Update variables */ 166 g_app_runtime_us += cycle_counter_time_us; 167 168 if (task_dta_list[index].WCET < cycle_counter_time_us) 169 { 170 task_dta_list[index].WCET = cycle_counter_time_us; 171 } 172 } 173 174 /* Protect shared resource */ 175 __asm("CPSID i"); /* disable interrupts */ 176 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 177 { 178 /* Update Tick Counter */ 179 g_app_tick_cnt--; 180 b_time_update_required = true; 181 } 182 else 183 { 184 b_time_update_required = false; 185 } 186 __asm("CPSIE i"); /* enable interrupts */ 187 } 188 } 189 190 void HAL_SYSTICK_Callback(void) 191 { 192 /* Update Tick Counter */ 193 g_app_tick_cnt++; 194 195 g_task_sensor_tick_cnt++; 196 g_task_system_tick_cnt++; 197 g_task_actuator_tick_cnt++; 198 } 199 200 /********************** end of file ******************************************/
