Загрузка данных


#include <zephyr/kernel.h>
#include <string.h>

/* Подключаем внутренний заголовок Zephyr для программного вызова shell-команд */
#include <zephyr/shell/shell.h>

#define RESAMPLE_BUF_SIZE     160
#define FLOOD_ARRAY_SIZE      (256 * 1024)
#define STACK_SIZE            2048
#define TEST_THREAD_PRIO      5
#define TEST_DURATION_MS      60000 

static uint32_t flood_buffer[FLOOD_ARRAY_SIZE] __attribute__((section(".sdram_data")));
volatile uint32_t flood_dummy_sink;

static int16_t resample_in_buf[RESAMPLE_BUF_SIZE];
static int16_t resample_out_buf[RESAMPLE_BUF_SIZE * 2];

extern int res_Resample(const int16_t X[], int16_t Y[], double pFactor,
                        uint16_t nx, int LargeF, int Interp);

volatile bool test_running = true;

/* --- Поток 1: Ресемплер --- */
K_THREAD_STACK_DEFINE(resample_stack, STACK_SIZE);
struct k_thread resample_thread_data;

void resample_test_thread(void *p1, void *p2, void *p3)
{
    for (int i = 0; i < RESAMPLE_BUF_SIZE; i++) {
        resample_in_buf[i] = (int16_t)(i * 100);
    }

    int64_t start_time = k_uptime_get();
    printk("[TEST] Resample thread started. Timing for 60 seconds...\n");

    while (test_running) {
        res_Resample(resample_in_buf, resample_out_buf, 2.0, 
                     RESAMPLE_BUF_SIZE, 1, 1);

        if ((k_uptime_get() - start_time) >= TEST_DURATION_MS) {
            test_running = false; /* Сигнал для flooder_thread */
            printk("[TEST] 60 seconds elapsed! Freezing loops and printing report...\n");
            
            /* --- ХАК: Автоматический вызов встроенной команды kernel thread list --- */
            /* Находим shell-бэкэнд по умолчанию и передаем ему текстовую команду */
            const struct shell *sh = shell_backend_uart_get_ptr();
            if (sh) {
                shell_execute_cmd(sh, "kernel thread list");
            } else {
                printk("[ERROR] Shell backend not found!\n");
            }
            break;
        }
        k_yield();
    }

    printk("[TEST] Resample thread frozen. Going to sleep forever...\n");
    k_sleep(K_FOREVER); /* Поток не умирает, статистика сохранена! */
}

/* --- Поток 2: Интенсивное чтение (Вредитель) --- */
K_THREAD_STACK_DEFINE(flooder_stack, STACK_SIZE);
struct k_thread flooder_thread_data;

void memory_flooder_thread(void *p1, void *p2, void *p3)
{
    printk("[TEST] Flooder thread started.\n");
    
    while (test_running) {
        for (int i = 0; i < FLOOD_ARRAY_SIZE; i++) {
            flood_dummy_sink = flood_buffer[i];
        }
        k_yield();
    }

    printk("[TEST] Flooder thread frozen. Going to sleep forever...\n");
    k_sleep(K_FOREVER); /* Поток не умирает, статистика сохранена! */
}

/* --- Главный поток --- */
int main(void)
{
    printk("Preparing SEMC Bus Torture Test...\n");

    for (int i = 0; i < FLOOD_ARRAY_SIZE; i++) {
        flood_buffer[i] = i * 3;
    }

    k_thread_create(&resample_thread_data, resample_stack,
                    K_THREAD_STACK_SIZEOF(resample_stack),
                    resample_test_thread, NULL, NULL, NULL,
                    TEST_THREAD_PRIO, 0, K_NO_WAIT);
    k_thread_name_set(&resample_thread_data, "torture_res");

    k_thread_create(&flooder_thread_data, flooder_stack,
                    K_THREAD_STACK_SIZEOF(flooder_stack),
                    memory_flooder_thread, NULL, NULL, NULL,
                    TEST_THREAD_PRIO, 0, K_NO_WAIT);
    k_thread_name_set(&flooder_thread_data, "torture_flood");

    return 0;
}