diff options
Diffstat (limited to 'examples/test')
| -rw-r--r-- | examples/test/dhry.h | 824 | ||||
| -rw-r--r-- | examples/test/dhry_1.c | 698 | ||||
| -rw-r--r-- | examples/test/fs_test.c | 594 | ||||
| -rw-r--r-- | examples/test/mem_test.c | 210 | ||||
| -rw-r--r-- | examples/test/net_test.c | 564 |
5 files changed, 1445 insertions, 1445 deletions
diff --git a/examples/test/dhry.h b/examples/test/dhry.h index 02e7180e59..8f47233802 100644 --- a/examples/test/dhry.h +++ b/examples/test/dhry.h @@ -1,412 +1,412 @@ -/*
- ****************************************************************************
- *
- * "DHRYSTONE" Benchmark Program
- * -----------------------------
- *
- * Version: C, Version 2.1
- *
- * File: dhry.h (part 1 of 3)
- *
- * Date: May 25, 1988
- *
- * Author: Reinhold P. Weicker
- * Siemens AG, AUT E 51
- * Postfach 3220
- * 8520 Erlangen
- * Germany (West)
- * Phone: [+49]-9131-7-20330
- * (8-17 Central European Time)
- * Usenet: ..!mcsun!unido!estevax!weicker
- *
- * Original Version (in Ada) published in
- * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984),
- * pp. 1013 - 1030, together with the statistics
- * on which the distribution of statements etc. is based.
- *
- * In this C version, the following C library functions are used:
- * - strcpy, strcmp (inside the measurement loop)
- * - printf, scanf (outside the measurement loop)
- * In addition, Berkeley UNIX system calls "times ()" or "time ()"
- * are used for execution time measurement. For measurements
- * on other systems, these calls have to be changed.
- *
- * Collection of Results:
- * Reinhold Weicker (address see above) and
- *
- * Rick Richardson
- * PC Research. Inc.
- * 94 Apple Orchard Drive
- * Tinton Falls, NJ 07724
- * Phone: (201) 389-8963 (9-17 EST)
- * Usenet: ...!uunet!pcrat!rick
- *
- * Please send results to Rick Richardson and/or Reinhold Weicker.
- * Complete information should be given on hardware and software used.
- * Hardware information includes: Machine type, CPU, type and size
- * of caches; for microprocessors: clock frequency, memory speed
- * (number of wait states).
- * Software information includes: Compiler (and runtime library)
- * manufacturer and version, compilation switches, OS version.
- * The Operating System version may give an indication about the
- * compiler; Dhrystone itself performs no OS calls in the measurement loop.
- *
- * The complete output generated by the program should be mailed
- * such that at least some checks for correctness can be made.
- *
- ***************************************************************************
- *
- * History: This version C/2.1 has been made for two reasons:
- *
- * 1) There is an obvious need for a common C version of
- * Dhrystone, since C is at present the most popular system
- * programming language for the class of processors
- * (microcomputers, minicomputers) where Dhrystone is used most.
- * There should be, as far as possible, only one C version of
- * Dhrystone such that results can be compared without
- * restrictions. In the past, the C versions distributed
- * by Rick Richardson (Version 1.1) and by Reinhold Weicker
- * had small (though not significant) differences.
- *
- * 2) As far as it is possible without changes to the Dhrystone
- * statistics, optimizing compilers should be prevented from
- * removing significant statements.
- *
- * This C version has been developed in cooperation with
- * Rick Richardson (Tinton Falls, NJ), it incorporates many
- * ideas from the "Version 1.1" distributed previously by
- * him over the UNIX network Usenet.
- * I also thank Chaim Benedelac (National Semiconductor),
- * David Ditzel (SUN), Earl Killian and John Mashey (MIPS),
- * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley)
- * for their help with comments on earlier versions of the
- * benchmark.
- *
- * Changes: In the initialization part, this version follows mostly
- * Rick Richardson's version distributed via Usenet, not the
- * version distributed earlier via floppy disk by Reinhold Weicker.
- * As a concession to older compilers, names have been made
- * unique within the first 8 characters.
- * Inside the measurement loop, this version follows the
- * version previously distributed by Reinhold Weicker.
- *
- * At several places in the benchmark, code has been added,
- * but within the measurement loop only in branches that
- * are not executed. The intention is that optimizing compilers
- * should be prevented from moving code out of the measurement
- * loop, or from removing code altogether. Since the statements
- * that are executed within the measurement loop have NOT been
- * changed, the numbers defining the "Dhrystone distribution"
- * (distribution of statements, operand types and locality)
- * still hold. Except for sophisticated optimizing compilers,
- * execution times for this version should be the same as
- * for previous versions.
- *
- * Since it has proven difficult to subtract the time for the
- * measurement loop overhead in a correct way, the loop check
- * has been made a part of the benchmark. This does have
- * an impact - though a very minor one - on the distribution
- * statistics which have been updated for this version.
- *
- * All changes within the measurement loop are described
- * and discussed in the companion paper "Rationale for
- * Dhrystone version 2".
- *
- * Because of the self-imposed limitation that the order and
- * distribution of the executed statements should not be
- * changed, there are still cases where optimizing compilers
- * may not generate code for some statements. To a certain
- * degree, this is unavoidable for small synthetic benchmarks.
- * Users of the benchmark are advised to check code listings
- * whether code is generated for all statements of Dhrystone.
- *
- * Version 2.1 is identical to version 2.0 distributed via
- * the UNIX network Usenet in March 1988 except that it corrects
- * some minor deficiencies that were found by users of version 2.0.
- * The only change within the measurement loop is that a
- * non-executed "else" part was added to the "if" statement in
- * Func_3, and a non-executed "else" part removed from Proc_3.
- *
- ***************************************************************************
- *
- * Defines: The following "Defines" are possible:
- * -DREG=register (default: Not defined)
- * As an approximation to what an average C programmer
- * might do, the "register" storage class is applied
- * (if enabled by -DREG=register)
- * - for local variables, if they are used (dynamically)
- * five or more times
- * - for parameters if they are used (dynamically)
- * six or more times
- * Note that an optimal "register" strategy is
- * compiler-dependent, and that "register" declarations
- * do not necessarily lead to faster execution.
- * -DNOSTRUCTASSIGN (default: Not defined)
- * Define if the C compiler does not support
- * assignment of structures.
- * -DNOENUMS (default: Not defined)
- * Define if the C compiler does not support
- * enumeration types.
- * -DTIMES (default)
- * -DTIME
- * The "times" function of UNIX (returning process times)
- * or the "time" function (returning wallclock time)
- * is used for measurement.
- * For single user machines, "time ()" is adequate. For
- * multi-user machines where you cannot get single-user
- * access, use the "times ()" function. If you have
- * neither, use a stopwatch in the dead of night.
- * "printf"s are provided marking the points "Start Timer"
- * and "Stop Timer". DO NOT use the UNIX "time(1)"
- * command, as this will measure the total time to
- * run this program, which will (erroneously) include
- * the time to allocate storage (malloc) and to perform
- * the initialization.
- * -DHZ=nnn
- * In Berkeley UNIX, the function "times" returns process
- * time in 1/HZ seconds, with HZ = 60 for most systems.
- * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY
- * A VALUE.
- *
- ***************************************************************************
- *
- * Compilation model and measurement (IMPORTANT):
- *
- * This C version of Dhrystone consists of three files:
- * - dhry.h (this file, containing global definitions and comments)
- * - dhry_1.c (containing the code corresponding to Ada package Pack_1)
- * - dhry_2.c (containing the code corresponding to Ada package Pack_2)
- *
- * The following "ground rules" apply for measurements:
- * - Separate compilation
- * - No procedure merging
- * - Otherwise, compiler optimizations are allowed but should be indicated
- * - Default results are those without register declarations
- * See the companion paper "Rationale for Dhrystone Version 2" for a more
- * detailed discussion of these ground rules.
- *
- * For 16-Bit processors (e.g. 80186, 80286), times for all compilation
- * models ("small", "medium", "large" etc.) should be given if possible,
- * together with a definition of these models for the compiler system used.
- *
- **************************************************************************
- *
- * Dhrystone (C version) statistics:
- *
- * [Comment from the first distribution, updated for version 2.
- * Note that because of language differences, the numbers are slightly
- * different from the Ada version.]
- *
- * The following program contains statements of a high level programming
- * language (here: C) in a distribution considered representative:
- *
- * assignments 52 (51.0 %)
- * control statements 33 (32.4 %)
- * procedure, function calls 17 (16.7 %)
- *
- * 103 statements are dynamically executed. The program is balanced with
- * respect to the three aspects:
- *
- * - statement type
- * - operand type
- * - operand locality
- * operand global, local, parameter, or constant.
- *
- * The combination of these three aspects is balanced only approximately.
- *
- * 1. Statement Type:
- * ----------------- number
- *
- * V1 = V2 9
- * (incl. V1 = F(..)
- * V = Constant 12
- * Assignment, 7
- * with array element
- * Assignment, 6
- * with record component
- * --
- * 34 34
- *
- * X = Y +|-|"&&"|"|" Z 5
- * X = Y +|-|"==" Constant 6
- * X = X +|- 1 3
- * X = Y *|/ Z 2
- * X = Expression, 1
- * two operators
- * X = Expression, 1
- * three operators
- * --
- * 18 18
- *
- * if .... 14
- * with "else" 7
- * without "else" 7
- * executed 3
- * not executed 4
- * for ... 7 | counted every time
- * while ... 4 | the loop condition
- * do ... while 1 | is evaluated
- * switch ... 1
- * break 1
- * declaration with 1
- * initialization
- * --
- * 34 34
- *
- * P (...) procedure call 11
- * user procedure 10
- * library procedure 1
- * X = F (...)
- * function call 6
- * user function 5
- * library function 1
- * --
- * 17 17
- * ---
- * 103
- *
- * The average number of parameters in procedure or function calls
- * is 1.82 (not counting the function values as implicit parameters).
- *
- *
- * 2. Operators
- * ------------
- * number approximate
- * percentage
- *
- * Arithmetic 32 50.8
- *
- * + 21 33.3
- * - 7 11.1
- * * 3 4.8
- * / (int div) 1 1.6
- *
- * Comparison 27 42.8
- *
- * == 9 14.3
- * /= 4 6.3
- * > 1 1.6
- * < 3 4.8
- * >= 1 1.6
- * <= 9 14.3
- *
- * Logic 4 6.3
- *
- * && (AND-THEN) 1 1.6
- * | (OR) 1 1.6
- * ! (NOT) 2 3.2
- *
- * -- -----
- * 63 100.1
- *
- *
- * 3. Operand Type (counted once per operand reference):
- * ---------------
- * number approximate
- * percentage
- *
- * Integer 175 72.3 %
- * Character 45 18.6 %
- * Pointer 12 5.0 %
- * String30 6 2.5 %
- * Array 2 0.8 %
- * Record 2 0.8 %
- * --- -------
- * 242 100.0 %
- *
- * When there is an access path leading to the final operand (e.g. a record
- * component), only the final data type on the access path is counted.
- *
- *
- * 4. Operand Locality:
- * -------------------
- * number approximate
- * percentage
- *
- * local variable 114 47.1 %
- * global variable 22 9.1 %
- * parameter 45 18.6 %
- * value 23 9.5 %
- * reference 22 9.1 %
- * function result 6 2.5 %
- * constant 55 22.7 %
- * --- -------
- * 242 100.0 %
- *
- *
- * The program does not compute anything meaningful, but it is syntactically
- * and semantically correct. All variables have a value assigned to them
- * before they are used as a source operand.
- *
- * There has been no explicit effort to account for the effects of a
- * cache, or to balance the use of long or short displacements for code or
- * data.
- *
- ***************************************************************************
- */
-
-/* Compiler and system dependent definitions: */
-
-#define Mic_secs_Per_Second 1000000.0
- /* Berkeley UNIX C returns process times in seconds/HZ */
-
-#ifdef NOSTRUCTASSIGN
-#define structassign(d, s) memcpy(&(d), &(s), sizeof(d))
-#else
-#define structassign(d, s) d = s
-#endif
-
-#ifdef NOENUM
-#define Ident_1 0
-#define Ident_2 1
-#define Ident_3 2
-#define Ident_4 3
-#define Ident_5 4
- typedef int Enumeration;
-#else
- typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
- Enumeration;
-#endif
- /* for boolean and enumeration types in Ada, Pascal */
-
-/* General definitions: */
-
-// #include <stdio.h>
- /* for strcpy, strcmp */
-#include <rtthread.h>
-
-#define Null 0
- /* Value of a Null pointer */
-#define true 1
-#define false 0
-
-typedef int One_Thirty;
-typedef int One_Fifty;
-typedef char Capital_Letter;
-typedef int Boolean;
-typedef char Str_30 [31];
-typedef int Arr_1_Dim [50];
-typedef int Arr_2_Dim [50] [50];
-
-typedef struct record
- {
- struct record *Ptr_Comp;
- Enumeration Discr;
- union {
- struct {
- Enumeration Enum_Comp;
- int Int_Comp;
- char Str_Comp [31];
- } var_1;
- struct {
- Enumeration E_Comp_2;
- char Str_2_Comp [31];
- } var_2;
- struct {
- char Ch_1_Comp;
- char Ch_2_Comp;
- } var_3;
- } variant;
- } Rec_Type, *Rec_Pointer;
-
-
+/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry.h (part 1 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * Siemens AG, AUT E 51 + * Postfach 3220 + * 8520 Erlangen + * Germany (West) + * Phone: [+49]-9131-7-20330 + * (8-17 Central European Time) + * Usenet: ..!mcsun!unido!estevax!weicker + * + * Original Version (in Ada) published in + * "Communications of the ACM" vol. 27., no. 10 (Oct. 1984), + * pp. 1013 - 1030, together with the statistics + * on which the distribution of statements etc. is based. + * + * In this C version, the following C library functions are used: + * - strcpy, strcmp (inside the measurement loop) + * - printf, scanf (outside the measurement loop) + * In addition, Berkeley UNIX system calls "times ()" or "time ()" + * are used for execution time measurement. For measurements + * on other systems, these calls have to be changed. + * + * Collection of Results: + * Reinhold Weicker (address see above) and + * + * Rick Richardson + * PC Research. Inc. + * 94 Apple Orchard Drive + * Tinton Falls, NJ 07724 + * Phone: (201) 389-8963 (9-17 EST) + * Usenet: ...!uunet!pcrat!rick + * + * Please send results to Rick Richardson and/or Reinhold Weicker. + * Complete information should be given on hardware and software used. + * Hardware information includes: Machine type, CPU, type and size + * of caches; for microprocessors: clock frequency, memory speed + * (number of wait states). + * Software information includes: Compiler (and runtime library) + * manufacturer and version, compilation switches, OS version. + * The Operating System version may give an indication about the + * compiler; Dhrystone itself performs no OS calls in the measurement loop. + * + * The complete output generated by the program should be mailed + * such that at least some checks for correctness can be made. + * + *************************************************************************** + * + * History: This version C/2.1 has been made for two reasons: + * + * 1) There is an obvious need for a common C version of + * Dhrystone, since C is at present the most popular system + * programming language for the class of processors + * (microcomputers, minicomputers) where Dhrystone is used most. + * There should be, as far as possible, only one C version of + * Dhrystone such that results can be compared without + * restrictions. In the past, the C versions distributed + * by Rick Richardson (Version 1.1) and by Reinhold Weicker + * had small (though not significant) differences. + * + * 2) As far as it is possible without changes to the Dhrystone + * statistics, optimizing compilers should be prevented from + * removing significant statements. + * + * This C version has been developed in cooperation with + * Rick Richardson (Tinton Falls, NJ), it incorporates many + * ideas from the "Version 1.1" distributed previously by + * him over the UNIX network Usenet. + * I also thank Chaim Benedelac (National Semiconductor), + * David Ditzel (SUN), Earl Killian and John Mashey (MIPS), + * Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley) + * for their help with comments on earlier versions of the + * benchmark. + * + * Changes: In the initialization part, this version follows mostly + * Rick Richardson's version distributed via Usenet, not the + * version distributed earlier via floppy disk by Reinhold Weicker. + * As a concession to older compilers, names have been made + * unique within the first 8 characters. + * Inside the measurement loop, this version follows the + * version previously distributed by Reinhold Weicker. + * + * At several places in the benchmark, code has been added, + * but within the measurement loop only in branches that + * are not executed. The intention is that optimizing compilers + * should be prevented from moving code out of the measurement + * loop, or from removing code altogether. Since the statements + * that are executed within the measurement loop have NOT been + * changed, the numbers defining the "Dhrystone distribution" + * (distribution of statements, operand types and locality) + * still hold. Except for sophisticated optimizing compilers, + * execution times for this version should be the same as + * for previous versions. + * + * Since it has proven difficult to subtract the time for the + * measurement loop overhead in a correct way, the loop check + * has been made a part of the benchmark. This does have + * an impact - though a very minor one - on the distribution + * statistics which have been updated for this version. + * + * All changes within the measurement loop are described + * and discussed in the companion paper "Rationale for + * Dhrystone version 2". + * + * Because of the self-imposed limitation that the order and + * distribution of the executed statements should not be + * changed, there are still cases where optimizing compilers + * may not generate code for some statements. To a certain + * degree, this is unavoidable for small synthetic benchmarks. + * Users of the benchmark are advised to check code listings + * whether code is generated for all statements of Dhrystone. + * + * Version 2.1 is identical to version 2.0 distributed via + * the UNIX network Usenet in March 1988 except that it corrects + * some minor deficiencies that were found by users of version 2.0. + * The only change within the measurement loop is that a + * non-executed "else" part was added to the "if" statement in + * Func_3, and a non-executed "else" part removed from Proc_3. + * + *************************************************************************** + * + * Defines: The following "Defines" are possible: + * -DREG=register (default: Not defined) + * As an approximation to what an average C programmer + * might do, the "register" storage class is applied + * (if enabled by -DREG=register) + * - for local variables, if they are used (dynamically) + * five or more times + * - for parameters if they are used (dynamically) + * six or more times + * Note that an optimal "register" strategy is + * compiler-dependent, and that "register" declarations + * do not necessarily lead to faster execution. + * -DNOSTRUCTASSIGN (default: Not defined) + * Define if the C compiler does not support + * assignment of structures. + * -DNOENUMS (default: Not defined) + * Define if the C compiler does not support + * enumeration types. + * -DTIMES (default) + * -DTIME + * The "times" function of UNIX (returning process times) + * or the "time" function (returning wallclock time) + * is used for measurement. + * For single user machines, "time ()" is adequate. For + * multi-user machines where you cannot get single-user + * access, use the "times ()" function. If you have + * neither, use a stopwatch in the dead of night. + * "printf"s are provided marking the points "Start Timer" + * and "Stop Timer". DO NOT use the UNIX "time(1)" + * command, as this will measure the total time to + * run this program, which will (erroneously) include + * the time to allocate storage (malloc) and to perform + * the initialization. + * -DHZ=nnn + * In Berkeley UNIX, the function "times" returns process + * time in 1/HZ seconds, with HZ = 60 for most systems. + * CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY + * A VALUE. + * + *************************************************************************** + * + * Compilation model and measurement (IMPORTANT): + * + * This C version of Dhrystone consists of three files: + * - dhry.h (this file, containing global definitions and comments) + * - dhry_1.c (containing the code corresponding to Ada package Pack_1) + * - dhry_2.c (containing the code corresponding to Ada package Pack_2) + * + * The following "ground rules" apply for measurements: + * - Separate compilation + * - No procedure merging + * - Otherwise, compiler optimizations are allowed but should be indicated + * - Default results are those without register declarations + * See the companion paper "Rationale for Dhrystone Version 2" for a more + * detailed discussion of these ground rules. + * + * For 16-Bit processors (e.g. 80186, 80286), times for all compilation + * models ("small", "medium", "large" etc.) should be given if possible, + * together with a definition of these models for the compiler system used. + * + ************************************************************************** + * + * Dhrystone (C version) statistics: + * + * [Comment from the first distribution, updated for version 2. + * Note that because of language differences, the numbers are slightly + * different from the Ada version.] + * + * The following program contains statements of a high level programming + * language (here: C) in a distribution considered representative: + * + * assignments 52 (51.0 %) + * control statements 33 (32.4 %) + * procedure, function calls 17 (16.7 %) + * + * 103 statements are dynamically executed. The program is balanced with + * respect to the three aspects: + * + * - statement type + * - operand type + * - operand locality + * operand global, local, parameter, or constant. + * + * The combination of these three aspects is balanced only approximately. + * + * 1. Statement Type: + * ----------------- number + * + * V1 = V2 9 + * (incl. V1 = F(..) + * V = Constant 12 + * Assignment, 7 + * with array element + * Assignment, 6 + * with record component + * -- + * 34 34 + * + * X = Y +|-|"&&"|"|" Z 5 + * X = Y +|-|"==" Constant 6 + * X = X +|- 1 3 + * X = Y *|/ Z 2 + * X = Expression, 1 + * two operators + * X = Expression, 1 + * three operators + * -- + * 18 18 + * + * if .... 14 + * with "else" 7 + * without "else" 7 + * executed 3 + * not executed 4 + * for ... 7 | counted every time + * while ... 4 | the loop condition + * do ... while 1 | is evaluated + * switch ... 1 + * break 1 + * declaration with 1 + * initialization + * -- + * 34 34 + * + * P (...) procedure call 11 + * user procedure 10 + * library procedure 1 + * X = F (...) + * function call 6 + * user function 5 + * library function 1 + * -- + * 17 17 + * --- + * 103 + * + * The average number of parameters in procedure or function calls + * is 1.82 (not counting the function values as implicit parameters). + * + * + * 2. Operators + * ------------ + * number approximate + * percentage + * + * Arithmetic 32 50.8 + * + * + 21 33.3 + * - 7 11.1 + * * 3 4.8 + * / (int div) 1 1.6 + * + * Comparison 27 42.8 + * + * == 9 14.3 + * /= 4 6.3 + * > 1 1.6 + * < 3 4.8 + * >= 1 1.6 + * <= 9 14.3 + * + * Logic 4 6.3 + * + * && (AND-THEN) 1 1.6 + * | (OR) 1 1.6 + * ! (NOT) 2 3.2 + * + * -- ----- + * 63 100.1 + * + * + * 3. Operand Type (counted once per operand reference): + * --------------- + * number approximate + * percentage + * + * Integer 175 72.3 % + * Character 45 18.6 % + * Pointer 12 5.0 % + * String30 6 2.5 % + * Array 2 0.8 % + * Record 2 0.8 % + * --- ------- + * 242 100.0 % + * + * When there is an access path leading to the final operand (e.g. a record + * component), only the final data type on the access path is counted. + * + * + * 4. Operand Locality: + * ------------------- + * number approximate + * percentage + * + * local variable 114 47.1 % + * global variable 22 9.1 % + * parameter 45 18.6 % + * value 23 9.5 % + * reference 22 9.1 % + * function result 6 2.5 % + * constant 55 22.7 % + * --- ------- + * 242 100.0 % + * + * + * The program does not compute anything meaningful, but it is syntactically + * and semantically correct. All variables have a value assigned to them + * before they are used as a source operand. + * + * There has been no explicit effort to account for the effects of a + * cache, or to balance the use of long or short displacements for code or + * data. + * + *************************************************************************** + */ + +/* Compiler and system dependent definitions: */ + +#define Mic_secs_Per_Second 1000000.0 + /* Berkeley UNIX C returns process times in seconds/HZ */ + +#ifdef NOSTRUCTASSIGN +#define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) +#else +#define structassign(d, s) d = s +#endif + +#ifdef NOENUM +#define Ident_1 0 +#define Ident_2 1 +#define Ident_3 2 +#define Ident_4 3 +#define Ident_5 4 + typedef int Enumeration; +#else + typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5} + Enumeration; +#endif + /* for boolean and enumeration types in Ada, Pascal */ + +/* General definitions: */ + +// #include <stdio.h> + /* for strcpy, strcmp */ +#include <rtthread.h> + +#define Null 0 + /* Value of a Null pointer */ +#define true 1 +#define false 0 + +typedef int One_Thirty; +typedef int One_Fifty; +typedef char Capital_Letter; +typedef int Boolean; +typedef char Str_30 [31]; +typedef int Arr_1_Dim [50]; +typedef int Arr_2_Dim [50] [50]; + +typedef struct record + { + struct record *Ptr_Comp; + Enumeration Discr; + union { + struct { + Enumeration Enum_Comp; + int Int_Comp; + char Str_Comp [31]; + } var_1; + struct { + Enumeration E_Comp_2; + char Str_2_Comp [31]; + } var_2; + struct { + char Ch_1_Comp; + char Ch_2_Comp; + } var_3; + } variant; + } Rec_Type, *Rec_Pointer; + + diff --git a/examples/test/dhry_1.c b/examples/test/dhry_1.c index 18cdfec291..b45b9ddafa 100644 --- a/examples/test/dhry_1.c +++ b/examples/test/dhry_1.c @@ -1,349 +1,349 @@ -/*
- ****************************************************************************
- *
- * "DHRYSTONE" Benchmark Program
- * -----------------------------
- *
- * Version: C, Version 2.1
- *
- * File: dhry_1.c (part 2 of 3)
- *
- * Date: May 25, 1988
- *
- * Author: Reinhold P. Weicker
- *
- ****************************************************************************
- */
-
-#define NUMBER_OF_RUNS 1000000
-
-#include "dhry.h"
-#define printf rt_kprintf
-
-/* Global Variables: */
-
-Rec_Pointer Ptr_Glob,
- Next_Ptr_Glob;
-int Int_Glob;
-Boolean Bool_Glob;
-char Ch_1_Glob,
- Ch_2_Glob;
-int Arr_1_Glob [50];
-int Arr_2_Glob [50] [50];
-
-Enumeration Func_1 ();
-
-/* forward declaration necessary since Enumeration may not simply be int */
-
-#ifndef REG
- Boolean Reg = false;
-#define REG
- /* REG becomes defined as empty */
- /* i.e. no register variables */
-#else
- Boolean Reg = true;
-#endif
-
-/* variables for time measurement: */
-
-float Begin_Time,
- End_Time,
- User_Time;
-float Microseconds,
- Dhrystones_Per_Second;
-
-/* end of variables for time measurement */
-
-void dhry_test(void)
-/*****/
-
- /* main program, corresponds to procedures */
- /* Main and Proc_0 in the Ada version */
-{
- One_Fifty Int_1_Loc;
- REG One_Fifty Int_2_Loc;
- One_Fifty Int_3_Loc;
- REG char Ch_Index;
- Enumeration Enum_Loc;
- Str_30 Str_1_Loc;
- Str_30 Str_2_Loc;
- REG int Run_Index;
- REG int Number_Of_Runs;
-
- /* Initializations */
-
- Next_Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type));
- Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type));
-
- Ptr_Glob->Ptr_Comp = Next_Ptr_Glob;
- Ptr_Glob->Discr = Ident_1;
- Ptr_Glob->variant.var_1.Enum_Comp = Ident_3;
- Ptr_Glob->variant.var_1.Int_Comp = 40;
- rt_strncpy (Ptr_Glob->variant.var_1.Str_Comp,
- "DHRYSTONE PROGRAM, SOME STRING", sizeof(Ptr_Glob->variant.var_1.Str_Comp));
- rt_strncpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING", sizeof(Str_1_Loc));
-
- Arr_2_Glob [8][7] = 10;
- /* Was missing in published program. Without this statement, */
- /* Arr_2_Glob [8][7] would have an undefined value. */
- /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */
- /* overflow may occur for this array element. */
-
- printf ("\n");
- printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n");
- printf ("\n");
- if (Reg)
- {
- printf ("Program compiled with 'register' attribute\n");
- printf ("\n");
- }
- else
- {
- printf ("Program compiled without 'register' attribute\n");
- printf ("\n");
- }
- printf ("Please give the number of runs through the benchmark: ");
-
- Number_Of_Runs = NUMBER_OF_RUNS;
- printf ("%d\n", Number_Of_Runs);
-
- printf ("\n");
-
- printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs);
-
- /***************/
- /* Start timer */
- /***************/
-
-// Add your timer initializing code here
-
- Begin_Time = rt_tick_get(); /* get start tick */
-
- for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
- {
-
- Proc_5();
- Proc_4();
- /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
- Int_1_Loc = 2;
- Int_2_Loc = 3;
- rt_strncpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING", sizeof(Str_2_Loc));
- Enum_Loc = Ident_2;
- Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);
- /* Bool_Glob == 1 */
- while (Int_1_Loc < Int_2_Loc) /* loop body executed once */
- {
- Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
- /* Int_3_Loc == 7 */
- Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);
- /* Int_3_Loc == 7 */
- Int_1_Loc += 1;
- } /* while */
- /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
- Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
- /* Int_Glob == 5 */
- Proc_1 (Ptr_Glob);
- for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index)
- /* loop body executed twice */
- {
- if (Enum_Loc == Func_1 (Ch_Index, 'C'))
- /* then, not executed */
- {
- Proc_6 (Ident_1, &Enum_Loc);
- rt_strncpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING", sizeof(Str_2_Loc));
- Int_2_Loc = Run_Index;
- Int_Glob = Run_Index;
- }
- }
- /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
- Int_2_Loc = Int_2_Loc * Int_1_Loc;
- Int_1_Loc = Int_2_Loc / Int_3_Loc;
- Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
- /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
- Proc_2 (&Int_1_Loc);
- /* Int_1_Loc == 5 */
-
- } /* loop "for Run_Index" */
-
- /**************/
- /* Stop timer */
- /**************/
-
- End_Time = rt_tick_get(); // Get end tick
-
- printf ("Execution ends\n");
- printf ("\n");
- printf ("Final values of the variables used in the benchmark:\n");
- printf ("\n");
- printf ("Int_Glob: %d\n", Int_Glob);
- printf (" should be: %d\n", 5);
- printf ("Bool_Glob: %d\n", Bool_Glob);
- printf (" should be: %d\n", 1);
- printf ("Ch_1_Glob: %c\n", Ch_1_Glob);
- printf (" should be: %c\n", 'A');
- printf ("Ch_2_Glob: %c\n", Ch_2_Glob);
- printf (" should be: %c\n", 'B');
- printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]);
- printf (" should be: %d\n", 7);
- printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]);
- printf (" should be: Number_Of_Runs + 10\n");
- printf ("Ptr_Glob->\n");
- printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp);
- printf (" should be: (implementation-dependent)\n");
- printf (" Discr: %d\n", Ptr_Glob->Discr);
- printf (" should be: %d\n", 0);
- printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp);
- printf (" should be: %d\n", 2);
- printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp);
- printf (" should be: %d\n", 17);
- printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp);
- printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n");
- printf ("Next_Ptr_Glob->\n");
- printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp);
- printf (" should be: (implementation-dependent), same as above\n");
- printf (" Discr: %d\n", Next_Ptr_Glob->Discr);
- printf (" should be: %d\n", 0);
- printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp);
- printf (" should be: %d\n", 1);
- printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp);
- printf (" should be: %d\n", 18);
- printf (" Str_Comp: %s\n",
- Next_Ptr_Glob->variant.var_1.Str_Comp);
- printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n");
- printf ("Int_1_Loc: %d\n", Int_1_Loc);
- printf (" should be: %d\n", 5);
- printf ("Int_2_Loc: %d\n", Int_2_Loc);
- printf (" should be: %d\n", 13);
- printf ("Int_3_Loc: %d\n", Int_3_Loc);
- printf (" should be: %d\n", 7);
- printf ("Enum_Loc: %d\n", Enum_Loc);
- printf (" should be: %d\n", 1);
- printf ("Str_1_Loc: %s\n", Str_1_Loc);
- printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n");
- printf ("Str_2_Loc: %s\n", Str_2_Loc);
- printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n");
- printf ("\n");
-
- User_Time = (End_Time - Begin_Time) / RT_TICK_PER_SECOND;
-
- Microseconds = (float) User_Time * Mic_secs_Per_Second
- / (float) Number_Of_Runs;
- Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time;
-
- printf ("Microseconds for one run through Dhrystone: ");
- printf ("%6d \n", (int)Microseconds);
- printf ("Dhrystones per Second: ");
- printf ("%6d \n", (int)Dhrystones_Per_Second);
- printf ("Dhrystones MIPS: ");
- printf ("%6d \n", (int)(Dhrystones_Per_Second / 1757.0));
- printf ("\n");
-
-}
-
-Proc_1 (Ptr_Val_Par)
-/******************/
-
-REG Rec_Pointer Ptr_Val_Par;
- /* executed once */
-{
- REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;
- /* == Ptr_Glob_Next */
- /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */
- /* corresponds to "rename" in Ada, "with" in Pascal */
-
- structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
- Ptr_Val_Par->variant.var_1.Int_Comp = 5;
- Next_Record->variant.var_1.Int_Comp
- = Ptr_Val_Par->variant.var_1.Int_Comp;
- Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp;
- Proc_3 (&Next_Record->Ptr_Comp);
- /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp
- == Ptr_Glob->Ptr_Comp */
- if (Next_Record->Discr == Ident_1)
- /* then, executed */
- {
- Next_Record->variant.var_1.Int_Comp = 6;
- Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp,
- &Next_Record->variant.var_1.Enum_Comp);
- Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp;
- Proc_7 (Next_Record->variant.var_1.Int_Comp, 10,
- &Next_Record->variant.var_1.Int_Comp);
- }
- else /* not executed */
- structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp);
-} /* Proc_1 */
-
-
-Proc_2 (Int_Par_Ref)
-/******************/
- /* executed once */
- /* *Int_Par_Ref == 1, becomes 4 */
-
-One_Fifty *Int_Par_Ref;
-{
- One_Fifty Int_Loc;
- Enumeration Enum_Loc;
-
- Int_Loc = *Int_Par_Ref + 10;
- do /* executed once */
- if (Ch_1_Glob == 'A')
- /* then, executed */
- {
- Int_Loc -= 1;
- *Int_Par_Ref = Int_Loc - Int_Glob;
- Enum_Loc = Ident_1;
- } /* if */
- while (Enum_Loc != Ident_1); /* true */
-} /* Proc_2 */
-
-
-Proc_3 (Ptr_Ref_Par)
-/******************/
- /* executed once */
- /* Ptr_Ref_Par becomes Ptr_Glob */
-
-Rec_Pointer *Ptr_Ref_Par;
-
-{
- if (Ptr_Glob != Null)
- /* then, executed */
- *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp;
- Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
-} /* Proc_3 */
-
-
-Proc_4 () /* without parameters */
-/*******/
- /* executed once */
-{
- Boolean Bool_Loc;
-
- Bool_Loc = Ch_1_Glob == 'A';
- Bool_Glob = Bool_Loc | Bool_Glob;
- Ch_2_Glob = 'B';
-} /* Proc_4 */
-
-
-Proc_5 () /* without parameters */
-/*******/
- /* executed once */
-{
- Ch_1_Glob = 'A';
- Bool_Glob = false;
-} /* Proc_5 */
-
-
- /* Procedure for the assignment of structures, */
- /* if the C compiler doesn't support this feature */
-#ifdef NOSTRUCTASSIGN
-memcpy (d, s, l)
-register char *d;
-register char *s;
-register int l;
-{
- while (l--) *d++ = *s++;
-}
-#endif
-
-#include <finsh.h>
-FINSH_FUNCTION_EXPORT(dhry_test, dhry test);
+/* + **************************************************************************** + * + * "DHRYSTONE" Benchmark Program + * ----------------------------- + * + * Version: C, Version 2.1 + * + * File: dhry_1.c (part 2 of 3) + * + * Date: May 25, 1988 + * + * Author: Reinhold P. Weicker + * + **************************************************************************** + */ + +#define NUMBER_OF_RUNS 1000000 + +#include "dhry.h" +#define printf rt_kprintf + +/* Global Variables: */ + +Rec_Pointer Ptr_Glob, + Next_Ptr_Glob; +int Int_Glob; +Boolean Bool_Glob; +char Ch_1_Glob, + Ch_2_Glob; +int Arr_1_Glob [50]; +int Arr_2_Glob [50] [50]; + +Enumeration Func_1 (); + +/* forward declaration necessary since Enumeration may not simply be int */ + +#ifndef REG + Boolean Reg = false; +#define REG + /* REG becomes defined as empty */ + /* i.e. no register variables */ +#else + Boolean Reg = true; +#endif + +/* variables for time measurement: */ + +float Begin_Time, + End_Time, + User_Time; +float Microseconds, + Dhrystones_Per_Second; + +/* end of variables for time measurement */ + +void dhry_test(void) +/*****/ + + /* main program, corresponds to procedures */ + /* Main and Proc_0 in the Ada version */ +{ + One_Fifty Int_1_Loc; + REG One_Fifty Int_2_Loc; + One_Fifty Int_3_Loc; + REG char Ch_Index; + Enumeration Enum_Loc; + Str_30 Str_1_Loc; + Str_30 Str_2_Loc; + REG int Run_Index; + REG int Number_Of_Runs; + + /* Initializations */ + + Next_Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type)); + Ptr_Glob = (Rec_Pointer) rt_malloc (sizeof (Rec_Type)); + + Ptr_Glob->Ptr_Comp = Next_Ptr_Glob; + Ptr_Glob->Discr = Ident_1; + Ptr_Glob->variant.var_1.Enum_Comp = Ident_3; + Ptr_Glob->variant.var_1.Int_Comp = 40; + rt_strncpy (Ptr_Glob->variant.var_1.Str_Comp, + "DHRYSTONE PROGRAM, SOME STRING", sizeof(Ptr_Glob->variant.var_1.Str_Comp)); + rt_strncpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING", sizeof(Str_1_Loc)); + + Arr_2_Glob [8][7] = 10; + /* Was missing in published program. Without this statement, */ + /* Arr_2_Glob [8][7] would have an undefined value. */ + /* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */ + /* overflow may occur for this array element. */ + + printf ("\n"); + printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n"); + printf ("\n"); + if (Reg) + { + printf ("Program compiled with 'register' attribute\n"); + printf ("\n"); + } + else + { + printf ("Program compiled without 'register' attribute\n"); + printf ("\n"); + } + printf ("Please give the number of runs through the benchmark: "); + + Number_Of_Runs = NUMBER_OF_RUNS; + printf ("%d\n", Number_Of_Runs); + + printf ("\n"); + + printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs); + + /***************/ + /* Start timer */ + /***************/ + +// Add your timer initializing code here + + Begin_Time = rt_tick_get(); /* get start tick */ + + for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index) + { + + Proc_5(); + Proc_4(); + /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */ + Int_1_Loc = 2; + Int_2_Loc = 3; + rt_strncpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING", sizeof(Str_2_Loc)); + Enum_Loc = Ident_2; + Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc); + /* Bool_Glob == 1 */ + while (Int_1_Loc < Int_2_Loc) /* loop body executed once */ + { + Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc; + /* Int_3_Loc == 7 */ + Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc); + /* Int_3_Loc == 7 */ + Int_1_Loc += 1; + } /* while */ + /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc); + /* Int_Glob == 5 */ + Proc_1 (Ptr_Glob); + for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index) + /* loop body executed twice */ + { + if (Enum_Loc == Func_1 (Ch_Index, 'C')) + /* then, not executed */ + { + Proc_6 (Ident_1, &Enum_Loc); + rt_strncpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING", sizeof(Str_2_Loc)); + Int_2_Loc = Run_Index; + Int_Glob = Run_Index; + } + } + /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */ + Int_2_Loc = Int_2_Loc * Int_1_Loc; + Int_1_Loc = Int_2_Loc / Int_3_Loc; + Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc; + /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */ + Proc_2 (&Int_1_Loc); + /* Int_1_Loc == 5 */ + + } /* loop "for Run_Index" */ + + /**************/ + /* Stop timer */ + /**************/ + + End_Time = rt_tick_get(); // Get end tick + + printf ("Execution ends\n"); + printf ("\n"); + printf ("Final values of the variables used in the benchmark:\n"); + printf ("\n"); + printf ("Int_Glob: %d\n", Int_Glob); + printf (" should be: %d\n", 5); + printf ("Bool_Glob: %d\n", Bool_Glob); + printf (" should be: %d\n", 1); + printf ("Ch_1_Glob: %c\n", Ch_1_Glob); + printf (" should be: %c\n", 'A'); + printf ("Ch_2_Glob: %c\n", Ch_2_Glob); + printf (" should be: %c\n", 'B'); + printf ("Arr_1_Glob[8]: %d\n", Arr_1_Glob[8]); + printf (" should be: %d\n", 7); + printf ("Arr_2_Glob[8][7]: %d\n", Arr_2_Glob[8][7]); + printf (" should be: Number_Of_Runs + 10\n"); + printf ("Ptr_Glob->\n"); + printf (" Ptr_Comp: %d\n", (int) Ptr_Glob->Ptr_Comp); + printf (" should be: (implementation-dependent)\n"); + printf (" Discr: %d\n", Ptr_Glob->Discr); + printf (" should be: %d\n", 0); + printf (" Enum_Comp: %d\n", Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", 2); + printf (" Int_Comp: %d\n", Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", 17); + printf (" Str_Comp: %s\n", Ptr_Glob->variant.var_1.Str_Comp); + printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); + printf ("Next_Ptr_Glob->\n"); + printf (" Ptr_Comp: %d\n", (int) Next_Ptr_Glob->Ptr_Comp); + printf (" should be: (implementation-dependent), same as above\n"); + printf (" Discr: %d\n", Next_Ptr_Glob->Discr); + printf (" should be: %d\n", 0); + printf (" Enum_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp); + printf (" should be: %d\n", 1); + printf (" Int_Comp: %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp); + printf (" should be: %d\n", 18); + printf (" Str_Comp: %s\n", + Next_Ptr_Glob->variant.var_1.Str_Comp); + printf (" should be: DHRYSTONE PROGRAM, SOME STRING\n"); + printf ("Int_1_Loc: %d\n", Int_1_Loc); + printf (" should be: %d\n", 5); + printf ("Int_2_Loc: %d\n", Int_2_Loc); + printf (" should be: %d\n", 13); + printf ("Int_3_Loc: %d\n", Int_3_Loc); + printf (" should be: %d\n", 7); + printf ("Enum_Loc: %d\n", Enum_Loc); + printf (" should be: %d\n", 1); + printf ("Str_1_Loc: %s\n", Str_1_Loc); + printf (" should be: DHRYSTONE PROGRAM, 1'ST STRING\n"); + printf ("Str_2_Loc: %s\n", Str_2_Loc); + printf (" should be: DHRYSTONE PROGRAM, 2'ND STRING\n"); + printf ("\n"); + + User_Time = (End_Time - Begin_Time) / RT_TICK_PER_SECOND; + + Microseconds = (float) User_Time * Mic_secs_Per_Second + / (float) Number_Of_Runs; + Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time; + + printf ("Microseconds for one run through Dhrystone: "); + printf ("%6d \n", (int)Microseconds); + printf ("Dhrystones per Second: "); + printf ("%6d \n", (int)Dhrystones_Per_Second); + printf ("Dhrystones MIPS: "); + printf ("%6d \n", (int)(Dhrystones_Per_Second / 1757.0)); + printf ("\n"); + +} + +Proc_1 (Ptr_Val_Par) +/******************/ + +REG Rec_Pointer Ptr_Val_Par; + /* executed once */ +{ + REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp; + /* == Ptr_Glob_Next */ + /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp, */ + /* corresponds to "rename" in Ada, "with" in Pascal */ + + structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob); + Ptr_Val_Par->variant.var_1.Int_Comp = 5; + Next_Record->variant.var_1.Int_Comp + = Ptr_Val_Par->variant.var_1.Int_Comp; + Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp; + Proc_3 (&Next_Record->Ptr_Comp); + /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp + == Ptr_Glob->Ptr_Comp */ + if (Next_Record->Discr == Ident_1) + /* then, executed */ + { + Next_Record->variant.var_1.Int_Comp = 6; + Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp, + &Next_Record->variant.var_1.Enum_Comp); + Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp; + Proc_7 (Next_Record->variant.var_1.Int_Comp, 10, + &Next_Record->variant.var_1.Int_Comp); + } + else /* not executed */ + structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp); +} /* Proc_1 */ + + +Proc_2 (Int_Par_Ref) +/******************/ + /* executed once */ + /* *Int_Par_Ref == 1, becomes 4 */ + +One_Fifty *Int_Par_Ref; +{ + One_Fifty Int_Loc; + Enumeration Enum_Loc; + + Int_Loc = *Int_Par_Ref + 10; + do /* executed once */ + if (Ch_1_Glob == 'A') + /* then, executed */ + { + Int_Loc -= 1; + *Int_Par_Ref = Int_Loc - Int_Glob; + Enum_Loc = Ident_1; + } /* if */ + while (Enum_Loc != Ident_1); /* true */ +} /* Proc_2 */ + + +Proc_3 (Ptr_Ref_Par) +/******************/ + /* executed once */ + /* Ptr_Ref_Par becomes Ptr_Glob */ + +Rec_Pointer *Ptr_Ref_Par; + +{ + if (Ptr_Glob != Null) + /* then, executed */ + *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp; + Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp); +} /* Proc_3 */ + + +Proc_4 () /* without parameters */ +/*******/ + /* executed once */ +{ + Boolean Bool_Loc; + + Bool_Loc = Ch_1_Glob == 'A'; + Bool_Glob = Bool_Loc | Bool_Glob; + Ch_2_Glob = 'B'; +} /* Proc_4 */ + + +Proc_5 () /* without parameters */ +/*******/ + /* executed once */ +{ + Ch_1_Glob = 'A'; + Bool_Glob = false; +} /* Proc_5 */ + + + /* Procedure for the assignment of structures, */ + /* if the C compiler doesn't support this feature */ +#ifdef NOSTRUCTASSIGN +memcpy (d, s, l) +register char *d; +register char *s; +register int l; +{ + while (l--) *d++ = *s++; +} +#endif + +#include <finsh.h> +FINSH_FUNCTION_EXPORT(dhry_test, dhry test); diff --git a/examples/test/fs_test.c b/examples/test/fs_test.c index bc18a196f1..2404b82e59 100644 --- a/examples/test/fs_test.c +++ b/examples/test/fs_test.c @@ -1,297 +1,297 @@ -/*
- * File : fs_test.c
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2011, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://openlab.rt-thread.com/license/LICENSE.
- *
- * Change Logs:
- * Date Author Notes
- * 2011-01-02 aozima the first version.
- * 2011-03-17 aozima fix some bug.
- * 2011-03-18 aozima to dynamic thread.
- */
-
-#include <rtthread.h>
-#include <dfs_posix.h>
-
-static rt_uint32_t stop_flag = 0;
-static rt_thread_t fsrw1_thread = RT_NULL;
-static rt_thread_t fsrw2_thread = RT_NULL;
-
-#define fsrw1_fn "/test1.dat"
-#define fsrw1_data_len 120 /* Less than 256 */
-static void fsrw1_thread_entry(void* parameter)
-{
- int fd;
- int index,length;
- rt_uint32_t round;
- rt_uint32_t tick_start,tick_end,read_speed,write_speed;
-
- static rt_uint8_t write_data1[fsrw1_data_len];
- static rt_uint8_t read_data1[fsrw1_data_len];
-
- round = 1;
-
- while(1)
- {
- if( stop_flag )
- {
- rt_kprintf("thread fsrw2 error,thread fsrw1 quit!\r\n");
- fsrw1_thread = RT_NULL;
- stop_flag = 0;
- return;
- }
-
- /* creat file */
- fd = open(fsrw1_fn, O_WRONLY | O_CREAT | O_TRUNC, 0);
- if (fd < 0)
- {
- rt_kprintf("fsrw1 open file for write failed\n");
- stop_flag = 1;
- fsrw1_thread = RT_NULL;
- return;
- }
-
- /* plan write data */
- for (index = 0; index < fsrw1_data_len; index ++)
- {
- write_data1[index] = index;
- }
-
- /* write 8000 times */
- tick_start = rt_tick_get();
- for(index=0; index<8000; index++)
- {
- length = write(fd, write_data1, fsrw1_data_len);
- if (length != fsrw1_data_len)
- {
- rt_kprintf("fsrw1 write data failed\n");
- close(fd);
- fsrw1_thread = RT_NULL;
- stop_flag = 1;
- return;
- }
- }
- tick_end = rt_tick_get();
- write_speed = fsrw1_data_len*8000UL*RT_TICK_PER_SECOND/(tick_end-tick_start);
-
- /* close file */
- close(fd);
-
- /* open file read only */
- fd = open(fsrw1_fn, O_RDONLY, 0);
- if (fd < 0)
- {
- rt_kprintf("fsrw1 open file for read failed\n");
- stop_flag = 1;
- fsrw1_thread = RT_NULL;
- return;
- }
-
- /* verify data */
- tick_start = rt_tick_get();
- for(index=0; index<8000; index++)
- {
- rt_uint32_t i;
-
- length = read(fd, read_data1, fsrw1_data_len);
- if (length != fsrw1_data_len)
- {
- rt_kprintf("fsrw1 read file failed\r\n");
- close(fd);
- stop_flag = 1;
- fsrw1_thread = RT_NULL;
- return;
- }
- for(i=0; i<fsrw1_data_len; i++)
- {
- if( read_data1[i] != write_data1[i] )
- {
- rt_kprintf("fsrw1 data error!\r\n");
- close(fd);
- stop_flag = 1;
- fsrw1_thread = RT_NULL;
- return;
- }
- }
- }
- tick_end = rt_tick_get();
- read_speed = fsrw1_data_len*8000UL*RT_TICK_PER_SECOND/(tick_end-tick_start);
-
- rt_kprintf("thread fsrw1 round %d ",round++);
- rt_kprintf("rd:%dbyte/s,wr:%dbyte/s\r\n",read_speed,write_speed);
-
- /* close file */
- close(fd);
- }
-}
-
-#define fsrw2_fn "/test2.dat"
-#define fsrw2_data_len 180 /* Less than 256 */
-static void fsrw2_thread_entry(void* parameter)
-{
- int fd;
- int index,length;
- rt_uint32_t round;
- rt_uint32_t tick_start,tick_end,read_speed,write_speed;
-
- static rt_uint8_t write_data2[fsrw2_data_len];
- static rt_uint8_t read_data2[fsrw2_data_len];
-
- round = 1;
-
- while(1)
- {
- if( stop_flag )
- {
- rt_kprintf("thread fsrw1 error,thread fsrw2 quit!\r\n");
- fsrw2_thread = RT_NULL;
- stop_flag = 0;
- return;
- }
-
- /* creat file */
- fd = open(fsrw2_fn, O_WRONLY | O_CREAT | O_TRUNC, 0);
- if (fd < 0)
- {
- rt_kprintf("fsrw2 open file for write failed\n");
- stop_flag = 1;
- fsrw2_thread = RT_NULL;
- return;
- }
-
- /* plan write data */
- for (index = 0; index < fsrw2_data_len; index ++)
- {
- write_data2[index] = index;
- }
-
- /* write 5000 times */
- tick_start = rt_tick_get();
- for(index=0; index<5000; index++)
- {
- length = write(fd, write_data2, fsrw2_data_len);
- if (length != fsrw2_data_len)
- {
- rt_kprintf("fsrw2 write data failed\n");
- close(fd);
- stop_flag = 1;
- fsrw2_thread = RT_NULL;
- return;
- }
- }
- tick_end = rt_tick_get();
- write_speed = fsrw2_data_len*5000UL*RT_TICK_PER_SECOND/(tick_end-tick_start);
-
- /* close file */
- close(fd);
-
- /* open file read only */
- fd = open(fsrw2_fn, O_RDONLY, 0);
- if (fd < 0)
- {
- rt_kprintf("fsrw2 open file for read failed\n");
- stop_flag = 1;
- fsrw2_thread = RT_NULL;
- return;
- }
-
- /* verify data */
- tick_start = rt_tick_get();
- for(index=0; index<5000; index++)
- {
- rt_uint32_t i;
-
- length = read(fd, read_data2, fsrw2_data_len);
- if (length != fsrw2_data_len)
- {
- rt_kprintf("fsrw2 read file failed\r\n");
- close(fd);
- stop_flag = 1;
- fsrw2_thread = RT_NULL;
- return;
- }
- for(i=0; i<fsrw2_data_len; i++)
- {
- if( read_data2[i] != write_data2[i] )
- {
- rt_kprintf("fsrw2 data error!\r\n");
- close(fd);
- stop_flag = 1;
- fsrw2_thread = RT_NULL;
- return;
- }
- }
- }
- tick_end = rt_tick_get();
- read_speed = fsrw2_data_len*5000UL*RT_TICK_PER_SECOND/(tick_end-tick_start);
-
- rt_kprintf("thread fsrw2 round %d ",round++);
- rt_kprintf("rd:%dbyte/s,wr:%dbyte/s\r\n",read_speed,write_speed);
-
- /* close file */
- close(fd);
- }
-}
-
-
-/** \brief startup filesystem read/write test(multi thread).
- *
- * \param arg rt_uint32_t [0]startup thread1,[1]startup thread2.
- * \return void
- *
- */
-void fs_test(rt_uint32_t arg)
-{
- rt_kprintf("arg is : 0x%02X ",arg);
-
- if(arg & 0x01)
- {
- if( fsrw1_thread != RT_NULL )
- {
- rt_kprintf("fsrw1_thread already exists!\r\n");
- }
- else
- {
- fsrw1_thread = rt_thread_create( "fsrw1",
- fsrw1_thread_entry,
- RT_NULL,
- 2048,
- RT_THREAD_PRIORITY_MAX-2,
- 1);
- if ( fsrw1_thread != RT_NULL)
- {
- rt_thread_startup(fsrw1_thread);
- }
- }
- }
-
- if( arg & 0x02)
- {
- if( fsrw2_thread != RT_NULL )
- {
- rt_kprintf("fsrw2_thread already exists!\r\n");
- }
- else
- {
- fsrw2_thread = rt_thread_create( "fsrw2",
- fsrw2_thread_entry,
- RT_NULL,
- 2048,
- RT_THREAD_PRIORITY_MAX-2,
- 1);
- if ( fsrw2_thread != RT_NULL)
- {
- rt_thread_startup(fsrw2_thread);
- }
- }
- }
-}
-
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-FINSH_FUNCTION_EXPORT(fs_test, file system R/W test. e.g: fs_test(3));
-#endif
+/* + * File : fs_test.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2011, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://openlab.rt-thread.com/license/LICENSE. + * + * Change Logs: + * Date Author Notes + * 2011-01-02 aozima the first version. + * 2011-03-17 aozima fix some bug. + * 2011-03-18 aozima to dynamic thread. + */ + +#include <rtthread.h> +#include <dfs_posix.h> + +static rt_uint32_t stop_flag = 0; +static rt_thread_t fsrw1_thread = RT_NULL; +static rt_thread_t fsrw2_thread = RT_NULL; + +#define fsrw1_fn "/test1.dat" +#define fsrw1_data_len 120 /* Less than 256 */ +static void fsrw1_thread_entry(void* parameter) +{ + int fd; + int index,length; + rt_uint32_t round; + rt_uint32_t tick_start,tick_end,read_speed,write_speed; + + static rt_uint8_t write_data1[fsrw1_data_len]; + static rt_uint8_t read_data1[fsrw1_data_len]; + + round = 1; + + while(1) + { + if( stop_flag ) + { + rt_kprintf("thread fsrw2 error,thread fsrw1 quit!\r\n"); + fsrw1_thread = RT_NULL; + stop_flag = 0; + return; + } + + /* creat file */ + fd = open(fsrw1_fn, O_WRONLY | O_CREAT | O_TRUNC, 0); + if (fd < 0) + { + rt_kprintf("fsrw1 open file for write failed\n"); + stop_flag = 1; + fsrw1_thread = RT_NULL; + return; + } + + /* plan write data */ + for (index = 0; index < fsrw1_data_len; index ++) + { + write_data1[index] = index; + } + + /* write 8000 times */ + tick_start = rt_tick_get(); + for(index=0; index<8000; index++) + { + length = write(fd, write_data1, fsrw1_data_len); + if (length != fsrw1_data_len) + { + rt_kprintf("fsrw1 write data failed\n"); + close(fd); + fsrw1_thread = RT_NULL; + stop_flag = 1; + return; + } + } + tick_end = rt_tick_get(); + write_speed = fsrw1_data_len*8000UL*RT_TICK_PER_SECOND/(tick_end-tick_start); + + /* close file */ + close(fd); + + /* open file read only */ + fd = open(fsrw1_fn, O_RDONLY, 0); + if (fd < 0) + { + rt_kprintf("fsrw1 open file for read failed\n"); + stop_flag = 1; + fsrw1_thread = RT_NULL; + return; + } + + /* verify data */ + tick_start = rt_tick_get(); + for(index=0; index<8000; index++) + { + rt_uint32_t i; + + length = read(fd, read_data1, fsrw1_data_len); + if (length != fsrw1_data_len) + { + rt_kprintf("fsrw1 read file failed\r\n"); + close(fd); + stop_flag = 1; + fsrw1_thread = RT_NULL; + return; + } + for(i=0; i<fsrw1_data_len; i++) + { + if( read_data1[i] != write_data1[i] ) + { + rt_kprintf("fsrw1 data error!\r\n"); + close(fd); + stop_flag = 1; + fsrw1_thread = RT_NULL; + return; + } + } + } + tick_end = rt_tick_get(); + read_speed = fsrw1_data_len*8000UL*RT_TICK_PER_SECOND/(tick_end-tick_start); + + rt_kprintf("thread fsrw1 round %d ",round++); + rt_kprintf("rd:%dbyte/s,wr:%dbyte/s\r\n",read_speed,write_speed); + + /* close file */ + close(fd); + } +} + +#define fsrw2_fn "/test2.dat" +#define fsrw2_data_len 180 /* Less than 256 */ +static void fsrw2_thread_entry(void* parameter) +{ + int fd; + int index,length; + rt_uint32_t round; + rt_uint32_t tick_start,tick_end,read_speed,write_speed; + + static rt_uint8_t write_data2[fsrw2_data_len]; + static rt_uint8_t read_data2[fsrw2_data_len]; + + round = 1; + + while(1) + { + if( stop_flag ) + { + rt_kprintf("thread fsrw1 error,thread fsrw2 quit!\r\n"); + fsrw2_thread = RT_NULL; + stop_flag = 0; + return; + } + + /* creat file */ + fd = open(fsrw2_fn, O_WRONLY | O_CREAT | O_TRUNC, 0); + if (fd < 0) + { + rt_kprintf("fsrw2 open file for write failed\n"); + stop_flag = 1; + fsrw2_thread = RT_NULL; + return; + } + + /* plan write data */ + for (index = 0; index < fsrw2_data_len; index ++) + { + write_data2[index] = index; + } + + /* write 5000 times */ + tick_start = rt_tick_get(); + for(index=0; index<5000; index++) + { + length = write(fd, write_data2, fsrw2_data_len); + if (length != fsrw2_data_len) + { + rt_kprintf("fsrw2 write data failed\n"); + close(fd); + stop_flag = 1; + fsrw2_thread = RT_NULL; + return; + } + } + tick_end = rt_tick_get(); + write_speed = fsrw2_data_len*5000UL*RT_TICK_PER_SECOND/(tick_end-tick_start); + + /* close file */ + close(fd); + + /* open file read only */ + fd = open(fsrw2_fn, O_RDONLY, 0); + if (fd < 0) + { + rt_kprintf("fsrw2 open file for read failed\n"); + stop_flag = 1; + fsrw2_thread = RT_NULL; + return; + } + + /* verify data */ + tick_start = rt_tick_get(); + for(index=0; index<5000; index++) + { + rt_uint32_t i; + + length = read(fd, read_data2, fsrw2_data_len); + if (length != fsrw2_data_len) + { + rt_kprintf("fsrw2 read file failed\r\n"); + close(fd); + stop_flag = 1; + fsrw2_thread = RT_NULL; + return; + } + for(i=0; i<fsrw2_data_len; i++) + { + if( read_data2[i] != write_data2[i] ) + { + rt_kprintf("fsrw2 data error!\r\n"); + close(fd); + stop_flag = 1; + fsrw2_thread = RT_NULL; + return; + } + } + } + tick_end = rt_tick_get(); + read_speed = fsrw2_data_len*5000UL*RT_TICK_PER_SECOND/(tick_end-tick_start); + + rt_kprintf("thread fsrw2 round %d ",round++); + rt_kprintf("rd:%dbyte/s,wr:%dbyte/s\r\n",read_speed,write_speed); + + /* close file */ + close(fd); + } +} + + +/** \brief startup filesystem read/write test(multi thread). + * + * \param arg rt_uint32_t [0]startup thread1,[1]startup thread2. + * \return void + * + */ +void fs_test(rt_uint32_t arg) +{ + rt_kprintf("arg is : 0x%02X ",arg); + + if(arg & 0x01) + { + if( fsrw1_thread != RT_NULL ) + { + rt_kprintf("fsrw1_thread already exists!\r\n"); + } + else + { + fsrw1_thread = rt_thread_create( "fsrw1", + fsrw1_thread_entry, + RT_NULL, + 2048, + RT_THREAD_PRIORITY_MAX-2, + 1); + if ( fsrw1_thread != RT_NULL) + { + rt_thread_startup(fsrw1_thread); + } + } + } + + if( arg & 0x02) + { + if( fsrw2_thread != RT_NULL ) + { + rt_kprintf("fsrw2_thread already exists!\r\n"); + } + else + { + fsrw2_thread = rt_thread_create( "fsrw2", + fsrw2_thread_entry, + RT_NULL, + 2048, + RT_THREAD_PRIORITY_MAX-2, + 1); + if ( fsrw2_thread != RT_NULL) + { + rt_thread_startup(fsrw2_thread); + } + } + } +} + +#ifdef RT_USING_FINSH +#include <finsh.h> +FINSH_FUNCTION_EXPORT(fs_test, file system R/W test. e.g: fs_test(3)); +#endif diff --git a/examples/test/mem_test.c b/examples/test/mem_test.c index 595578e126..2e94bca2d0 100644 --- a/examples/test/mem_test.c +++ b/examples/test/mem_test.c @@ -1,105 +1,105 @@ -#include <stdint.h>
-
-#include <rthw.h>
-#include <rtthread.h>
-
-#define printf rt_kprintf
-
-void mem_test(uint32_t address, uint32_t size )
-{
- uint32_t i;
-
- printf("memtest,address: 0x%08X size: 0x%08X\r\n", address, size);
-
- /**< 8bit test */
- {
- uint8_t * p_uint8_t = (uint8_t *)address;
- for(i=0; i<size/sizeof(uint8_t); i++)
- {
- *p_uint8_t++ = (uint8_t)i;
- }
-
- p_uint8_t = (uint8_t *)address;
- for(i=0; i<size/sizeof(uint8_t); i++)
- {
- if( *p_uint8_t != (uint8_t)i )
- {
- printf("8bit test fail @ 0x%08X\r\nsystem halt!!!!!",(uint32_t)p_uint8_t);
- while(1);
- }
- p_uint8_t++;
- }
- printf("8bit test pass!!\r\n");
- }
-
- /**< 16bit test */
- {
- uint16_t * p_uint16_t = (uint16_t *)address;
- for(i=0; i<size/sizeof(uint16_t); i++)
- {
- *p_uint16_t++ = (uint16_t)i;
- }
-
- p_uint16_t = (uint16_t *)address;
- for(i=0; i<size/sizeof(uint16_t); i++)
- {
- if( *p_uint16_t != (uint16_t)i )
- {
- printf("16bit test fail @ 0x%08X\r\nsystem halt!!!!!",(uint32_t)p_uint16_t);
- while(1);
- }
- p_uint16_t++;
- }
- printf("16bit test pass!!\r\n");
- }
-
- /**< 32bit test */
- {
- uint32_t * p_uint32_t = (uint32_t *)address;
- for(i=0; i<size/sizeof(uint32_t); i++)
- {
- *p_uint32_t++ = (uint32_t)i;
- }
-
- p_uint32_t = (uint32_t *)address;
- for(i=0; i<size/sizeof(uint32_t); i++)
- {
- if( *p_uint32_t != (uint32_t)i )
- {
- printf("32bit test fail @ 0x%08X\r\nsystem halt!!!!!",(uint32_t)p_uint32_t);
- while(1);
- }
- p_uint32_t++;
- }
- printf("32bit test pass!!\r\n");
- }
-
- /**< 32bit Loopback test */
- {
- uint32_t * p_uint32_t = (uint32_t *)address;
- for(i=0; i<size/sizeof(uint32_t); i++)
- {
- *p_uint32_t = (uint32_t)p_uint32_t;
- *p_uint32_t++;
- }
-
- p_uint32_t = (uint32_t *)address;
- for(i=0; i<size/sizeof(uint32_t); i++)
- {
- if( *p_uint32_t != (uint32_t)p_uint32_t )
- {
- printf("32bit Loopback test fail @ 0x%08X", (uint32_t)p_uint32_t);
- printf(" data:0x%08X \r\n", (uint32_t)*p_uint32_t);
- printf("system halt!!!!!",(uint32_t)p_uint32_t);
- while(1);
- }
- p_uint32_t++;
- }
- printf("32bit Loopback test pass!!\r\n");
- }
-}
-
-#ifdef RT_USING_FINSH
-#include <finsh.h>
-FINSH_FUNCTION_EXPORT(mem_test, mem_test(0xA0000000, 0x00100000) );
-#endif
+#include <stdint.h> + +#include <rthw.h> +#include <rtthread.h> + +#define printf rt_kprintf + +void mem_test(uint32_t address, uint32_t size ) +{ + uint32_t i; + + printf("memtest,address: 0x%08X size: 0x%08X\r\n", address, size); + + /**< 8bit test */ + { + uint8_t * p_uint8_t = (uint8_t *)address; + for(i=0; i<size/sizeof(uint8_t); i++) + { + *p_uint8_t++ = (uint8_t)i; + } + + p_uint8_t = (uint8_t *)address; + for(i=0; i<size/sizeof(uint8_t); i++) + { + if( *p_uint8_t != (uint8_t)i ) + { + printf("8bit test fail @ 0x%08X\r\nsystem halt!!!!!",(uint32_t)p_uint8_t); + while(1); + } + p_uint8_t++; + } + printf("8bit test pass!!\r\n"); + } + + /**< 16bit test */ + { + uint16_t * p_uint16_t = (uint16_t *)address; + for(i=0; i<size/sizeof(uint16_t); i++) + { + *p_uint16_t++ = (uint16_t)i; + } + + p_uint16_t = (uint16_t *)address; + for(i=0; i<size/sizeof(uint16_t); i++) + { + if( *p_uint16_t != (uint16_t)i ) + { + printf("16bit test fail @ 0x%08X\r\nsystem halt!!!!!",(uint32_t)p_uint16_t); + while(1); + } + p_uint16_t++; + } + printf("16bit test pass!!\r\n"); + } + + /**< 32bit test */ + { + uint32_t * p_uint32_t = (uint32_t *)address; + for(i=0; i<size/sizeof(uint32_t); i++) + { + *p_uint32_t++ = (uint32_t)i; + } + + p_uint32_t = (uint32_t *)address; + for(i=0; i<size/sizeof(uint32_t); i++) + { + if( *p_uint32_t != (uint32_t)i ) + { + printf("32bit test fail @ 0x%08X\r\nsystem halt!!!!!",(uint32_t)p_uint32_t); + while(1); + } + p_uint32_t++; + } + printf("32bit test pass!!\r\n"); + } + + /**< 32bit Loopback test */ + { + uint32_t * p_uint32_t = (uint32_t *)address; + for(i=0; i<size/sizeof(uint32_t); i++) + { + *p_uint32_t = (uint32_t)p_uint32_t; + *p_uint32_t++; + } + + p_uint32_t = (uint32_t *)address; + for(i=0; i<size/sizeof(uint32_t); i++) + { + if( *p_uint32_t != (uint32_t)p_uint32_t ) + { + printf("32bit Loopback test fail @ 0x%08X", (uint32_t)p_uint32_t); + printf(" data:0x%08X \r\n", (uint32_t)*p_uint32_t); + printf("system halt!!!!!",(uint32_t)p_uint32_t); + while(1); + } + p_uint32_t++; + } + printf("32bit Loopback test pass!!\r\n"); + } +} + +#ifdef RT_USING_FINSH +#include <finsh.h> +FINSH_FUNCTION_EXPORT(mem_test, mem_test(0xA0000000, 0x00100000) ); +#endif diff --git a/examples/test/net_test.c b/examples/test/net_test.c index 849b03bbcc..e4961622c7 100644 --- a/examples/test/net_test.c +++ b/examples/test/net_test.c @@ -1,282 +1,282 @@ -/*
- * Net Test Utilities for RT-Thread
- */
-#include <rtthread.h>
-#include <finsh.h>
-#include <lwip/api.h>
-#include <lwip/sockets.h>
-/*
- * UDP echo server
- */
-#define UDP_ECHO_PORT 7
-rt_thread_t udpecho_tid = RT_NULL;
-void udpecho_entry(void *parameter)
-{
- struct netconn *conn;
- struct netbuf *buf;
- struct ip_addr *addr;
- unsigned short port;
-
- conn = netconn_new(NETCONN_UDP);
- netconn_bind(conn, IP_ADDR_ANY, 7);
-
- while(1)
- {
- /* received data to buffer */
- buf = netconn_recv(conn);
-
- addr = netbuf_fromaddr(buf);
- port = netbuf_fromport(buf);
-
- /* send the data to buffer */
- netconn_connect(conn, addr, port);
-
- /* reset address, and send to client */
- buf->addr = RT_NULL;
- netconn_send(conn, buf);
-
- /* release buffer */
- netbuf_delete(buf);
- }
-}
-/*
- * UDP socket echo server
- */
-#define UDP_SOCKET_ECHO_PORT 700
-#define UDP_SOCKET_BUFFER_SIZE 4096
-rt_thread_t udpecho_socket_tid = RT_NULL;
-void udpecho_socket_entry(void *parameter)
-{
- int sock;
- int bytes_read;
- char *recv_data;
- rt_uint32_t addr_len;
- struct sockaddr_in server_addr, client_addr;
-
- /* allocate the data buffer */
- recv_data = rt_malloc(UDP_SOCKET_BUFFER_SIZE);
- if (recv_data == RT_NULL)
- {
- /* no memory yet */
- rt_kprintf("no memory\n");
- goto _exit;
- }
- /* create a UDP socket */
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- {
- rt_kprintf("create socket error\n");
- goto _exit;
- }
-
- /* initialize server address */
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(UDP_SOCKET_ECHO_PORT);
- server_addr.sin_addr.s_addr = INADDR_ANY;
- rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero));
-
- /* bind socket to server address */
- if (bind(sock,(struct sockaddr *)&server_addr,
- sizeof(struct sockaddr)) == -1)
- {
- /* bind failed */
- rt_kprintf("bind error\n");
- goto _exit;
- }
-
- addr_len = sizeof(struct sockaddr);
- while (1)
- {
- /* try to receive from UDP socket */
- bytes_read = recvfrom(sock, recv_data, UDP_SOCKET_BUFFER_SIZE, 0,
- (struct sockaddr *)&client_addr, &addr_len);
-
- /* send back */
- sendto(sock, recv_data, bytes_read, 0,
- (struct sockaddr *)&client_addr, addr_len);
- }
-
-_exit:
- rt_free(recv_data);
- return;
-}
-
-/*
- * TCP echo server
- */
-#define TCP_ECHO_PORT 7
-rt_thread_t tcpecho_tid = RT_NULL;
-void tcpecho_entry(void *parameter)
-{
- struct netconn *conn, *newconn;
- err_t err;
-
- /* Create a new connection identifier. */
- conn = netconn_new(NETCONN_TCP);
-
- /* Bind connection to well known port number 7. */
- netconn_bind(conn, NULL, TCP_ECHO_PORT);
-
- /* Tell connection to go into listening mode. */
- netconn_listen(conn);
-
- while(1)
- {
- /* Grab new connection. */
- newconn = netconn_accept(conn);
- /* Process the new connection. */
- if(newconn != NULL)
- {
- struct netbuf *buf;
- void *data;
- u16_t len;
-
- while((buf = netconn_recv(newconn)) != NULL)
- {
- do
- {
- netbuf_data(buf, &data, &len);
- err = netconn_write(newconn, data, len, NETCONN_COPY);
- if(err != ERR_OK){}
- }
- while(netbuf_next(buf) >= 0);
- netbuf_delete(buf);
- }
- /* Close connection and discard connection identifier. */
- netconn_delete(newconn);
- }
- }
-}
-
-/*
- * TCP socket echo server
- */
-#define TCP_SOCKET_ECHO_PORT 700
-#define TCP_SOCKET_BUFFER_SIZE 4096
-rt_thread_t tcpecho_socket_tid = RT_NULL;
-void tcpecho_socket_entry(void *parameter)
-{
- char *recv_data;
- rt_uint32_t sin_size;
- int sock = -1, connected, bytes_received;
- struct sockaddr_in server_addr, client_addr;
-
- recv_data = rt_malloc(TCP_SOCKET_BUFFER_SIZE);
- if (recv_data == RT_NULL)
- {
- rt_kprintf("no memory\n");
- goto _exit;
- }
-
- /* create a TCP socket */
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- rt_kprintf("create socket error\n");
- goto _exit;
- }
-
- /* initialize server address */
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(TCP_SOCKET_ECHO_PORT);
- server_addr.sin_addr.s_addr = INADDR_ANY;
- rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));
-
- /* bind to server address */
- if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
- {
- rt_kprintf("bind address failed\n");
- goto _exit;
- }
-
- /* listen */
- if (listen(sock, 5) == -1)
- {
- rt_kprintf("listen error\n");
- goto _exit;
- }
-
- sin_size = sizeof(struct sockaddr_in);
- while(1)
- {
- /* accept client connected */
- connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
- if (connected > 0)
- {
- int timeout;
-
- /* set timeout option */
- timeout = 5000; /* 5second */
- setsockopt(connected, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
-
- /* handle this client */
- while (1)
- {
- /* receive data from this connection */
- bytes_received = recv(connected,recv_data, TCP_SOCKET_BUFFER_SIZE, 0);
- if (bytes_received <= 0)
- {
- rt_kprintf("close client connection, errno: %d, socket error: %d\n",
- rt_get_errno(),
- lwip_get_error());
- /* connection closed. */
- lwip_close(connected);
- break;
- }
-
- /* send data to client */
- send(connected, recv_data, bytes_received, 0);
- }
- }
- }
-
-_exit:
- /* close socket */
- if (sock != -1) lwip_close(sock);
- rt_free(recv_data);
-
- return ;
-}
-
-/*
- * NetIO TCP server
- */
-
-/* network test utilities entry */
-void net_test(void)
-{
- /* start UDP echo server */
- if (udpecho_tid == RT_NULL)
- {
- udpecho_tid = rt_thread_create("uecho",
- udpecho_entry, RT_NULL,
- 512, RT_THREAD_PRIORITY_MAX/2, 5);
- if (udpecho_tid != RT_NULL)
- rt_thread_startup(udpecho_tid);
- }
- if (udpecho_socket_tid == RT_NULL)
- {
- udpecho_socket_tid = rt_thread_create("uecho_s",
- udpecho_socket_entry, RT_NULL,
- 512, RT_THREAD_PRIORITY_MAX/2 + 1, 5);
- if (udpecho_socket_tid != RT_NULL)
- rt_thread_startup(udpecho_socket_tid);
- }
-
- if (tcpecho_tid == RT_NULL)
- {
- tcpecho_tid = rt_thread_create("techo",
- tcpecho_entry, RT_NULL,
- 512, RT_THREAD_PRIORITY_MAX/2 + 2, 5);
- if (tcpecho_tid != RT_NULL)
- rt_thread_startup(tcpecho_tid);
- }
- if (tcpecho_socket_tid == RT_NULL)
- {
- tcpecho_socket_tid = rt_thread_create("techo_s",
- tcpecho_socket_entry, RT_NULL,
- 512, RT_THREAD_PRIORITY_MAX/2 + 3, 5);
- if (tcpecho_socket_tid != RT_NULL)
- rt_thread_startup(tcpecho_socket_tid);
- }
-}
-FINSH_FUNCTION_EXPORT(net_test, network test);
-
+/* + * Net Test Utilities for RT-Thread + */ +#include <rtthread.h> +#include <finsh.h> +#include <lwip/api.h> +#include <lwip/sockets.h> +/* + * UDP echo server + */ +#define UDP_ECHO_PORT 7 +rt_thread_t udpecho_tid = RT_NULL; +void udpecho_entry(void *parameter) +{ + struct netconn *conn; + struct netbuf *buf; + struct ip_addr *addr; + unsigned short port; + + conn = netconn_new(NETCONN_UDP); + netconn_bind(conn, IP_ADDR_ANY, 7); + + while(1) + { + /* received data to buffer */ + buf = netconn_recv(conn); + + addr = netbuf_fromaddr(buf); + port = netbuf_fromport(buf); + + /* send the data to buffer */ + netconn_connect(conn, addr, port); + + /* reset address, and send to client */ + buf->addr = RT_NULL; + netconn_send(conn, buf); + + /* release buffer */ + netbuf_delete(buf); + } +} +/* + * UDP socket echo server + */ +#define UDP_SOCKET_ECHO_PORT 700 +#define UDP_SOCKET_BUFFER_SIZE 4096 +rt_thread_t udpecho_socket_tid = RT_NULL; +void udpecho_socket_entry(void *parameter) +{ + int sock; + int bytes_read; + char *recv_data; + rt_uint32_t addr_len; + struct sockaddr_in server_addr, client_addr; + + /* allocate the data buffer */ + recv_data = rt_malloc(UDP_SOCKET_BUFFER_SIZE); + if (recv_data == RT_NULL) + { + /* no memory yet */ + rt_kprintf("no memory\n"); + goto _exit; + } + /* create a UDP socket */ + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) + { + rt_kprintf("create socket error\n"); + goto _exit; + } + + /* initialize server address */ + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(UDP_SOCKET_ECHO_PORT); + server_addr.sin_addr.s_addr = INADDR_ANY; + rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero)); + + /* bind socket to server address */ + if (bind(sock,(struct sockaddr *)&server_addr, + sizeof(struct sockaddr)) == -1) + { + /* bind failed */ + rt_kprintf("bind error\n"); + goto _exit; + } + + addr_len = sizeof(struct sockaddr); + while (1) + { + /* try to receive from UDP socket */ + bytes_read = recvfrom(sock, recv_data, UDP_SOCKET_BUFFER_SIZE, 0, + (struct sockaddr *)&client_addr, &addr_len); + + /* send back */ + sendto(sock, recv_data, bytes_read, 0, + (struct sockaddr *)&client_addr, addr_len); + } + +_exit: + rt_free(recv_data); + return; +} + +/* + * TCP echo server + */ +#define TCP_ECHO_PORT 7 +rt_thread_t tcpecho_tid = RT_NULL; +void tcpecho_entry(void *parameter) +{ + struct netconn *conn, *newconn; + err_t err; + + /* Create a new connection identifier. */ + conn = netconn_new(NETCONN_TCP); + + /* Bind connection to well known port number 7. */ + netconn_bind(conn, NULL, TCP_ECHO_PORT); + + /* Tell connection to go into listening mode. */ + netconn_listen(conn); + + while(1) + { + /* Grab new connection. */ + newconn = netconn_accept(conn); + /* Process the new connection. */ + if(newconn != NULL) + { + struct netbuf *buf; + void *data; + u16_t len; + + while((buf = netconn_recv(newconn)) != NULL) + { + do + { + netbuf_data(buf, &data, &len); + err = netconn_write(newconn, data, len, NETCONN_COPY); + if(err != ERR_OK){} + } + while(netbuf_next(buf) >= 0); + netbuf_delete(buf); + } + /* Close connection and discard connection identifier. */ + netconn_delete(newconn); + } + } +} + +/* + * TCP socket echo server + */ +#define TCP_SOCKET_ECHO_PORT 700 +#define TCP_SOCKET_BUFFER_SIZE 4096 +rt_thread_t tcpecho_socket_tid = RT_NULL; +void tcpecho_socket_entry(void *parameter) +{ + char *recv_data; + rt_uint32_t sin_size; + int sock = -1, connected, bytes_received; + struct sockaddr_in server_addr, client_addr; + + recv_data = rt_malloc(TCP_SOCKET_BUFFER_SIZE); + if (recv_data == RT_NULL) + { + rt_kprintf("no memory\n"); + goto _exit; + } + + /* create a TCP socket */ + if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) + { + rt_kprintf("create socket error\n"); + goto _exit; + } + + /* initialize server address */ + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(TCP_SOCKET_ECHO_PORT); + server_addr.sin_addr.s_addr = INADDR_ANY; + rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero)); + + /* bind to server address */ + if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) + { + rt_kprintf("bind address failed\n"); + goto _exit; + } + + /* listen */ + if (listen(sock, 5) == -1) + { + rt_kprintf("listen error\n"); + goto _exit; + } + + sin_size = sizeof(struct sockaddr_in); + while(1) + { + /* accept client connected */ + connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); + if (connected > 0) + { + int timeout; + + /* set timeout option */ + timeout = 5000; /* 5second */ + setsockopt(connected, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + + /* handle this client */ + while (1) + { + /* receive data from this connection */ + bytes_received = recv(connected,recv_data, TCP_SOCKET_BUFFER_SIZE, 0); + if (bytes_received <= 0) + { + rt_kprintf("close client connection, errno: %d, socket error: %d\n", + rt_get_errno(), + lwip_get_error()); + /* connection closed. */ + lwip_close(connected); + break; + } + + /* send data to client */ + send(connected, recv_data, bytes_received, 0); + } + } + } + +_exit: + /* close socket */ + if (sock != -1) lwip_close(sock); + rt_free(recv_data); + + return ; +} + +/* + * NetIO TCP server + */ + +/* network test utilities entry */ +void net_test(void) +{ + /* start UDP echo server */ + if (udpecho_tid == RT_NULL) + { + udpecho_tid = rt_thread_create("uecho", + udpecho_entry, RT_NULL, + 512, RT_THREAD_PRIORITY_MAX/2, 5); + if (udpecho_tid != RT_NULL) + rt_thread_startup(udpecho_tid); + } + if (udpecho_socket_tid == RT_NULL) + { + udpecho_socket_tid = rt_thread_create("uecho_s", + udpecho_socket_entry, RT_NULL, + 512, RT_THREAD_PRIORITY_MAX/2 + 1, 5); + if (udpecho_socket_tid != RT_NULL) + rt_thread_startup(udpecho_socket_tid); + } + + if (tcpecho_tid == RT_NULL) + { + tcpecho_tid = rt_thread_create("techo", + tcpecho_entry, RT_NULL, + 512, RT_THREAD_PRIORITY_MAX/2 + 2, 5); + if (tcpecho_tid != RT_NULL) + rt_thread_startup(tcpecho_tid); + } + if (tcpecho_socket_tid == RT_NULL) + { + tcpecho_socket_tid = rt_thread_create("techo_s", + tcpecho_socket_entry, RT_NULL, + 512, RT_THREAD_PRIORITY_MAX/2 + 3, 5); + if (tcpecho_socket_tid != RT_NULL) + rt_thread_startup(tcpecho_socket_tid); + } +} +FINSH_FUNCTION_EXPORT(net_test, network test); + |
