/** * Copyright (c) 2022 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include "pico/stdlib.h" #include "FreeRTOS.h" #include "task.h" #include "picow_bt_example_common.h" #if HAVE_LWIP #include "pico/lwip_freertos.h" #include "pico/cyw43_arch.h" #endif #ifndef RUN_FREERTOS_ON_CORE #define RUN_FREERTOS_ON_CORE 0 #endif #define TEST_TASK_PRIORITY ( tskIDLE_PRIORITY + 2UL ) #define BLINK_TASK_PRIORITY ( tskIDLE_PRIORITY + 1UL ) #ifdef TEST_BLINK_TASK void blink_task(__unused void *params) { printf("blink_task starts\n"); while (true) { #if 0 && configNUM_CORES > 1 static int last_core_id; if (portGET_CORE_ID() != last_core_id) { last_core_id = portGET_CORE_ID(); printf("blinking now from core %d\n", last_core_id); } #endif hal_led_toggle(); vTaskDelay(200); } } #endif void main_task(__unused void *params) { int res = picow_bt_example_init(); if (res){ return; } // If we're using lwip but not via cyw43 (e.g. pan) we have to call this #if HAVE_LWIP && !CYW43_LWIP lwip_freertos_init(cyw43_arch_async_context()); #endif picow_bt_example_main(); #ifdef TEST_BLINK_TASK xTaskCreate(blink_task, "BlinkThread", configMINIMAL_STACK_SIZE, NULL, BLINK_TASK_PRIORITY, NULL); #endif while(true) { vTaskDelay(1000); } #if HAVE_LWIP && !CYW43_LWIP lwip_freertos_deinit(cyw43_arch_async_context()); #endif } void vLaunch( void) { TaskHandle_t task; xTaskCreate(main_task, "TestMainThread", 1024, NULL, TEST_TASK_PRIORITY, &task); #if NO_SYS && configUSE_CORE_AFFINITY && configNUM_CORES > 1 // we must bind the main task to one core (well at least while the init is called) // (note we only do this in NO_SYS mode, because cyw43_arch_freertos // takes care of it otherwise) vTaskCoreAffinitySet(task, 1); #endif /* Start the tasks and timer running. */ vTaskStartScheduler(); } int main() { stdio_init_all(); /* Configure the hardware ready to run the demo. */ const char *rtos_name; #if ( portSUPPORT_SMP == 1 ) rtos_name = "FreeRTOS SMP"; #else rtos_name = "FreeRTOS"; #endif #if ( portSUPPORT_SMP == 1 ) && ( configNUM_CORES == 2 ) printf("Starting %s on both cores:\n", rtos_name); vLaunch(); #elif ( RUN_FREE_RTOS_ON_CORE == 1 ) printf("Starting %s on core 1:\n", rtos_name); multicore_launch_core1(vLaunch); while (true); #else printf("Starting %s on core 0:\n", rtos_name); vLaunch(); #endif return 0; }