diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/sim.src/test_mem_speed.cc | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/sim.src/test_mem_speed.cc')
| -rw-r--r-- | sim/ucsim/sim.src/test_mem_speed.cc | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/sim/ucsim/sim.src/test_mem_speed.cc b/sim/ucsim/sim.src/test_mem_speed.cc new file mode 100644 index 0000000..35f7673 --- /dev/null +++ b/sim/ucsim/sim.src/test_mem_speed.cc @@ -0,0 +1,99 @@ +#include <signal.h> +#include <unistd.h> +#include <stdio.h> + +#include "memcl.h" +#include "hwcl.h" + +#include "newcmdcl.h" + +static int go; + +static void +alarmed(int sig) +{ + go= 0; + signal(sig, alarmed); +} + +class cl_hw_test: public cl_hw +{ +public: + cl_hw_test(void): cl_hw(0, HW_PORT, 0, "0") {} + virtual t_mem r(class cl_cell *cell, t_addr addr); + virtual void write(class cl_mem *mem, t_addr addr, t_mem *val); +}; + +t_mem +cl_hw_test::r(class cl_cell *cell, t_addr addr) +{ + return(cell->get()); +} + +void +cl_hw_test::write(class cl_mem *mem, t_addr addr, t_mem *val) +{ +} + +double +do_rw_test(class cl_mem *mem, int time) +{ + double counter; + t_addr a; + t_mem d; + + go= 1; + counter= 0; + alarm(time); + while (go) + for (a= 0; go && a < mem->size; a++) + { + t_mem d2; + for (d2= 0; go && d2 <= 255; d2++) + { + d2= mem->write(a, d2); + d= mem->read(a); + if (d != d2) + printf("%d written to mem and %d read back!\n", (int)d2, (int)d); + counter+= 1; + } + } + return(counter); +} + +int +main(void) +{ + int i; + class cl_mem *mem; + class cl_m *m2; + class cl_console *con; + + signal(SIGALRM, alarmed); + con= new cl_console(stdin, stdout, 0); + + mem= new cl_mem(MEM_SFR, "egy", 0x10000, 8, 0); + mem->init(); + printf("%g operations on classic memory within 5 sec\n", + do_rw_test(mem, 5)); + //mem->dump(con); + + m2= new cl_m(MEM_TYPES, "test", 0x10000, 8, 0); + m2->init(); + printf("%g operations on new memory within 5 sec\n", + do_rw_test(m2, 5)); + + class cl_hw_test *hw= new cl_hw_test(); + for (i= 0; i < 0x10000; i++) + { + class cl_cell *c= m2->get_cell(i); + int dummy; + if (c) + c->add_hw(hw, &dummy); + } + printf("%g operations on new memory within 5 sec with hw read\n", + do_rw_test(m2, 5)); + //m2->dump(con); + + return(0); +} |
