add freertos lib
This commit is contained in:
		
							parent
							
								
									a159937fa9
								
							
						
					
					
						commit
						02e1de09ff
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ | |||||||
| 
 | 
 | ||||||
| picotool | picotool | ||||||
| sdk | sdk | ||||||
|  | freertos | ||||||
| 
 | 
 | ||||||
| build | build | ||||||
| toolchain | toolchain | ||||||
							
								
								
									
										104
									
								
								config/FreeRTOSConfig.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								config/FreeRTOSConfig.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,104 @@ | |||||||
|  | #ifndef FREERTOS_CONFIG_H | ||||||
|  | #define FREERTOS_CONFIG_H | ||||||
|  | 
 | ||||||
|  | /*-----------------------------------------------------------
 | ||||||
|  |  * Application specific definitions. | ||||||
|  |  * | ||||||
|  |  * These definitions should be adjusted for your particular hardware and | ||||||
|  |  * application requirements. | ||||||
|  |  * | ||||||
|  |  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||||
|  |  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||||
|  |  * | ||||||
|  |  * See http://www.freertos.org/a00110.html.
 | ||||||
|  |  *----------------------------------------------------------*/ | ||||||
|  | 
 | ||||||
|  | #define configUSE_PREEMPTION                    1 | ||||||
|  | #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 | ||||||
|  | #define configUSE_IDLE_HOOK                     0 | ||||||
|  | #define configUSE_TICK_HOOK                     0 | ||||||
|  | #define configCPU_CLOCK_HZ                      ((unsigned long)150000000) // RP2350 default clock is 150 MHz
 | ||||||
|  | #define configTICK_RATE_HZ                      ( ( TickType_t ) 1000 ) | ||||||
|  | #define configMAX_PRIORITIES                    5 | ||||||
|  | #define configMINIMAL_STACK_SIZE                ( ( unsigned short ) 256 ) | ||||||
|  | #define configTOTAL_HEAP_SIZE                   ( ( size_t ) ( 16 * 1024 ) ) | ||||||
|  | #define configMAX_TASK_NAME_LEN                 ( 16 ) | ||||||
|  | #define configUSE_TRACE_FACILITIES              0 | ||||||
|  | #define configUSE_16_BIT_TICKS                  0 | ||||||
|  | #define configIDLE_SHOULD_YIELD                 1 | ||||||
|  | #define configUSE_MUTEXES                       1 | ||||||
|  | #define configQUEUE_REGISTRY_SIZE               8 | ||||||
|  | #define configCHECK_FOR_STACK_OVERFLOW          2 | ||||||
|  | #define configUSE_RECURSIVE_MUTEXES             1 | ||||||
|  | #define configUSE_MALLOC_FAILED_HOOK            0 | ||||||
|  | #define configUSE_APPLICATION_TASK_TAG          0 | ||||||
|  | #define configUSE_COUNTING_SEMAPHORES           1 | ||||||
|  | #define configGENERATE_RUN_TIME_STATS           0 | ||||||
|  | 
 | ||||||
|  | #define configSUPPORT_DYNAMIC_ALLOCATION        1 | ||||||
|  | 
 | ||||||
|  | #define configENABLE_FPU                        0 | ||||||
|  | #define configENABLE_TRUSTZONE                  0 | ||||||
|  | 
 | ||||||
|  | /* Co-routine definitions. */ | ||||||
|  | #define configUSE_CO_ROUTINES                   0 | ||||||
|  | #define configMAX_CO_ROUTINE_PRIORITIES         ( 2 ) | ||||||
|  | 
 | ||||||
|  | /* Software timer definitions. */ | ||||||
|  | #define configUSE_TIMERS                        1 | ||||||
|  | #define configTIMER_TASK_PRIORITY               ( 2 ) | ||||||
|  | #define configTIMER_QUEUE_LENGTH                10 | ||||||
|  | #define configTIMER_TASK_STACK_DEPTH            ( configMINIMAL_STACK_SIZE * 2 ) | ||||||
|  | 
 | ||||||
|  | #define configENABLE_MPU                        0 | ||||||
|  | 
 | ||||||
