menu "FreeRTOS"

# This is actually also handled in the ESP32 startup code, not only in FreeRTOS.
config FREERTOS_UNICORE
    bool "Run FreeRTOS only on first core"
    default n
    help
        This version of FreeRTOS normally takes control of all cores of 
        the CPU. Select this if you only want to start it on the first core.
        This is needed when e.g. another process needs complete control
        over the second core.


choice FREERTOS_CORETIMER
    prompt "Xtensa timer to use as the FreeRTOS tick source"
    default CONFIG_FREERTOS_CORETIMER_0
    help
        FreeRTOS needs a timer with an associated interrupt to use as
        the main tick source to increase counters, run timers and do
        pre-emptive multitasking with. There are multiple timers available
        to do this, with different interrupt priorities. Check 

config FREERTOS_CORETIMER_0
    bool "Timer 0 (int 6, level 1)"
    help
        Select this to use timer 0

config FREERTOS_CORETIMER_1
    bool "Timer 1 (int 15, level 3)"
    help
        Select this to use timer 1

config FREERTOS_CORETIMER_2
    bool "Timer 2 (int 16, level 5)"
    help
        Select this to use timer 2

endchoice

config FREERTOS_HZ
    int "Tick rate (Hz)"
    range 1 10000
    default 100
    help
        Select the tick rate at which FreeRTOS does pre-emptive context switching.

config FREERTOS_ASSERT_ON_UNTESTED_FUNCTION
	bool "Halt when an SMP-untested function is called"
	default y
	help
		Some functions in FreeRTOS have not been thoroughly tested yet when moving to
		the SMP implementation of FreeRTOS. When this option is enabled, these fuctions
		will throw an assert().

choice FREERTOS_CHECK_STACKOVERFLOW
    prompt "Check for stack overflow"
    default FREERTOS_CHECK_STACKOVERFLOW_QUICK
    help
        FreeRTOS can check for stack overflows in threads and trigger an user function
        called vApplicationStackOverflowHook when this happens.

config FREERTOS_CHECK_STACKOVERFLOW_NONE
    bool "No checking"
    help
        Do not check for stack overflows (configCHECK_FOR_STACK_OVERFLOW=0)

config FREERTOS_CHECK_STACKOVERFLOW_PTRVAL
    bool "Check by stack pointer value"
    help
        Check for stack overflows on each context switch by checking if
        the stack pointer is in a valid range. Quick but does not detect
        stack overflows that happened between context switches
        (configCHECK_FOR_STACK_OVERFLOW=1)

config FREERTOS_CHECK_STACKOVERFLOW_CANARY
    bool "Check using canary bytes"
    help
        Places some magic bytes at the end of the stack area and on each 
        context switch, check if these bytes are still intact. More thorough
        than just checking the pointer, but also slightly slower.
        (configCHECK_FOR_STACK_OVERFLOW=2)
endchoice

config FREERTOS_THREAD_LOCAL_STORAGE_POINTERS
    int "Amount of thread local storage pointers"
    range 0 256 if !WIFI_ENABLED
    range 1 256 if WIFI_ENABLED
    default 1
    help
        FreeRTOS has the ability to store per-thread pointers in the task
        control block. This controls the amount of pointers available;
        0 turns off this functionality.

        If using the WiFi stack, this value must be at least 1.

#This still needs to be implemented.
choice FREERTOS_PANIC
    prompt "Panic handler behaviour"
    default FREERTOS_PANIC_PRINT_REBOOT
    help
        If FreeRTOS detects unexpected behaviour or an unhandled exception, the panic handler is 
        invoked. Configure the panic handlers action here.

config FREERTOS_PANIC_PRINT_HALT
    bool "Print registers and halt"
    help
        Outputs the relevant registers over the serial port and halt the 
        processor. Needs a manual reset to restart.

config FREERTOS_PANIC_PRINT_REBOOT
    bool "Print registers and reboot"
    help
        Outputs the relevant registers over the serial port and immediately
        reset the processor.

config FREERTOS_PANIC_SILENT_REBOOT
    bool "Silent reboot"
    help
        Just resets the processor without outputting anything

config FREERTOS_PANIC_GDBSTUB
    bool "Invoke GDBStub"
    help
        Invoke gdbstub on the serial port, allowing for gdb to attach to it to do a postmortem
        of the crash.
endchoice

config FREERTOS_DEBUG_OCDAWARE
    bool "Make exception and panic handlers JTAG/OCD aware"
    default y
    help
        The FreeRTOS panic and unhandled exception handers can detect a JTAG OCD debugger and
        instead of panicking, have the debugger stop on the offending instruction.

choice FREERTOS_ASSERT
    prompt "FreeRTOS assertions"
    default FREERTOS_ASSERT_FAIL_ABORT
    help
        Failed FreeRTOS configASSERT() assertions can be configured to
        behave in different ways.

config FREERTOS_ASSERT_FAIL_ABORT
    bool "abort() on failed assertions"
    help
        If a FreeRTOS configASSERT() fails, FreeRTOS will abort() and
        halt execution. The panic handler can be configured to handle
        the outcome of an abort() in different ways.

config FREERTOS_ASSERT_FAIL_PRINT_CONTINUE
    bool "Print and continue failed assertions"
    help
        If a FreeRTOS assertion fails, print it out and continue.

config FREERTOS_ASSERT_DISABLE
    bool "Disable FreeRTOS assertions"
    help
        FreeRTOS configASSERT() will not be compiled into the binary.

endchoice

config FREERTOS_BREAK_ON_SCHEDULER_START_JTAG
    bool "Stop program on scheduler start when JTAG/OCD is detected"
    depends on FREERTOS_DEBUG_OCDAWARE
    default y
    help
        If JTAG/OCD is connected, stop execution when the scheduler is started and the first
        task is executed.

menuconfig ENABLE_MEMORY_DEBUG
    bool "Enable heap memory debug"
    default n
    help
        Enable this option to show malloc heap block and memory crash detect

menuconfig FREERTOS_DEBUG_INTERNALS
    bool "Debug FreeRTOS internals"
    default n
    help
        Enable this option to show the menu with internal FreeRTOS debugging features.
        This option does not change any code by itself, it just shows/hides some options.

if FREERTOS_DEBUG_INTERNALS

config FREERTOS_PORTMUX_DEBUG
    bool "Debug portMUX portENTER_CRITICAL/portEXIT_CRITICAL"
    depends on FREERTOS_DEBUG_INTERNALS
    default n
    help
        If enabled, debug information (including integrity checks) will be printed
        to UART for the port-specific MUX implementation.

config FREERTOS_PORTMUX_DEBUG_RECURSIVE
    bool "Debug portMUX Recursion"
    depends on FREERTOS_PORTMUX_DEBUG
    default n
    help
        If enabled, additional debug information will be printed for recursive
        portMUX usage.

endif # FREERTOS_DEBUG_INTERNALS

endmenu
