Files
Tool/IPL/Customer/Mobis/Gen4_ICUMX_Loader/common/scmt_checkpoint.c
2025-12-24 17:21:08 +09:00

127 lines
4.8 KiB
C

#include <stdint.h>
#include <stddef.h> /* NULL pointer */
#include <stdio.h>
#include "scmt.h"
#include "scmt_config.h"
#include "scmt_checkpoint.h"
#if PRINT_INFO
#include <rst_register.h> /* Access to mode pin register */
#include <mem_io.h> /* Access to mode pin register */
#endif /* PRINT_INFO */
#define xstr(a) str(a)
#define str(a) #a
/* Structure to hold the log data. */
typedef struct {
uint32_t counter; /* Value of SCMT counter */
char * note; /* String is stored as pointer! Pointer must be valid during runtime! */
uint32_t data; /* Arbitrary data to add to log */
} checkpoint_t;
checkpoint_t time_checkpoints[TIME_CHECKPOINTS_MAX];
/* If SCMT has a start value other than zero, we'll keep two slots free to inform the user about the offset within the print function */
#if (SCMT_START_VALUE == 0)
uint32_t time_checkpoints_index = 0;
#else
uint32_t time_checkpoints_index = 2;
#endif
/* Store a checkpoint: Fetch current counter value and store it together with a pointer to a static string as well as arbitrary data */
void store_time_checkpoint(char * note, uint32_t data)
{
if (time_checkpoints_index < TIME_CHECKPOINTS_MAX) {
time_checkpoints[time_checkpoints_index].counter = scmt_module_read();
time_checkpoints[time_checkpoints_index].note = note;
time_checkpoints[time_checkpoints_index].data = data;
}
time_checkpoints_index++;
}
#if (0 == (MEASURE_TIME_NOPRINT))
/* Print checkpoints */
void print_time_checkpoints(void)
{
uint32_t i;
{PRINTFN(MODULE"=================\r\n");}
#if PRINT_INFO
/* First, provide some information about the environment */
{PRINTFN(MODULE"MODEMR[1:0]: 0x%x 0x%x\r\n", mem_read32(RST_MODEMR1), mem_read32(RST_MODEMR0) );}
{PRINTFN(MODULE"Timer: '" xstr(TIMER_FUNC) "'\r\n");}
{PRINTFN(MODULE"- freq: %.3f kHz\r\n", (TIMER_FREQ)/1000.0f);}
{PRINTFN(MODULE"- resolution: 1 tick = %.4f ms\r\n", 1000.0/(TIMER_FREQ));}
#endif /* PRINT_INFO */
/* In case of unsufficient storage for checkpoints, inform about it */
if (time_checkpoints_index >= TIME_CHECKPOINTS_MAX) {
{PRINTFN(MODULE"Internal number of checkpoints exceeded reserved space: %i of %i\r\n", time_checkpoints_index, TIME_CHECKPOINTS_MAX);}
}
/* In case of non-zero SCMT start value, inform about it */
#if (SCMT_START_VALUE != 0)
time_checkpoints[0].counter = 0;
time_checkpoints[0].note = "Reset Release!";
time_checkpoints[1].counter = SCMT_START_VALUE;
time_checkpoints[1].note = "Timer started here with manual offset relative to reset release!";
#endif
/* Print log in CSV style */
{PRINTFN(MODULE"CSV; timer_ticks; total_time[ms]; delta_time[ms]; data; comment\r\n" );}
for (i=0; i<time_checkpoints_index; i++) {
/* Some projects don't have float handling activated in the compiler.
In this case you have to calculate the times later in the spreadsheets */
#if PRINT_FLOAT
float ms = time_checkpoints[i].counter*1000.0/(TIMER_FREQ);
float ms_delta = 0.0;
if (i>0) {
ms_delta = ms - time_checkpoints[i-1].counter*1000.0/(TIMER_FREQ);
}
// ==> "E:ICUMX:CP: 364; 2.77; 2.77; 0; init_done"
{PRINTFN(MODULE"CP; %u; %f; %f; %u; %s\r\n", time_checkpoints[i].counter, ms, ms_delta, time_checkpoints[i].data, time_checkpoints[i].note );}
#else
{PRINTFN(MODULE"CP; %u; --; --; %u; %s\r\n", time_checkpoints[i].counter, time_checkpoints[i].data, time_checkpoints[i].note );}
#endif
}
/* Timer verification.
Sample calculation:
SCIF is running with 921600 Baud. 8N1 => 0.0108 ms / bit.
Sending 20 characters should take 28 timer ticks of SCMT
As SCIF has a 16-stage FIFO, send at least 16 characters before start of measurements */
#if 0 != TIMER_TEST_VS_BAUD
{
uint32_t start = 0, stop = 0;
const char teststr[] = "ExecutingTimerTestExecutingTimerTestExecutingTimerTest!\r\n"; /* 57 characters */
const float charrate = (TIMER_TEST_VS_BAUD)/10.0; /* 8N1: 10 cycles per character */
const float expected_ms = sizeof(teststr)*1000.0/(charrate);
float measured_ms;
{PRINTFN(MODULE"=================\r\n");}
{PRINTFN(MODULE"FillingFifoForTimerTestFillingFifoForTimerTest - ");}
start = (TIMER_FUNC)();
{local_printf(teststr);}
stop = (TIMER_FUNC)();
measured_ms = (stop-start)*1000.0/(TIMER_FREQ);
{PRINTFN(MODULE"(Printing the test took %5i ticks / %7.2f ms / expected: %7.2f ms - %s)\r\n", stop-start, measured_ms, expected_ms, ((measured_ms/expected_ms < 1.3) && (measured_ms/expected_ms > 0.9))?"OK":"ERROR");}
}
#endif /* TIMER_TEST_VS_BAUD */
{PRINTFN(MODULE"=================\r\n");}
}
#else //(MEASURE_TIME_NOPRINT) == 0
void print_time_checkpoints(void) {}
#endif //(MEASURE_TIME_NOPRINT) == 0