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_test.h" 49 50 /********************** macros and definitions *******************************/ 51 #define G_APP_CNT_INI 0ul 52 #define G_APP_TICK_CNT_INI 0ul 53 54 #define TASK_X_WCET_INI 0ul 55 #define TASK_X_DELAY_MIN 0ul 56 57 typedef struct { 58 void (*task_init)(void *); // Pointer to task (must be a 59 // 'void (void *)' function) 60 void (*task_update)(void *); // Pointer to task (must be a 61 // 'void (void *)' function) 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_test_init, task_test_update, NULL} 72 }; 73 74 #define TASK_QTY (sizeof(task_cfg_list)/sizeof(task_cfg_t)) 75 76 /********************** internal functions declaration ***********************/ 77 78 /********************** internal data definition *****************************/ 79 const char *p_sys = " Bare Metal - Event-Triggered Systems (ETS)"; 80 const char *p_app = " App - Code Integration"; 81 82 /********************** external data declaration ****************************/ 83 uint32_t g_app_cnt; 84 uint32_t g_app_runtime_us; 85 86 volatile uint32_t g_app_tick_cnt; 87 88 task_dta_t task_dta_list[TASK_QTY]; 89 90 /********************** external functions definition ************************/ 91 void app_init(void) 92 { 93 uint32_t index; 94 95 /* Print out: Application Initialized */ 96 LOGGER_INFO(" "); 97 LOGGER_INFO("%s is running - Tick [mS] = %lu", GET_NAME(app_init), HAL_GetTick()); 98 99 LOGGER_INFO(p_sys); 100 LOGGER_INFO(p_app); 101 102 /* Init & Print out: Application execution counter */ 103 g_app_cnt = G_APP_CNT_INI; 104 LOGGER_INFO(" %s = %lu", GET_NAME(g_app_cnt), g_app_cnt); 105 106 /* Init Cycle Counter */ 107 cycle_counter_init(); 108 109 /* Go through the task arrays */ 110 for (index = 0; TASK_QTY > index; index++) 111 { 112 /* Run task_x_init */ 113 (*task_cfg_list[index].task_init)(task_cfg_list[index].parameters); 114 115 /* Init variables */ 116 task_dta_list[index].WCET = TASK_X_WCET_INI; 117 } 118 119 /* Protect shared resource */ 120 __asm("CPSID i"); /* disable interrupts */ 121 /* Init Tick Counter */ 122 g_app_tick_cnt = G_APP_TICK_CNT_INI; 123 124 g_task_test_tick_cnt = G_APP_TICK_CNT_INI; 125 __asm("CPSIE i"); /* enable interrupts */ 126 } 127 128 void app_update(void) 129 { 130 uint32_t index; 131 bool b_time_update_required = false; 132 uint32_t cycle_counter_time_us; 133 134 /* Protect shared resource */ 135 __asm("CPSID i"); /* disable interrupts */ 136 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 137 { 138 /* Update Tick Counter */ 139 g_app_tick_cnt--; 140 b_time_update_required = true; 141 } 142 __asm("CPSIE i"); /* enable interrupts */ 143 144 /* Check if it's time to run tasks */ 145 while (b_time_update_required) 146 { 147 /* Update App Counter */ 148 g_app_cnt++; 149 g_app_runtime_us = 0; 150 151 /* Go through the task arrays */ 152 for (index = 0; TASK_QTY > index; index++) 153 { 154 cycle_counter_reset(); 155 156 /* Run task_x_update */ 157 (*task_cfg_list[index].task_update)(task_cfg_list[index].parameters); 158 159 cycle_counter_time_us = cycle_counter_get_time_us(); 160 161 /* Update variables */ 162 g_app_runtime_us += cycle_counter_time_us; 163 164 if (task_dta_list[index].WCET < cycle_counter_time_us) 165 { 166 task_dta_list[index].WCET = cycle_counter_time_us; 167 } 168 } 169 170 /* Protect shared resource */ 171 __asm("CPSID i"); /* disable interrupts */ 172 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 173 { 174 /* Update Tick Counter */ 175 g_app_tick_cnt--; 176 b_time_update_required = true; 177 } 178 else 179 { 180 b_time_update_required = false; 181 } 182 __asm("CPSIE i"); /* enable interrupts */ 183 } 184 } 185 186 void HAL_SYSTICK_Callback(void) 187 { 188 /* Update Tick Counter */ 189 g_app_tick_cnt++; 190 191 g_task_test_tick_cnt++; 192 } 193 194 /********************** end of file ******************************************/
