#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "delaytest.h" #include "delay.pio.h" enum test { test_gpio_busyloop, test_gpio_irq_handle, test_gpio_irq_wfi, test_pio_if_busyloop, test_pio_if_irq_handle, test_pio_if_irq_wfi, test_pio_fifo, test_pio_irq, test_core0_mem, test_core0_fifo_busyloop, test_core0_fifo_irq_handle, test_core0_fifo_irq_wfi, test_core0_wfe, test__num }; #define PIN_HIGH 8 #define PIN_TRIG_IN 9 #define PIN_TRIG_OUT 10 #define PIN_CORE0_TRG 15 typedef void (*test_fn)(void); static volatile uint32_t shvar = 0; __attribute__((__section__(".scratch_y.core1_init"))) static void core1_init(void); __attribute__((__section__(".scratch_y.core1_irq"))) static void core1_irq(void) { sio_hw->gpio_set = 1<gpio_clr = 1<intr[gpio>>3] = event << 4*(gpio&7); delayt1_ack_irqflag(pio0); multicore_fifo_drain(); multicore_fifo_clear_irq(); irq_set_enabled(irq, true); } __attribute__((__section__(".scratch_y.t_gpio_busyloop"))) static void t_gpio_busyloop(void) { core1_init(); while (true) { // ldr; tst; beq.n loop while (!(sio_hw->gpio_in & (1<gpio_set = 1<gpio_clr = 1<intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq irq_set_priority(irq, PICO_HIGHEST_IRQ_PRIORITY); hw_set_bits(&iobank0_hw->proc1_irq_ctrl.inte[gpio>>3], event << 4*(gpio&7)); irq_set_exclusive_handler(irq, core1_irq); irq_set_enabled(irq, true); while (true) ; } __attribute__((__section__(".scratch_y.t_gpio_irq_wfi"))) static void t_gpio_irq_wfi(void) { core1_init(); const int gpio = PIN_TRIG_IN; const int irq = IO_IRQ_BANK0; const int event = GPIO_IRQ_EDGE_RISE; irq_set_enabled(irq, false); iobank0_hw->intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq irq_set_priority(irq, PICO_HIGHEST_IRQ_PRIORITY); hw_set_bits(&iobank0_hw->proc1_irq_ctrl.inte[gpio>>3], event << 4*(gpio&7)); // only enable in ^, hope wfi works w/o doing a PendSV //irq_set_exclusive_handler(irq, core1_irq); __disable_irq(); irq_set_enabled(irq, true); while (true) { __WFI(); sio_hw->gpio_set = 1<intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq busy_wait_us_32(100); irq_set_enabled(irq, true); sio_hw->gpio_clr = 1<gpio_set = 1<gpio_clr = 1<gpio_set = 1<gpio_clr = 1<intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq irq_set_priority(irq, PICO_HIGHEST_IRQ_PRIORITY); hw_set_bits(&iobank0_hw->proc1_irq_ctrl.inte[gpio>>3], event << 4*(gpio&7)); __disable_irq(); irq_set_enabled(irq, true); while (true) { __WFI(); delayt2_put(pio0, 0, 1); //sio_hw->gpio_set = 1<intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq busy_wait_us_32(100); irq_set_enabled(irq, true); //sio_hw->gpio_clr = 1<intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq irq_set_priority(irq, PICO_HIGHEST_IRQ_PRIORITY); hw_set_bits(&iobank0_hw->proc1_irq_ctrl.inte[gpio>>3], event << 4*(gpio&7)); __disable_irq(); irq_set_enabled(irq, true); while (true) { __WFI(); delayt3_put(pio0); //sio_hw->gpio_set = 1<intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq busy_wait_us_32(100); irq_set_enabled(irq, true); //sio_hw->gpio_clr = 1<gpio_set = 1<gpio_clr = 1<gpio_set = 1<gpio_clr = 1<gpio_set = 1<gpio_clr = 1<gpio_set = 1<gpio_clr = 1< x_core0 = x_obsv - x_gpio_irq_wfi // => σ_core0 = sqrt(σ²_obsv - σ²_gpio_irq_wfi) // 740 660 680 640 580 640 740 660 700 640 // 660 580 720 680 740 620 620 660 640 660 [test_core0_mem] = t_core0_mem, // 520 540 540 540 560 560 540 520 560 540 // 540 560 520 540 540 520 560 540 560 540 [test_core0_wfe] = t_core0_wfe, // 740 640 700 620 600 720 660 660 600 720 // 560 660 600 680 660 580 740 560 700 700 [test_core0_fifo_busyloop] = t_core0_fifo_busyloop, // 1460 1480 1500 1480 1520 1500 1540 1520 1500 1500 // 1540 1520 1520 1520 1520 1500 1540 1500 1500 1520 [test_core0_fifo_irq_handle] = t_core0_fifo_irq_handle, // 780 760 800 800 780 800 780 780 780 800 // 800 760 800 800 800 820 780 780 800 780 [test_core0_fifo_irq_wfi] = t_core0_fifo_irq_wfi, [test__num] = NULL, }; __attribute__((__section__(".scratch_y.core1_init"))) static void core1_init(void) { SCB->SCR &= ~SCB_SCR_SEVONPEND_Msk; // TODO: IRQ stuff? // TODO: * set core1 irq as used irqs } __attribute__((__section__(".scratch_x.delaytest"))) void delaytest(void) { vreg_set_voltage(VREG_VOLTAGE_1_15); set_sys_clock_khz(25*1000, true); gpio_set_function(PIN_HIGH , GPIO_FUNC_SIO); gpio_set_function(PIN_TRIG_IN , GPIO_FUNC_SIO); gpio_set_function(PIN_TRIG_OUT , GPIO_FUNC_SIO); gpio_set_function(PIN_CORE0_TRG, GPIO_FUNC_SIO); gpio_set_dir(PIN_HIGH , GPIO_OUT); gpio_set_dir(PIN_TRIG_IN , GPIO_IN ); gpio_set_dir(PIN_TRIG_OUT , GPIO_OUT); gpio_set_dir(PIN_CORE0_TRG, GPIO_IN ); gpio_put(PIN_HIGH, true); gpio_put(PIN_TRIG_OUT, false); SCB->SCR &= ~SCB_SCR_SEVONPEND_Msk; const enum test t = test_pio_fifo; if (t <= test_core0_mem || t >= test_core0_wfe) __disable_irq(); multicore_launch_core1(tests[t]); if (t >= test_core0_mem && t <= test_core0_wfe) { const int gpio = PIN_TRIG_IN; const int irq = IO_IRQ_BANK0; const int event = GPIO_IRQ_EDGE_RISE; irq_set_enabled(irq, false); iobank0_hw->intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq irq_set_priority(irq, PICO_HIGHEST_IRQ_PRIORITY); hw_set_bits(&iobank0_hw->proc0_irq_ctrl.inte[gpio>>3], event << 4*(gpio&7)); __disable_irq(); irq_set_enabled(irq, true); while (true) { __WFI(); sio_hw->fifo_wr = 1;//__SEV();//shvar = 1;// irq_set_enabled(irq, false); iobank0_hw->intr[gpio>>3] = event << 4*(gpio&7); // acknowledge irq busy_wait_us_32(100); irq_set_enabled(irq, true); } } else while (true) ; }