#include <zephyr/kernel.h>
#include <string.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 /* 1 минута в миллисекундах */
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; /* Останавливаем оба потока */
printk("[TEST] 60 seconds elapsed! Stopping test loops...\n");
break;
}
k_yield();
}
printk("[TEST] Resample thread finalized safely.\n");
}
/* --- Поток 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 stopped safely.\n");
}
/* --- Главный поток --- */
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;
}