diff --git a/APP_Framework/Applications/benchmark/src/slre/libslre.c b/APP_Framework/Applications/benchmark/src/slre/libslre.c index f6d194af9..d0ea25250 100644 --- a/APP_Framework/Applications/benchmark/src/slre/libslre.c +++ b/APP_Framework/Applications/benchmark/src/slre/libslre.c @@ -31,8 +31,11 @@ #define ARRAY_SIZE(ar) (int) (sizeof(ar) / sizeof((ar)[0])) #define FAIL_IF(condition, error_code) if (condition) return (error_code) +#ifdef DBG +#undef DBG +#endif #ifdef SLRE_DEBUG -#define DBG(x) printf x +#define DBG(x) printf x; #else #define DBG(x) #endif diff --git a/APP_Framework/Applications/benchmark/src/statemate/libstatemate.c b/APP_Framework/Applications/benchmark/src/statemate/libstatemate.c index 56f6a74e3..31e5de34c 100644 --- a/APP_Framework/Applications/benchmark/src/statemate/libstatemate.c +++ b/APP_Framework/Applications/benchmark/src/statemate/libstatemate.c @@ -19,7 +19,7 @@ * statemate.c * * This code was automatically generated by - * the STAtechart Real-time-Code generator STARC + * the STAtechart Real-bm_time-Code generator STARC * which was developed at C-LAB. * * The original StateChart specifies an experimental @@ -170,7 +170,7 @@ char FH_DU__MFHA_old; #define FH_TUERMODUL_CTRL__END_REVERS_copy_IDX 23 #define FH_TUERMODUL__EINKLEMMUNG_IDX 24 -static unsigned long time; +static unsigned long bm_time; char stable; char step; @@ -193,39 +193,39 @@ char BLOCK_ERKENNUNG_CTRL_BLOCK_ERKENNUNG_CTRL_next_state; /** 2 bits **/ void interface(void) { if (SYS_bit_get(Bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX)) - tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = time; + tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL = bm_time; if (SYS_bit_get(Bitlist, entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL_IDX) || SYS_bit_get(Bitlist, exited_BEREIT_FH_TUERMODUL_CTRL_IDX)) tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL = - time; + bm_time; if ((sc_FH_TUERMODUL_CTRL_2375_2 != 0) && - (time - sc_FH_TUERMODUL_CTRL_2375_2 >= 0.5)) { + (bm_time - sc_FH_TUERMODUL_CTRL_2375_2 >= 0.5)) { FH_TUERMODUL__MFHA_copy = 0; sc_FH_TUERMODUL_CTRL_2375_2 = 0; } if ((sc_FH_TUERMODUL_CTRL_2352_1 != 0) && - (time - sc_FH_TUERMODUL_CTRL_2352_1 >= 0.5)) { + (bm_time - sc_FH_TUERMODUL_CTRL_2352_1 >= 0.5)) { FH_TUERMODUL__MFHZ_copy = 0; sc_FH_TUERMODUL_CTRL_2352_1 = 0; } if ((sc_FH_TUERMODUL_CTRL_2329_1 != 0) && - (time - sc_FH_TUERMODUL_CTRL_2329_1 >= 0.5)) { + (bm_time - sc_FH_TUERMODUL_CTRL_2329_1 >= 0.5)) { FH_TUERMODUL__MFHZ_copy = 0; sc_FH_TUERMODUL_CTRL_2329_1 = 0; } if ((sc_FH_TUERMODUL_CTRL_1781_10 != 0) && - (time - sc_FH_TUERMODUL_CTRL_1781_10 >= 0.5)) { + (bm_time - sc_FH_TUERMODUL_CTRL_1781_10 >= 0.5)) { sc_FH_TUERMODUL_CTRL_1781_10 = 0; } if ((sc_FH_TUERMODUL_CTRL_1739_10 != 0) && - (time - sc_FH_TUERMODUL_CTRL_1739_10 >= 0.5)) { + (bm_time - sc_FH_TUERMODUL_CTRL_1739_10 >= 0.5)) { sc_FH_TUERMODUL_CTRL_1739_10 = 0; } if ((SYS_bit_get(Bitlist, entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRL_IDX) || BLOCK_ERKENNUNG_CTRL__N != BLOCK_ERKENNUNG_CTRL__N_old)) tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy = - time; + bm_time; } /** interface **/ @@ -466,7 +466,7 @@ void generic_FH_TUERMODUL_CTRL(void) { ((FH_TUERMODUL__MFHZ))) { stable = 0; FH_TUERMODUL__MFHZ_copy = 0; - sc_FH_TUERMODUL_CTRL_2329_1 = time; + sc_FH_TUERMODUL_CTRL_2329_1 = bm_time; B_FH_TUERMODUL_CTRL_next_state = 3; INITIALISIERT_FH_TUERMODUL_CTRL_next_state = 3; @@ -538,7 +538,7 @@ void generic_FH_TUERMODUL_CTRL(void) { ((FH_TUERMODUL__MFHA))) { stable = 0; FH_TUERMODUL__MFHA_copy = 0; - sc_FH_TUERMODUL_CTRL_2375_2 = time; + sc_FH_TUERMODUL_CTRL_2375_2 = bm_time; B_FH_TUERMODUL_CTRL_next_state = 2; NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; @@ -548,7 +548,7 @@ void generic_FH_TUERMODUL_CTRL(void) { ((FH_TUERMODUL__MFHZ))) { stable = 0; FH_TUERMODUL__MFHZ_copy = 0; - sc_FH_TUERMODUL_CTRL_2352_1 = time; + sc_FH_TUERMODUL_CTRL_2352_1 = bm_time; B_FH_TUERMODUL_CTRL_next_state = 2; NICHT_INITIALISIERT_NICHT_INITIALISIERT_next_state = 3; @@ -657,7 +657,7 @@ void generic_FH_TUERMODUL_CTRL(void) { SYS_bit_clr(Bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX); FH_TUERMODUL__MFHZ_copy = 0; - sc_FH_TUERMODUL_CTRL_1781_10 = time; + sc_FH_TUERMODUL_CTRL_1781_10 = bm_time; FH_TUERMODUL__MFHA_copy = 1; break; } @@ -715,7 +715,7 @@ void generic_FH_TUERMODUL_CTRL(void) { MANUELL_SCHLIESSEN_FH_TUERMODUL_CTRL_next_state = 1; SYS_bit_clr(Bitlist, active_EINKLEMMSCHUTZ_CTRL_copy_IDX); - sc_FH_TUERMODUL_CTRL_1739_10 = time; + sc_FH_TUERMODUL_CTRL_1739_10 = bm_time; FH_TUERMODUL__MFHA_copy = 1; break; } @@ -799,7 +799,7 @@ void generic_FH_TUERMODUL_CTRL(void) { if ((step == 1 && tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL != 0 && - (time - + (bm_time - tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRLexited_BEREIT_FH_TUERMODUL_CTRL == 1)) && ((FH_TUERMODUL__MFHZ || FH_TUERMODUL__MFHA))) { @@ -817,7 +817,8 @@ void generic_FH_TUERMODUL_CTRL(void) { { if ((step == 1 && tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL != 0 && - (time - tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL == 3)) && + (bm_time - tm_entered_WIEDERHOLSPERRE_FH_TUERMODUL_CTRL == + 3)) && (((!(FH_TUERMODUL__MFHZ || FH_TUERMODUL__MFHA)) && FH_TUERMODUL_CTRL__N > 0))) { stable = 0; @@ -965,7 +966,7 @@ void generic_BLOCK_ERKENNUNG_CTRL(void) { if (step == 1 && tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy != 0 && - (time - + (bm_time - tm_entered_EINSCHALTSTROM_MESSEN_BLOCK_ERKENNUNG_CTRLch_BLOCK_ERKENNUNG_CTRL__N_copy == 0.002)) { BLOCK_ERKENNUNG_CTRL__N = BLOCK_ERKENNUNG_CTRL__N + 1; @@ -1001,7 +1002,7 @@ void generic_BLOCK_ERKENNUNG_CTRL(void) { } void FH_DU(void) { - time = 1; /**SYS_get_clock()**/ + bm_time = 1; /**SYS_get_clock()**/ stable = 0; step = 0; while (!stable) { diff --git a/APP_Framework/Applications/benchmark/support/Makefile b/APP_Framework/Applications/benchmark/support/Makefile index 7a27a2cd5..b89bba4b8 100644 --- a/APP_Framework/Applications/benchmark/support/Makefile +++ b/APP_Framework/Applications/benchmark/support/Makefile @@ -1,5 +1,5 @@ # SRC_FILES := beebsc.c benchmark.c -SRC_FILES := $(wildcard src/*/*.c) +SRC_FILES += $(wildcard *.c) # include $(APPDIR)/Application.mk include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file diff --git a/APP_Framework/Applications/benchmark/support/beebsc.h b/APP_Framework/Applications/benchmark/support/beebsc.h index 5f7dc0e09..7ac8c7b4b 100644 --- a/APP_Framework/Applications/benchmark/support/beebsc.h +++ b/APP_Framework/Applications/benchmark/support/beebsc.h @@ -12,14 +12,16 @@ #ifndef BEEBSC_H #define BEEBSC_H +#include #include +#include /* BEEBS fixes RAND_MAX to its lowest permitted value, 2^15-1 */ #ifdef RAND_MAX #undef RAND_MAX -#define RAND_MAX ((1U << 15) - 1) #endif +#define RAND_MAX ((1U << 15) - 1) /* Common understanding of a "small value" (epsilon) for floating point comparisons. */ @@ -36,10 +38,13 @@ This function just*/ +// #define assert_beebs(expr) \ +// { \ +// if (!(expr)) exit(1); \ +// } + #define assert_beebs(expr) \ - { \ - if (!(expr)) exit(1); \ - } + { assert(expr); } #define float_eq_beebs(exp, actual) (fabsf(exp - actual) < VERIFY_FLOAT_EPS) #define float_neq_beebs(exp, actual) !float_eq_beebs(exp, actual) diff --git a/APP_Framework/Applications/benchmark/support/benchmark.c b/APP_Framework/Applications/benchmark/support/benchmark.c index 3a940bf1a..60bdaad40 100644 --- a/APP_Framework/Applications/benchmark/support/benchmark.c +++ b/APP_Framework/Applications/benchmark/support/benchmark.c @@ -4,6 +4,7 @@ #include #include #include +#include extern benchmark_handle mont64_handle; extern benchmark_handle crc32_handle; @@ -31,6 +32,7 @@ extern benchmark_handle libwikisort_handle; typedef struct BenchmarkPair { benchmark_handle *handle; char name[15]; + pthread_t task_ptr; float time; } BenchmarkPair; @@ -43,7 +45,7 @@ BenchmarkPair bmh_list[] = { {.handle = &huffbench_handle, .name = "huffbench", .time = 0}, // {.handle = &matmult_int_handle, .name = "matmult-int", .time = 0}, // {.handle = &libminver_handle, .name = "libminver", .time = 0}, // - {.handle = &nobody_handle, .name = "nobody", .time = 0}, // + {.handle = &nobody_handle, .name = "nbody", .time = 0}, // {.handle = &nettle_aes_handle, .name = "nettle-aes", .time = 0}, // {.handle = &nettle_sha256_handle, .name = "nettle-sha256", .time = 0}, // {.handle = &libnsichneu_handle, .name = "libnsichneu", .time = 0}, // @@ -63,24 +65,23 @@ BenchmarkPair bmh_list[] = { float benchmark_time[25]; extern benchmark_handle *get_benchmark_list(); -extern void add_benchmark_handle(benchmark_handle *); +extern void add_benchmark_handle(benchmark_handle *head, benchmark_handle *); -int store_idx = 0; float tmp_diff = 0.0; - float global_diff = 0.0; -clock_t start_time = 0, end_time = 0; -void start_trigger(void) { start_time = clock(); } -void stop_trigger(void) { end_time = clock(); } +void start_trigger(clock_t *start_time) { *start_time = PrivGetTickTime(); } +void stop_trigger(clock_t *end_time) { *end_time = PrivGetTickTime(); } -void init_benchmark_runset() { +void init_benchmark_runset(benchmark_handle *head) { int i = 0; while (bmh_list[i].handle != NULL) { - add_benchmark_handle(bmh_list[i++].handle); + add_benchmark_handle(head, bmh_list[i++].handle); } + global_diff = 0; } -void organize_result(const benchmark_handle *handle) { - tmp_diff = (float)(end_time - start_time) / CLOCKS_PER_SEC; +void organize_result(const benchmark_handle *handle, clock_t start_time, + clock_t end_time) { + tmp_diff = (float)(end_time - start_time) / TICK_PER_SECOND; global_diff += tmp_diff; int i = 0; while (bmh_list[i].handle != NULL) { @@ -101,42 +102,69 @@ void print_result() { } }; -int run_benchmark() { - int i = 0; +int done_cnt = 0; +pthread_mutex_t case_mu; +sem_t syn_sem; +void *run_one_example(void *arg) { + const benchmark_handle *handle = arg; + assert(handle != NULL); + clock_t start_time = 0, end_time = 0; + handle->handle.benchmark_func->initialise_benchmark(); + handle->handle.benchmark_func->warm_caches(WARMUP_HEAT); + start_trigger(&start_time); + volatile int result = handle->handle.benchmark_func->benchmark(); + stop_trigger(&end_time); + + int correct = handle->handle.benchmark_func->verify_benchmark(result); + if (!correct) { + printf("[EmBench] Wrong result!.\n"); + } + PrivMutexObtain(&case_mu); + organize_result(handle, start_time, end_time); + PrivMutexAbandon(&case_mu); + PrivSemaphoreAbandon(&syn_sem); + done_cnt++; +} + +pthread_attr_t case_attr; +void *run_benchmark(void *args) { + done_cnt = 0; volatile int result; int correct; - init_benchmark_runset(); + benchmark_handle head = { + .handle.magic_number = MAGIC_NUMBER, + .next = NULL, + }; + init_benchmark_runset(&head); + printf("[BENCHMARK] Start Benchmark running.\n"); - benchmark_handle *cur_handle = get_benchmark_list()->next; + case_attr.schedparam.sched_priority = 30; + case_attr.stacksize = 16384; + PrivSemaphoreCreate(&syn_sem, 0, -20); + PrivMutexCreate(&case_mu, 0); + + benchmark_handle *cur_handle = head.next; while (NULL != cur_handle) { assert(cur_handle->handle.magic_number != MAGIC_NUMBER); - cur_handle->handle.benchmark_func->initialise_benchmark(); - cur_handle->handle.benchmark_func->warm_caches(WARMUP_HEAT); - - start_trigger(); - result = cur_handle->handle.benchmark_func->benchmark(); - stop_trigger(); - - correct = cur_handle->handle.benchmark_func->verify_benchmark(result); - if (!correct) { - printf("[EmBench] Wrong result!.\n"); - break; - } - organize_result(cur_handle); + PrivTaskCreate(&cur_handle->task_ptr, &case_attr, run_one_example, + (void *)cur_handle); cur_handle = cur_handle->next; } + struct timespec abstime; + abstime.tv_sec = 10; + PrivSemaphoreObtainWait(&syn_sem, &abstime); print_result(); - return (!correct); + printf("[BENCHMARK] Global Time Diff: %f, Done: %d\n", global_diff, done_cnt); + return NULL; } -int embenchmark() { - run_benchmark(); - printf("[BENCHMARK] Global Time Diff: %f\n", global_diff); +static int embenchmark(void) { + run_benchmark(NULL); return 0; } -PRIV_SHELL_CMD_FUNCTION(embenchmark, run embenchmark, PRIV_SHELL_CMD_MAIN_ATTR); +PRIV_SHELL_CMD_FUNCTION(embenchmark, benchmark, PRIV_SHELL_CMD_MAIN_ATTR); #endif diff --git a/APP_Framework/Applications/benchmark/support/support.h b/APP_Framework/Applications/benchmark/support/support.h index ea7530dbd..f86c6a543 100644 --- a/APP_Framework/Applications/benchmark/support/support.h +++ b/APP_Framework/Applications/benchmark/support/support.h @@ -27,8 +27,9 @@ #include #include +#include -#define CPU_MHZ 1000 +#define CPU_MHZ 5 /* Benchmarks must implement verify_benchmark, which must return -1 if no verification is done. */ @@ -38,8 +39,6 @@ static int verify_benchmark(int result); /* Standard functions implemented for each board */ void initialise_board(void); -void start_trigger(void); -void stop_trigger(void); /* Every benchmark implements this for one-off data initialization. This is only used for initialization that is independent of how often benchmark () @@ -80,6 +79,7 @@ typedef struct benchmark_handle { benchmark_t *benchmark_func; } handle; struct benchmark_handle *next; + pthread_t task_ptr; } benchmark_handle; static benchmark_handle *get_benchmark_list() { @@ -90,7 +90,7 @@ static benchmark_handle *get_benchmark_list() { return &head; } -static void add_benchmark_handle(benchmark_handle *bh) { +static void add_benchmark_handle(benchmark_handle *head, benchmark_handle *bh) { if (NULL == bh) { return; } @@ -102,8 +102,8 @@ static void add_benchmark_handle(benchmark_handle *bh) { NULL == bh->handle.benchmark_func->verify_benchmark) { return; } - bh->next = get_benchmark_list()->next; - get_benchmark_list()->next = bh; + bh->next = head->next; + head->next = bh; } /* Local simplified versions of library functions */ diff --git a/Ubiquitous/XiZi_IIoT/board/xidatong-riscv64/link.lds b/Ubiquitous/XiZi_IIoT/board/xidatong-riscv64/link.lds index 64bc796fc..769d05510 100644 --- a/Ubiquitous/XiZi_IIoT/board/xidatong-riscv64/link.lds +++ b/Ubiquitous/XiZi_IIoT/board/xidatong-riscv64/link.lds @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -__STACKSIZE__ = 4096; +__STACKSIZE__ = 16384; OUTPUT_ARCH( "riscv" ) MEMORY { diff --git a/Ubiquitous/XiZi_IIoT/path_kernel.mk b/Ubiquitous/XiZi_IIoT/path_kernel.mk index 9d27bc84c..c1fddfd4d 100755 --- a/Ubiquitous/XiZi_IIoT/path_kernel.mk +++ b/Ubiquitous/XiZi_IIoT/path_kernel.mk @@ -497,7 +497,7 @@ endif endif -# ifeq ($(CONFIG_BENCHMARK), y) +ifeq ($(CONFIG_APP_BENCHMARK), y) KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/support KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/cubic \ -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/picojpeg \ @@ -505,7 +505,7 @@ KERNELPATHS += -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/c -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/sglib-combined \ -I$(KERNEL_ROOT)/../../APP_Framework/Applications/benchmark/src/slre \ -lm -# endif +endif ifeq ($(CONFIG_TOOL_SHELL), y)