|  | /* Set the following definitions to 1 to include the API function, or zero
 | ||||||
|  | to exclude the API function. */ | ||||||
|  | #define INCLUDE_vTaskPrioritySet                1 | ||||||
|  | #define INCLUDE_uxTaskPriorityGet               1 | ||||||
|  | #define INCLUDE_vTaskDelete                     1 | ||||||
|  | #define INCLUDE_vTaskCleanUpResources           0 | ||||||
|  | #define INCLUDE_vTaskSuspend                    1 | ||||||
|  | #define INCLUDE_vTaskDelayUntil                 1 | ||||||
|  | #define INCLUDE_vTaskDelay                      1 | ||||||
|  | #define INCLUDE_xTaskGetSchedulerState          1 | ||||||
|  | #define INCLUDE_xTaskGetCurrentTaskHandle       1 | ||||||
|  | #define INCLUDE_uxTaskGetStackHighWaterMark     0 | ||||||
|  | #define INCLUDE_xTaskGetIdleTaskHandle          0 | ||||||
|  | #define INCLUDE_eTaskGetState                   0 | ||||||
|  | #define INCLUDE_xSemaphoreGetMutexHolder        0 | ||||||
|  | #define INCLUDE_xTimerPendFunctionCall          1 | ||||||
|  | #define INCLUDE_xQueueGetMutexHolder            0 | ||||||
|  | #define INCLUDE_xEventGroupSetBitFromISR        1 | ||||||
|  | #define INCLUDE_xTimerPendFunctionCall          1 | ||||||
|  | 
 | ||||||
|  | /* Cortex-M specific definitions. */ | ||||||
|  | #ifdef __NVIC_PRIO_BITS | ||||||
|  |     /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ | ||||||
|  |     #define configPRIO_BITS             __NVIC_PRIO_BITS | ||||||
|  | #else | ||||||
|  |     #define configPRIO_BITS             3    /* 7 priority levels */ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | /* The lowest interrupt priority that can be used in a call to a "set priority"
 | ||||||
|  | function. */ | ||||||
|  | #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         0x7 | ||||||
|  | 
 | ||||||
|  | /* The highest interrupt priority that can be used by any interrupt service
 | ||||||
|  | routine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL | ||||||
|  | INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER | ||||||
|  | PRIORITY THAN THIS! (higher priorities are lower numeric values. */ | ||||||
|  | #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5 | ||||||
|  | 
 | ||||||
|  | /* Interrupt priorities used by the kernel port layer itself.  These are generic
 | ||||||
|  | to all Cortex-M ports, and do not rely on any particular library functions. */ | ||||||
|  | #define configKERNEL_INTERRUPT_PRIORITY         ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) | ||||||
|  | /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
 | ||||||
|  | See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
 | ||||||
|  | #define configMAX_SYSCALL_INTERRUPT_PRIORITY    ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) | ||||||
|  | 
 | ||||||
|  | /* Normal assert() semantics without relying on the provision of an assert.h
 | ||||||
|  | header file. */ | ||||||
|  | #define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } | ||||||
|  | 
 | ||||||
|  | #endif /* FREERTOS_CONFIG_H */ | ||||||
| @ -5,35 +5,63 @@ cmake_minimum_required(VERSION 3.13) | |||||||
| set(CMAKE_C_STANDARD 11) | set(CMAKE_C_STANDARD 11) | ||||||
| set(CMAKE_CXX_STANDARD 17) | set(CMAKE_CXX_STANDARD 17) | ||||||
| set(CMAKE_EXPORT_COMPILE_COMMANDS ON) | set(CMAKE_EXPORT_COMPILE_COMMANDS ON) | ||||||
| set(CMAKE_C_COMPILER "/home/romain/Downloads/pico-sdk/toolchain/riscv/bin/riscv32-unknown-elf-gcc") |  | ||||||
| 
 | 
 | ||||||
| # Pull in Raspberry Pi Pico SDK (must be before project) |  | ||||||
| include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) | include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) | ||||||
| 
 | 
 | ||||||
| project(simple_led C CXX ASM) | project(simple_led C CXX ASM) | ||||||
| 
 | 
 | ||||||
| # Initialise the Raspberry Pi Pico SDK |  | ||||||
| pico_sdk_init() | pico_sdk_init() | ||||||
| 
 | 
 | ||||||
| # Add executable. Default name is the project name, version 0.1 | set(FREERTOS_SRC_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../freertos/FreeRTOSv202411.00/FreeRTOS/Source) | ||||||
|  | set(FREERTOS_CONFIG_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../config) | ||||||
| 
 | 
 | ||||||
| add_executable(simple_led main.c ) | # add_library(FreeRTOS STATIC | ||||||
|  | # 	${FREERTOS_SRC_DIRECTORY}/event_groups.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/list.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/queue.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/stream_buffer.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/tasks.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/timers.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/portable/MemMang/heap_3.c | ||||||
|  | #   ${FREERTOS_SRC_DIRECTORY}/portable/GCC/ARM_CM33_NTZ/non_secure/port.c | ||||||
|  | # 	${FREERTOS_SRC_DIRECTORY}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c | ||||||
|  | # ) | ||||||
|  | 
 | ||||||
