| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- /*
- Copyright 2018 Embedded Microprocessor Benchmark Consortium (EEMBC)
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- Original Author: Shay Gal-on
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <rtthread.h>
- #include "coremark.h"
- #if VALIDATION_RUN
- volatile ee_s32 seed1_volatile=0x3415;
- volatile ee_s32 seed2_volatile=0x3415;
- volatile ee_s32 seed3_volatile=0x66;
- #endif
- #if PERFORMANCE_RUN
- volatile ee_s32 seed1_volatile=0x0;
- volatile ee_s32 seed2_volatile=0x0;
- volatile ee_s32 seed3_volatile=0x66;
- #endif
- #if PROFILE_RUN
- volatile ee_s32 seed1_volatile=0x8;
- volatile ee_s32 seed2_volatile=0x8;
- volatile ee_s32 seed3_volatile=0x8;
- #endif
- volatile ee_s32 seed4_volatile=ITERATIONS;
- volatile ee_s32 seed5_volatile=0;
- /* Porting : Timing functions
- How to capture time and convert to seconds must be ported to whatever is supported by the platform.
- e.g. Read value from on board RTC, read value from cpu clock cycles performance counter etc.
- Sample implementation for standard time.h and windows.h definitions included.
- */
- /* Define : TIMER_RES_DIVIDER
- Divider to trade off timer resolution and total time that can be measured.
- Use lower values to increase resolution, but make sure that overflow does not occur.
- If there are issues with the return value overflowing, increase this value.
- */
- #define NSECS_PER_SEC RT_TICK_PER_SECOND
- #define CORETIMETYPE rt_tick_t
- #define GETMYTIME(_t) (*_t=rt_tick_get())
- #define MYTIMEDIFF(fin,ini) ((fin)-(ini))
- #define TIMER_RES_DIVIDER 1
- #define SAMPLE_TIME_IMPLEMENTATION 1
- #define EE_TICKS_PER_SEC (NSECS_PER_SEC / TIMER_RES_DIVIDER)
- /** Define Host specific (POSIX), or target specific global time variables. */
- static CORETIMETYPE start_time_val, stop_time_val;
- /* Function : start_time
- This function will be called right before starting the timed portion of the benchmark.
- Implementation may be capturing a system timer (as implemented in the example code)
- or zeroing some system parameters - e.g. setting the cpu clocks cycles to 0.
- */
- void start_time(void) {
- GETMYTIME(&start_time_val );
- }
- /* Function : stop_time
- This function will be called right after ending the timed portion of the benchmark.
- Implementation may be capturing a system timer (as implemented in the example code)
- or other system parameters - e.g. reading the current value of cpu cycles counter.
- */
- void stop_time(void) {
- GETMYTIME(&stop_time_val );
- }
- /* Function : get_time
- Return an abstract "ticks" number that signifies time on the system.
-
- Actual value returned may be cpu cycles, milliseconds or any other value,
- as long as it can be converted to seconds by <time_in_secs>.
- This methodology is taken to accomodate any hardware or simulated platform.
- The sample implementation returns millisecs by default,
- and the resolution is controlled by <TIMER_RES_DIVIDER>
- */
- CORE_TICKS get_time(void) {
- CORE_TICKS elapsed=(CORE_TICKS)(MYTIMEDIFF(stop_time_val, start_time_val));
- return elapsed;
- }
- /* Function : time_in_secs
- Convert the value returned by get_time to seconds.
- The <secs_ret> type is used to accomodate systems with no support for floating point.
- Default implementation implemented by the EE_TICKS_PER_SEC macro above.
- */
- secs_ret time_in_secs(CORE_TICKS ticks) {
- secs_ret retval=((secs_ret)ticks) / (secs_ret)EE_TICKS_PER_SEC;
- return retval;
- }
- ee_u32 default_num_contexts=1;
- /* Function : portable_init
- Target specific initialization code
- Test for some common mistakes.
- */
- void portable_init(core_portable *p, int *argc, char *argv[])
- {
- ee_printf("Benchmark started, please make sure it runs for at least 10s.\n\n");
- if (sizeof(ee_ptr_int) != sizeof(ee_u8 *)) {
- ee_printf("ERROR! Please define ee_ptr_int to a type that holds a pointer!\n");
- }
- if (sizeof(ee_u32) != 4) {
- ee_printf("ERROR! Please define ee_u32 to a 32b unsigned type!\n");
- }
- p->portable_id=1;
- }
- /* Function : portable_fini
- Target specific final code
- */
- void portable_fini(core_portable *p)
- {
- p->portable_id=0;
- }
|