cc169ddd68
* * Harden stdio_usb and stdio in general against deadlocks which could otherwise result from doing printfs from within IRQs * Add a test for the above * Add mutex_try_enter_block_until API. * Make best_effort_wfe_or_timeout not use alarms if called from within IRQ
58 lines
1.4 KiB
C
58 lines
1.4 KiB
C
/**
|
|
* Copyright (c) 2023 Raspberry Pi (Trading) Ltd.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include "pico/stdlib.h"
|
|
#include "pico/multicore.h"
|
|
#include "pico/test.h"
|
|
|
|
PICOTEST_MODULE_NAME("pico_stdio_test", "pico_stdio test harness");
|
|
|
|
static volatile bool deadlock_test_done;
|
|
static void deadlock_test_core1(void) {
|
|
busy_wait_ms(250);
|
|
for(int i=0;i<1000;i++) {
|
|
if (deadlock_test_done) break;
|
|
printf("Hello from core 1 - %d\n", i);
|
|
busy_wait_ms(23);
|
|
}
|
|
}
|
|
|
|
static volatile bool deadlock_test_irq_called;
|
|
|
|
static int64_t deadlock_test_alarm(alarm_id_t id, void *param) {
|
|
static int foo;
|
|
printf("Here is a printf from the IRQ %d\n", ++foo);
|
|
deadlock_test_irq_called = true;
|
|
return 100;
|
|
}
|
|
|
|
int main() {
|
|
stdio_init_all();
|
|
|
|
for(int i=0;i<10;i++) {
|
|
printf("Hello %d\n", i);
|
|
}
|
|
printf("pico_stdio_test begins\n");
|
|
PICOTEST_START();
|
|
|
|
// Check default config has valid data in it
|
|
PICOTEST_START_SECTION("STDIO deadlock test");
|
|
multicore_launch_core1(deadlock_test_core1);
|
|
alarm_id_t alarm_id = add_alarm_in_ms(500, deadlock_test_alarm, NULL, false);
|
|
PICOTEST_CHECK(getchar_timeout_us(2000000) < 0, "someone pressed a key!");
|
|
|
|
deadlock_test_done = true;
|
|
cancel_alarm(alarm_id);
|
|
|
|
sleep_ms(100);
|
|
PICOTEST_CHECK(deadlock_test_irq_called, "deadlock_test_irq was not called");
|
|
PICOTEST_END_SECTION();
|
|
|
|
PICOTEST_END_TEST();
|
|
}
|
|
|