/* * Copyright (C) 2024 Phillip Stevens All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * This file is NOT part of the FreeRTOS distribution. * */ #include #include /* FreeRTOS includes. */ #include "Arduino_FreeRTOS.h" #include "task.h" #include "timers.h" #include "mik32_hal_scr1_timer.h" extern void setup(void); extern void loop(void); /*-----------------------------------------------------------*/ void initVariant(void) { setup(); // the normal Arduino setup() function is run here. post_init(); vTaskStartScheduler(); // initialise and run the freeRTOS scheduler. Execution should never return here. } /*-----------------------------------------------------------*/ #if ( configUSE_IDLE_HOOK == 1 ) /* * Call the user defined loop() function from within the idle task. * This allows the application designer to add background functionality * without the overhead of a separate task. * * NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, CALL A FUNCTION THAT MIGHT BLOCK. * */ void vApplicationIdleHook( void ) __attribute__ ((weak)); void vApplicationIdleHook( void ) { loop(); // the normal Arduino loop() function is run here. } #else void loop() {} //Empty loop function #endif /* configUSE_IDLE_HOOK == 1 */ /*-----------------------------------------------------------*/ #if ( configUSE_MALLOC_FAILED_HOOK == 1 || configCHECK_FOR_STACK_OVERFLOW >= 1 || configDEFAULT_ASSERT == 1 ) /** * Private function to enable board led to use it in application hooks */ void prvSetMainLedOn( void ) { #if defined (LED_BUILTIN) pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); #endif } /** * Private function to blink board led to use it in application hooks */ void prvBlinkMainLed( void ) { #if defined (LED_BUILTIN) digitalToggle(LED_BUILTIN); #endif } #endif #if ( configUSE_MALLOC_FAILED_HOOK == 1 ) /*---------------------------------------------------------------------------*\ Usage: called by task system when a malloc failure is noticed Description: Malloc failure handler -- Shut down all interrupts, send serious complaint to command port. FAST Blink on main LED. Arguments: pxTask - pointer to task handle pcTaskName - pointer to task name Results: Notes: This routine will never return. This routine is referenced in the task.c file of FreeRTOS as an extern. \*---------------------------------------------------------------------------*/ void vApplicationMallocFailedHook( void ) __attribute__ ((weak)); void vApplicationMallocFailedHook( void ) { prvSetMainLedOn(); // Main LED on. for(;;) { delay(50); prvBlinkMainLed(); // Main LED fast blink. } } #endif /* configUSE_MALLOC_FAILED_HOOK == 1 */ /*-----------------------------------------------------------*/ #if ( configCHECK_FOR_STACK_OVERFLOW >= 1 ) void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName ) __attribute__ ((weak)); void vApplicationStackOverflowHook( TaskHandle_t xTask __attribute__ ((unused)), char * pcTaskName __attribute__ ((unused)) ) { prvSetMainLedOn(); // Main LED on. for(;;) { delay(2000); prvBlinkMainLed(); // Main LED slow blink. } } #endif /* configCHECK_FOR_STACK_OVERFLOW >= 1 */ /*-----------------------------------------------------------*/ #if ( configSUPPORT_STATIC_ALLOCATION >= 1 ) void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, configSTACK_DEPTH_TYPE * puxIdleTaskStackSize ) __attribute__ ((weak)); void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, configSTACK_DEPTH_TYPE * puxIdleTaskStackSize ) { static StaticTask_t xIdleTaskTCB; static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; *ppxIdleTaskStackBuffer = uxIdleTaskStack; *puxIdleTaskStackSize = configMINIMAL_STACK_SIZE; } #if ( configUSE_TIMERS >= 1 ) void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, configSTACK_DEPTH_TYPE * puxTimerTaskStackSize ) __attribute__ ((weak)); void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, configSTACK_DEPTH_TYPE * puxTimerTaskStackSize ) { static StaticTask_t xTimerTaskTCB; static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ]; *ppxTimerTaskTCBBuffer = &xTimerTaskTCB; *ppxTimerTaskStackBuffer = uxTimerTaskStack; *puxTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; } #endif /* configUSE_TIMERS >= 1 */ #endif /* configSUPPORT_STATIC_ALLOCATION >= 1 */ /** * configASSERT default implementation */ #if configDEFAULT_ASSERT == 1 void vApplicationAssertHook() { taskDISABLE_INTERRUPTS(); // Disable task interrupts prvSetMainLedOn(); // Main LED on. for(;;) { delay(100); prvBlinkMainLed(); // Led off. delay(2000); prvBlinkMainLed(); // Led on. delay(100); prvBlinkMainLed(); // Led off delay(100); prvBlinkMainLed(); // Led on. } } #endif