Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Improve time_critical test
More DMA, and check the cycles after - now works on RP2040 and RP2350
  • Loading branch information
will-v-pi committed Sep 12, 2025
commit 3216c320d87541b933398395737700c7ebacf55b
10 changes: 2 additions & 8 deletions test/pico_xip_sram_test/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
# XIP SRAM only binary
add_executable(pico_xip_sram_test pico_xip_sram_test.c)
target_link_libraries(pico_xip_sram_test PRIVATE pico_stdlib pico_multicore hardware_dma)
target_link_libraries(pico_xip_sram_test PRIVATE pico_stdlib)
pico_set_binary_type(pico_xip_sram_test xip_sram)
pico_minimize_runtime(pico_xip_sram_test INCLUDE PRINTF PRINTF_MINIMAL DEFAULT_ALARM_POOL PANIC)
target_compile_definitions(pico_xip_sram_test PRIVATE PICO_HEAP_SIZE=0x200)
pico_add_extra_outputs(pico_xip_sram_test)

# Use XIP SRAM for time critical functions
add_executable(pico_critical_xip_sram_test pico_xip_sram_test.c)
add_executable(pico_critical_xip_sram_test pico_critical_xip_sram_test.c)
target_link_libraries(pico_critical_xip_sram_test PRIVATE pico_stdlib pico_multicore hardware_dma)
pico_set_binary_type(pico_critical_xip_sram_test copy_to_ram_using_xip_ram)
pico_add_extra_outputs(pico_critical_xip_sram_test)

# Same as above, but without XIP SRAM, to show the difference
add_executable(pico_critical_no_xip_sram_test pico_xip_sram_test.c)
target_link_libraries(pico_critical_no_xip_sram_test PRIVATE pico_stdlib pico_multicore hardware_dma)
pico_set_binary_type(pico_critical_no_xip_sram_test copy_to_ram)
pico_add_extra_outputs(pico_critical_no_xip_sram_test)
106 changes: 106 additions & 0 deletions test/pico_xip_sram_test/pico_critical_xip_sram_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "hardware/dma.h"
#include "hardware/structs/systick.h"
#include "hardware/structs/busctrl.h"


int __time_critical_func(test_func_xip)(void) {
systick_hw->rvr = 0x00ffffff;
systick_hw->cvr = 0;

volatile uint32_t i = 0;
i += 4;
i += i;

return systick_hw->rvr - systick_hw->cvr;
}

int __not_in_flash_func(test_func_sram)(void) {
systick_hw->rvr = 0x00ffffff;
systick_hw->cvr = 0;

volatile uint32_t i = 0;
i += 4;
i += i;

return systick_hw->rvr - systick_hw->cvr;
}


void core1_entry() {
// Just read memory repeatedly
pico_default_asm_volatile(
"1:\n"
"ldr r0, =%0\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"b 1b\n"
: : "i" (SRAM_BASE) : "r0", "r1", "r2", "r3", "r4"
);
}


void trigger_dma(void) {
int dat[8];
for (int i = 0; i < count_of(dat); i++) {
int chan = dma_claim_unused_channel(true);
dma_channel_config c = dma_channel_get_default_config(chan);
channel_config_set_transfer_data_size(&c, DMA_SIZE_32);
channel_config_set_read_increment(&c, true);
channel_config_set_write_increment(&c, true);
uint32_t from = SRAM_BASE;
uint32_t to = SRAM_BASE + ((SRAM4_BASE - SRAM_BASE) / 2);
uint32_t size = ((SRAM4_BASE - SRAM_BASE) / 2) / 4;
dma_channel_configure(chan, &c, (uint32_t*)to, (uint32_t*)from, size, true);
dat[i] = chan;
}
for (int i = 0; i < count_of(dat); i++) {
dma_channel_unclaim(dat[i]);
}
}


