re-implement wait_for_interrupt and get rid of multiplication in
check_results for better performance
This commit is contained in:
		
										
											Binary file not shown.
										
									
								
							| @@ -12,7 +12,7 @@ typedef void (*function_ptr_t) (void); | ||||
| //! Instance data for the PLIC. | ||||
| plic_instance_t g_plic; | ||||
| std::array<function_ptr_t,PLIC_NUM_INTERRUPTS>  g_ext_interrupt_handlers; | ||||
| bool hw_interrupt{false}; | ||||
| bool hw_interrupt{true}; | ||||
|  | ||||
|  | ||||
| /*! \brief external interrupt handler | ||||
| @@ -44,14 +44,18 @@ void configure_irq(size_t irq_num, function_ptr_t handler, unsigned char prio=1) | ||||
| } | ||||
|  | ||||
| static void msi_interrupt_handler(){ | ||||
| 	hw_interrupt = true; | ||||
| 	hw_interrupt = false; | ||||
| } | ||||
|  | ||||
| void wait_for_interrupt() { | ||||
| 	while (!hw_interrupt) { | ||||
| 		delayUS(1); | ||||
| 	}; | ||||
| 	hw_interrupt = false; | ||||
|     // wait until HW is done | ||||
|     if(hw_interrupt) { | ||||
|         do{ | ||||
|             asm("wfi"); | ||||
|             asm("nop"); | ||||
|         }while(hw_interrupt); | ||||
|     } | ||||
| 	hw_interrupt=true; | ||||
| } | ||||
|  | ||||
| /*!\brief initializes platform | ||||
|   | ||||
| @@ -2,14 +2,11 @@ | ||||
| #include "spn_regs.h" | ||||
| #include "init.h" | ||||
|  | ||||
| #include <cmath> // log | ||||
|  | ||||
| using spn =spn_regs<0x90000000>; | ||||
|  | ||||
| // huge arrays of XSPN input and referance data | ||||
| extern std::array<uint8_t, 50000> input_data; | ||||
| extern std::array<double, 10000> ref_data; | ||||
| constexpr auto ln2 = std::log(2); | ||||
|  | ||||
| bool double_equals(double a, double b, double epsilon = 0.001) | ||||
| { | ||||
| @@ -21,12 +18,12 @@ void run_xspn(int in_addr, int out_addr) { | ||||
| 	spn::input_length_reg() = 500; 		// each sample consists of 5 uint8 values | ||||
| 	spn::input_addr_reg() = in_addr; | ||||
| 	spn::output_addr_reg() = out_addr; | ||||
| 	spn::num_of_in_beats_reg() = 40;		// Number of AXI4 burst beats needed to load all input data | ||||
| 	spn::num_of_in_beats_reg() = 40;	// Number of AXI4 burst beats needed to load all input data | ||||
| 	spn::num_of_out_beats_reg() = 64;	// Number of AXI4 burst beats needed to store all result data | ||||
| 	spn::start_reg() = 1; | ||||
| } | ||||
|  | ||||
| bool check_results(int addr, int k) { | ||||
| void check_results(int addr, int k) { | ||||
| 	bool result = 0; | ||||
| 	int  step = 500; | ||||
| 	double *res_base = (double*) (addr); | ||||
| @@ -34,14 +31,13 @@ bool check_results(int addr, int k) { | ||||
|     printf("Start result comparison %d - %d\n", k, k+step); | ||||
|  | ||||
| 	for (int i = 0; i < step; i++) { | ||||
| 		if (!double_equals(res_base[i] * ln2, ref_data.at(k + i))) { | ||||
| 		if (!double_equals(res_base[i], ref_data.at(k + i))) { | ||||
| 			printf("XSPN ref %d comparison FAILED\n", k + i); | ||||
| 			*error_exit = 0x1; | ||||
| 			result = 1; | ||||
| 		} | ||||
| 	} | ||||
|     printf("Compared samples %d - %d with the reference\n", k, k+step); | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| /*! \brief main function | ||||
| @@ -49,29 +45,29 @@ bool check_results(int addr, int k) { | ||||
|  */ | ||||
| int main() { | ||||
|     platform_init(); | ||||
|     int ret_val = 0; | ||||
|  | ||||
|     spn::mode_reg() = 1; | ||||
|     spn::start_reg() = 1; | ||||
| 	wait_for_interrupt(); | ||||
|     wait_for_interrupt(); | ||||
|     spn::interrupt_reg() = 1; | ||||
|     printf("READOUT HW:0x%x\n", spn::readout_reg()); | ||||
|  | ||||
| 	int in_addr  = (int)input_data.data(); | ||||
| 	int out_addr = 0x800B0000; | ||||
|  | ||||
|     run_xspn(in_addr, out_addr); | ||||
|  | ||||
|     int step = 500; // number of samples to be process at once | ||||
|     for (int k = 0; k < 10000; k+=step) { | ||||
|  | ||||
|         run_xspn(in_addr, out_addr); | ||||
|         printf("XSPN processes samples %d - %d\n", k, k+step); | ||||
|  | ||||
|         wait_for_interrupt(); | ||||
|     	spn::interrupt_reg() = 1; | ||||
| 		check_results(out_addr, k); | ||||
|  | ||||
| 		ret_val = check_results(out_addr, k); | ||||
| 		in_addr += step * 5; // 5 bytes in each sample | ||||
|         run_xspn(in_addr, out_addr); | ||||
| 	} | ||||
|  | ||||
| 	return ret_val; | ||||
| 	return 0; | ||||
| } | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user