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 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 "app.h" 48 #include "board.h" 49 #include "task_adc.h" 50 #include "task_pwm.h" 51 52 53 /********************** macros and definitions *******************************/ 54 55 56 #define G_APP_CNT_INI 0ul 57 #define G_APP_TICK_CNT_INI 0ul 58 59 #define TASK_X_WCET_INI 0ul 60 61 typedef struct { 62 void (*task_init)(void *); 63 void (*task_update)(void *); 64 void *parameters; 65 } task_cfg_t; 66 67 typedef struct { 68 uint32_t WCET; 69 } task_dta_t; 70 71 /********************** internal data declaration ****************************/ 72 73 shared_data_type shared_data; 74 75 const task_cfg_t task_cfg_list[] = { 76 {task_adc_init, task_adc_update, &shared_data}, 77 {task_pwm_init, task_pwm_update, &shared_data}, 78 }; 79 80 #define TASK_QTY (sizeof(task_cfg_list)/sizeof(task_cfg_t)) 81 82 /********************** internal functions declaration ***********************/ 83 84 /********************** internal data definition *****************************/ 85 86 const char *p_sys = " Bare Metal - Event-Triggered Systems (ETS)\n"; 87 const char *p_app = " ADC + PWM\n"; 88 89 /********************** external data declaration *****************************/ 90 91 uint32_t g_app_cnt; 92 uint32_t g_app_time_us; 93 94 volatile uint32_t g_app_tick_cnt; 95 task_dta_t task_dta_list[TASK_QTY]; 96 97 /********************** external functions definition ************************/ 98 99 void app_init(void) 100 { 101 uint32_t index; 102 103 /* Print out: Application Initialized */ 104 LOGGER_LOG("\n"); 105 LOGGER_LOG("%s is running - Tick [mS] = %lu\r\n", GET_NAME(app_init), HAL_GetTick()); 106 107 LOGGER_LOG(p_sys); 108 LOGGER_LOG(p_app); 109 110 g_app_cnt = G_APP_CNT_INI; 111 112 /* Print out: Application execution counter */ 113 LOGGER_LOG(" %s = %lu\n", GET_NAME(g_app_cnt), g_app_cnt); 114 115 /* Go through the task arrays */ 116 for (index = 0; TASK_QTY > index; index++) 117 { 118 /* Run task_x_init */ 119 (*task_cfg_list[index].task_init)(task_cfg_list[index].parameters); 120 121 /* Init variables */ 122 task_dta_list[index].WCET = TASK_X_WCET_INI; 123 } 124 125 cycle_counter_init(); 126 } 127 128 void app_update(void) 129 { 130 uint32_t index; 131 //uint32_t cycle_counter; 132 uint32_t cycle_counter_time_us; 133 134 /* Check if it's time to run tasks */ 135 if (G_APP_TICK_CNT_INI < g_app_tick_cnt) 136 { 137 g_app_tick_cnt--; 138 139 /* Update App Counter */ 140 g_app_cnt++; 141 g_app_time_us = 0; 142 143 /* Print out: Application execution counter */ 144 //LOGGER_LOG(" %s = %lu\r\n", GET_NAME(g_app_cnt), g_app_cnt); 145 146 /* Go through the task arrays */ 147 for (index = 0; TASK_QTY > index; index++) 148 { 149 cycle_counter_reset(); 150 151 /* Run task_x_update */ 152 (*task_cfg_list[index].task_update)(task_cfg_list[index].parameters); 153 154 155 //cycle_counter = cycle_counter_get(); 156 cycle_counter_time_us = cycle_counter_time_us(); 157 158 /* Update variables */ 159 g_app_time_us += cycle_counter_time_us; 160 161 if (task_dta_list[index].WCET < cycle_counter_time_us) 162 { 163 task_dta_list[index].WCET = cycle_counter_time_us; 164 } 165 166 /* Print out: Cycle Counter */ 167 //LOGGER_LOG(" %s: %lu - %s: %lu uS\r\n", GET_NAME(cycle_counter), cycle_counter, GET_NAME(cycle_counter_time_us), cycle_counter_time_us); 168 //LOGGER_LOG(" %s: %lu uS\r\n", GET_NAME(g_app_time_us), g_app_time_us); 169 } 170 171 LOGGER_LOG("%d,%d\n", shared_data.pwm_active, shared_data.adc_value); 172 } 173 } 174 175 /* Callbacks in C (https://www.geeksforgeeks.org/) */ 176 /* 177 * A callback is any executable code that is passed as an argument to another 178 * code, which is expected to call back (execute) the argument at a given time. 179 * In simple language, If a reference of a function is passed to another 180 * function as an argument to call it, then it will be called a Callback 181 * function. 182 */ 183 184 void HAL_SYSTICK_Callback(void) 185 { 186 g_app_tick_cnt++; 187 } 188 189 /********************** end of file ******************************************/