int main(void) {
stdio_init_all();
printf("pico_xip_sram_test begins\n");

multicore_launch_core1(core1_entry);

systick_hw->csr = 0x4 | 0x1; // clock source and enable

// Give core1 and DMA high priority
hw_set_bits(&busctrl_hw->priority, BUSCTRL_BUS_PRIORITY_PROC1_BITS | BUSCTRL_BUS_PRIORITY_DMA_R_BITS | BUSCTRL_BUS_PRIORITY_DMA_W_BITS);
hw_clear_bits(&busctrl_hw->priority, BUSCTRL_BUS_PRIORITY_PROC0_BITS);

int test_func_xip_cycles = 0;
int test_func_sram_cycles = 0;
for (int i = 0; i < 5; i++) {
printf("running... %d\n", i);
trigger_dma();
int tmp = test_func_xip();
test_func_xip_cycles += tmp;
printf("test_func_xip: %d\n", tmp);
tmp = test_func_sram();
test_func_sram_cycles += tmp;
printf("test_func_sram: %d\n", tmp);
sleep_ms(500);
}

if (test_func_xip_cycles >= test_func_sram_cycles) {
printf("ERROR: test_func_xip_cycles (%d) >= test_func_sram_cycles (%d)\n", test_func_xip_cycles, test_func_sram_cycles);
return 1;
} else {
printf("SUCCESS: test_func_xip_cycles (%d) < test_func_sram_cycles (%d)\n", test_func_xip_cycles, test_func_sram_cycles);
}

printf("pico_xip_sram_test ends\n");
return 0;
}
59 changes: 0 additions & 59 deletions test/pico_xip_sram_test/pico_xip_sram_test.c
Original file line number Diff line number Diff line change
@@ -1,72 +1,13 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"
#include "hardware/dma.h"
#include "hardware/structs/systick.h"
#include "hardware/structs/busctrl.h"


int __time_critical_func(test_func)(void) {
systick_hw->rvr = 0x00ffffff;
systick_hw->cvr = 0;

volatile uint32_t i = 0;
i += 4;
i += i;

return systick_hw->rvr - systick_hw->cvr;
}


void core1_entry() {
// Just read memory repeatedly
pico_default_asm_volatile(
"1:\n"
"ldr r0, =%0\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"ldmia r0!, {r1-r4}\n"
"b 1b\n"
: : "i" (SRAM_BASE) : "r0", "r1", "r2", "r3", "r4"
);
}


void trigger_dma(void) {
int chan = dma_claim_unused_channel(true);
dma_channel_config c = dma_channel_get_default_config(chan);
channel_config_set_transfer_data_size(&c, DMA_SIZE_32);
channel_config_set_read_increment(&c, true);
channel_config_set_write_increment(&c, true);
uint32_t from = SRAM_BASE;
uint32_t to = SRAM_BASE + ((SRAM_STRIPED_END - SRAM_BASE) / 2);
uint32_t size = ((SRAM_STRIPED_END - SRAM_BASE) / 2) / 4;
dma_channel_configure(chan, &c, (uint32_t*)to, (uint32_t*)from, size, true);
dma_channel_unclaim(chan);
}


int main(void) {
stdio_init_all();
printf("pico_xip_sram_test begins\n");

multicore_launch_core1(core1_entry);

systick_hw->csr = 0x4 | 0x1; // clock source and enable

// Give core1 and DMA high priority
hw_set_bits(&busctrl_hw->priority, BUSCTRL_BUS_PRIORITY_PROC1_BITS | BUSCTRL_BUS_PRIORITY_DMA_R_BITS | BUSCTRL_BUS_PRIORITY_DMA_W_BITS);
hw_clear_bits(&busctrl_hw->priority, BUSCTRL_BUS_PRIORITY_PROC0_BITS);

for (int i = 0; i < 5; i++) {
printf("running... %d\n", i);
trigger_dma();
printf("test_func: %d\n", test_func());
sleep_ms(500);
}

Expand Down
Loading