Загрузка данных
#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;
}