|  | # Include FreeRTOS directories | ||||||
|  | include_directories( | ||||||
|  | 	${FREERTOS_CONFIG_DIRECTORY} | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/include | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/portable/GCC/ARM_CM33_NTZ/non_secure | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | set(FREERTOS_SOURCES | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/event_groups.c | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/list.c | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/queue.c | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/stream_buffer.c | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/tasks.c | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/timers.c | ||||||
|  |   ${FREERTOS_SRC_DIRECTORY}/portable/MemMang/heap_3.c | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | set(FREERTOS_PORT_FILES | ||||||
|  |     ${FREERTOS_SRC_DIRECTORY}/portable/GCC/ARM_CM33_NTZ/non_secure/port.c | ||||||
|  |     ${FREERTOS_SRC_DIRECTORY}/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | add_executable(simple_led main.c ${FREERTOS_SOURCES} ${FREERTOS_PORT_FILES}) | ||||||
| 
 | 
 | ||||||
| pico_set_program_name(simple_led "simple_led") | pico_set_program_name(simple_led "simple_led") | ||||||
| pico_set_program_version(simple_led "0.1") | pico_set_program_version(simple_led "0.1") | ||||||
| 
 | 
 | ||||||
| # Modify the below lines to enable/disable output over UART/USB | target_link_libraries( | ||||||
|  | 	simple_led | ||||||
|  | 	pico_stdlib | ||||||
|  |   # FreeRTOS | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| pico_enable_stdio_uart(simple_led 0) | pico_enable_stdio_uart(simple_led 0) | ||||||
| pico_enable_stdio_usb(simple_led 1) | pico_enable_stdio_usb(simple_led 1) | ||||||
| 
 | 
 | ||||||
| # Add the standard library to the build |  | ||||||
| target_link_libraries(simple_led |  | ||||||
|         pico_stdlib) |  | ||||||
| 
 |  | ||||||
| # Add the standard include files to the build |  | ||||||
| target_include_directories(simple_led PRIVATE |  | ||||||
|         ${CMAKE_CURRENT_LIST_DIR} |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| pico_add_extra_outputs(simple_led) | pico_add_extra_outputs(simple_led) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,52 +1,90 @@ | |||||||
| #include <stdio.h> |  | ||||||
| #include "pico/stdlib.h" |  | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <time.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | 
 | ||||||
|  | #include "pico/stdlib.h" | ||||||
|  | #include <FreeRTOS.h> | ||||||
|  | #include <task.h> | ||||||
|  | #include <queue.h> | ||||||
| 
 | 
 | ||||||
| #ifndef LED_DELAY_MS | #ifndef LED_DELAY_MS | ||||||
|     #define LED_DELAY_MS 250 |     #define LED_DELAY_MS 500 | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define GPIO_15 15 | #define GPIO_15 15 | ||||||
| #define GPIO_13 13 | #define GPIO_13 13 | ||||||
| 
 | 
 | ||||||
| void pico_led_init(void) { | void blink_success(bool in_task) { | ||||||
|     #ifdef PICO_DEFAULT_LED_PIN |     gpio_put(PICO_DEFAULT_LED_PIN, true); | ||||||
|         gpio_init(PICO_DEFAULT_LED_PIN); |     if (in_task) | ||||||
|         gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); |         vTaskDelay(pdMS_TO_TICKS(500)); | ||||||
|     #endif |     else | ||||||
| 
 |         sleep_ms(500); | ||||||
|     gpio_init(GPIO_15); |     gpio_put(PICO_DEFAULT_LED_PIN, false); | ||||||
|     gpio_set_dir(GPIO_15, GPIO_OUT); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void blink_led(void) { | void blink_failed(bool in_task) { | ||||||
|     pico_led_init(); |     for (;;) { | ||||||
| 
 |  | ||||||
|     while (true) { |  | ||||||
|         gpio_put(GPIO_15, false); |  | ||||||
|         gpio_put(PICO_DEFAULT_LED_PIN, true); |         gpio_put(PICO_DEFAULT_LED_PIN, true); | ||||||
|  |         if (in_task) | ||||||
|  |             vTaskDelay(pdMS_TO_TICKS(500)); | ||||||
|  |         else | ||||||
|  |             sleep_ms(500); | ||||||
| 
 | 
 | ||||||
|         sleep_ms(LED_DELAY_MS); |  | ||||||
| 
 |  | ||||||
|         gpio_put(GPIO_15, true); |  | ||||||
|         gpio_put(PICO_DEFAULT_LED_PIN, false); |         gpio_put(PICO_DEFAULT_LED_PIN, false); | ||||||
| 
 |         if (in_task) | ||||||
|         sleep_ms(1000); |             vTaskDelay(pdMS_TO_TICKS(500)); | ||||||
|  |         else | ||||||
|  |             sleep_ms(500); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| enum button_state {OFF, ON}; | void blink_default_led(void) { | ||||||
|  |     #ifdef PICO_DEFAULT_LED_PIN | ||||||
|  |         while (true) { | ||||||
|  |             gpio_put(PICO_DEFAULT_LED_PIN, true); | ||||||
|  |             // sleep_ms(LED_DELAY_MS);
 | ||||||
|  |             vTaskDelay(LED_DELAY_MS / portTICK_PERIOD_MS); | ||||||
|  |             gpio_put(PICO_DEFAULT_LED_PIN, false); | ||||||
|  |             // sleep_ms(1000);
 | ||||||
|  |             vTaskDelay(LED_DELAY_MS / portTICK_PERIOD_MS); | ||||||
|  |         } | ||||||
|  |     #endif | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void run_health() { | ||||||
|  |     BaseType_t res = xTaskCreate( | ||||||
|  |         blink_default_led,  | ||||||
|  |         "healthcheck", | ||||||
|  |         configMINIMAL_STACK_SIZE, | ||||||
|  |         NULL, | ||||||
|  |         configMAX_PRIORITIES - 1U, | ||||||
|  |         NULL | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     if (res != pdPASS) { | ||||||
|  |         printf("error: unable to launch healthcheck task, code error: %d\n", res); | ||||||
|  |     } | ||||||
|  |          | ||||||
|  |     return; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| typedef struct state state; | typedef struct state state; | ||||||
| struct state { | struct state { | ||||||
|     int counter; |     int counter; | ||||||
|     int bs; |     int bs; | ||||||
|     bool can_incr; |     bool can_incr; | ||||||
|  | 
 | ||||||
|  |     clock_t push_clock; | ||||||
|  |     bool on_reset; | ||||||
|  |     bool is_reset; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static state global_state = (state) { | static state global_state = (state) { | ||||||
|     .counter = 0, |     .counter = 0, | ||||||
|     .can_incr = true |     .can_incr = true, | ||||||
|  |     .on_reset = false, | ||||||
|  |     .is_reset = false, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void incr_counter(state *s) { | void incr_counter(state *s) { | ||||||
| @ -70,28 +108,144 @@ bool can_push(state *s) { | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void set_push_clock(state *s) { | ||||||
|  |     if (s != NULL) { | ||||||
|  |         if (s->push_clock) | ||||||
|  |             return; | ||||||
|  |         s->push_clock = clock(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| int main() | bool is_resetting(state *s) { | ||||||
| { |     if (s != NULL) { | ||||||
|     gpio_init(GPIO_15); |         clock_t c = clock(); | ||||||
|     gpio_set_dir(GPIO_15, GPIO_OUT); |         double exec_time = (double)(c - s->push_clock) / CLOCKS_PER_SEC; | ||||||
|  |         if (exec_time >= 2) | ||||||
|  |             return true; | ||||||
|  |     } | ||||||
|  |     return false; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|     gpio_init(GPIO_13); | void reset(state *s) { | ||||||
|     gpio_set_dir(GPIO_13, GPIO_IN); |     s->push_clock = 0; | ||||||
|  |     s->counter = 0; | ||||||
|  |     s->is_reset = true; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | void led_control() { | ||||||
|     while (1) { |     while (1) { | ||||||
|         // return low level when the button is pressed
 |         // return low level when the button is pressed
 | ||||||
|         if (!gpio_get(GPIO_13)) { |         if (!gpio_get(GPIO_13)) { | ||||||
|             sleep_ms(20); // avoid "bounce" phenomenon (buffeting)
 |             // sleep_ms(20); // avoid "bounce" phenomenon (buffeting)
 | ||||||
|  |             vTaskDelay(20 / portTICK_PERIOD_MS); | ||||||
|             if (!gpio_get(GPIO_13)) { |             if (!gpio_get(GPIO_13)) { | ||||||
|  |                 if (global_state.is_reset) | ||||||
|  |                     continue; | ||||||
|  | 
 | ||||||
|  |                 set_push_clock(&global_state); | ||||||
|  |                 if (is_resetting(&global_state)) { | ||||||
|  |                     gpio_put(GPIO_15, true); | ||||||
|  |                     // sleep_ms(500);
 | ||||||
|  |                     vTaskDelay(500 / portTICK_PERIOD_MS); | ||||||
|  |                     gpio_put(GPIO_15, false); | ||||||
|  |                     // sleep_ms(500);
 | ||||||
|  |                     vTaskDelay(500 / portTICK_PERIOD_MS); | ||||||
|  |                     gpio_put(GPIO_15, true); | ||||||
|  |                     // sleep_ms(500);
 | ||||||
|  |                     vTaskDelay(500 / portTICK_PERIOD_MS); | ||||||
|  |                     gpio_put(GPIO_15, false); | ||||||
|  |                     // sleep_ms(500);
 | ||||||
|  |                     vTaskDelay(500 / portTICK_PERIOD_MS); | ||||||
|  |                     gpio_put(GPIO_15, true); | ||||||
|  |                     // sleep_ms(500);
 | ||||||
|  |                     vTaskDelay(500 / portTICK_PERIOD_MS); | ||||||
|  |                     gpio_put(GPIO_15, false); | ||||||
|  | 
 | ||||||
|  |                     reset(&global_state); | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|                 incr_counter(&global_state); |                 incr_counter(&global_state); | ||||||
|                 if (can_push(&global_state)) |                 if (can_push(&global_state)) | ||||||
|                     gpio_put(GPIO_15, true); |                     gpio_put(GPIO_15, true); | ||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         if (global_state.is_reset) { | ||||||
|  |             global_state.on_reset = false; | ||||||
|  |             global_state.is_reset = false; | ||||||
|  |         } | ||||||
|  |         global_state.push_clock = 0; | ||||||
|         set_can_incr(&global_state, true); |         set_can_incr(&global_state, true); | ||||||
|         gpio_put(GPIO_15, false); |         gpio_put(GPIO_15, false); | ||||||
|     } |     } | ||||||
| 
 | } | ||||||
|  | 
 | ||||||
|  | void run_led_control() { | ||||||
|  |     BaseType_t res = xTaskCreate( | ||||||
|  |         led_control,  | ||||||
|  |         "led_controller", | ||||||
|  |         configMINIMAL_STACK_SIZE, | ||||||
|  |         NULL, | ||||||
|  |         configMAX_PRIORITIES - 1U, | ||||||
|  |         NULL | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     if (res != pdPASS) { | ||||||
|  |         printf("error: unable to launch led control task, code error: %d\n", res); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void init_gpio() { | ||||||
|  |     #ifdef PICO_DEFAULT_LED_PIN | ||||||
|  |         gpio_init(PICO_DEFAULT_LED_PIN); | ||||||
|  |         gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); | ||||||
|  |     #endif | ||||||
|  | 
 | ||||||
|  |     gpio_init(GPIO_15); | ||||||
|  |     gpio_set_dir(GPIO_15, GPIO_OUT); | ||||||
|  | 
 | ||||||
|  |     gpio_init(GPIO_13); | ||||||
|  |     gpio_set_dir(GPIO_13, GPIO_IN); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void check_scheduler_init(void *pvParameters) { | ||||||
|  |     for (;;) { | ||||||
|  |         BaseType_t state = xTaskGetSchedulerState(); | ||||||
|  |         if (state == taskSCHEDULER_RUNNING) | ||||||
|  |             blink_success(true); | ||||||
|  |         blink_success(true); | ||||||
|  |         // vTaskDelay(pdMS_TO_TICKS(500));
 | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName) { | ||||||
|  |     blink_failed(false); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     stdio_init_all(); | ||||||
|  |     init_gpio(); | ||||||
|  | 
 | ||||||
|  |     // TaskHandle_t health_task = run_health();
 | ||||||
|  |     // TaskHandle_t led_task = run_led_control();
 | ||||||
|  | 
 | ||||||
|  |     BaseType_t res = xTaskCreate( | ||||||
|  |         check_scheduler_init,  | ||||||
|  |         "check_init", | ||||||
|  |         256, | ||||||
|  |         NULL, | ||||||
|  |         configMAX_PRIORITIES - 1, | ||||||
|  |         NULL | ||||||
|  |     ); | ||||||
|  |     if (res != pdPASS) | ||||||
|  |         blink_failed(false); | ||||||
|  |     else | ||||||
|  |         blink_success(false); | ||||||
|  | 
 | ||||||
|  |     vTaskStartScheduler(); | ||||||
|  | 
 | ||||||
|  |     blink_failed(false); | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 rmanach
						rmanach