]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_M4_SimpleLink_CC3220SF_CCS/main.c
Update to MIT licensed FreeRTOS V10.0.0 - see https://www.freertos.org/History.txt
[freertos] / FreeRTOS / Demo / CORTEX_M4_SimpleLink_CC3220SF_CCS / main.c
index c9693ef07b8aac66c0b56d3f2ea5ddfcdfbe10d6..6b993b0084c8bf609f725fe4f39080829dcbd696 100644 (file)
-/*
-    FreeRTOS V9.0.1 - Copyright (C) 2017 Real Time Engineers Ltd.
-    All rights reserved
-
-    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
-
-    This file is part of the FreeRTOS distribution.
-
-    FreeRTOS is free software; you can redistribute it and/or modify it under
-    the terms of the GNU General Public License (version 2) as published by the
-    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.
-
-    ***************************************************************************
-    >>!   NOTE: The modification to the GPL is included to allow you to     !<<
-    >>!   distribute a combined work that includes FreeRTOS without being   !<<
-    >>!   obliged to provide the source code for proprietary components     !<<
-    >>!   outside of the FreeRTOS kernel.                                   !<<
-    ***************************************************************************
-
-    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
-    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-    FOR A PARTICULAR PURPOSE.  Full license text is available on the following
-    link: http://www.freertos.org/a00114.html
-
-    ***************************************************************************
-     *                                                                       *
-     *    FreeRTOS provides completely free yet professionally developed,    *
-     *    robust, strictly quality controlled, supported, and cross          *
-     *    platform software that is more than just the market leader, it     *
-     *    is the industry's de facto standard.                               *
-     *                                                                       *
-     *    Help yourself get started quickly while simultaneously helping     *
-     *    to support the FreeRTOS project by purchasing a FreeRTOS           *
-     *    tutorial book, reference manual, or both:                          *
-     *    http://www.FreeRTOS.org/Documentation                              *
-     *                                                                       *
-    ***************************************************************************
-
-    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading
-    the FAQ page "My application does not run, what could be wrong?".  Have you
-    defined configASSERT()?
-
-    http://www.FreeRTOS.org/support - In return for receiving this top quality
-    embedded software for free we request you assist our global community by
-    participating in the support forum.
-
-    http://www.FreeRTOS.org/training - Investing in training allows your team to
-    be as productive as possible as early as possible.  Now you can receive
-    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
-    Ltd, and the world's leading authority on the world's leading RTOS.
-
-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
-    including FreeRTOS+Trace - an indispensable productivity tool, a DOS
-    compatible FAT file system, and our tiny thread aware UDP/IP stack.
-
-    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
-    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
-
-    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
-    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS
-    licenses offer ticketed support, indemnification and commercial middleware.
-
-    http://www.SafeRTOS.com - High Integrity Systems also provide a safety
-    engineered and independently SIL3 certified version for use in safety and
-    mission critical applications that require provable dependability.
-
-    1 tab == 4 spaces!
-*/
-
-/******************************************************************************
- * This project provides two demo applications.  A simple blinky style project,
- * and a more comprehensive test and demo application.  The
- * configCREATE_SIMPLE_TICKLESS_DEMO setting (defined in FreeRTOSConfig.h) is
- * used to select between the two.  The simply blinky demo is implemented and
- * described in main_blinky.c.  The more comprehensive test and demo application
- * is implemented and described in main_full.c.
- *
- * The blinky demo uses FreeRTOS's tickless idle mode to reduce power
- * consumption.  See the notes on the web page below regarding the difference
- * in power saving that can be achieved between using the generic tickless
- * implementation (as used by the blinky demo) and a tickless implementation
- * that is tailored specifically to the CC3220.
- *
- * This file implements the code that is not demo specific.
- *
- * See http://www.FreeRTOS.org/TI_CC3220_SimpleLink_FreeRTOS_Demo.html for
- * instructions.
- *
- */
-
-/* Standard includes. */
-#include <stdio.h>
-
-/* TI includes. */
-#include <ti/drivers/GPIO.h>
-#include <ti/boards/CC3220SF_LAUNCHXL/Board.h>
-
-/* Kernel includes. */
-#include "FreeRTOS.h"
-#include "task.h"
-
-/*-----------------------------------------------------------*/
-
-/*
- * Set up the hardware ready to run this demo.
- */
-static void prvSetupHardware( void );
-
-/*
- * main_blinky() is used when configCREATE_SIMPLE_TICKLESS_DEMO is set to 1.
- * main_full() is used when configCREATE_SIMPLE_TICKLESS_DEMO is set to 0.
- */
-extern void main_blinky( void );
-extern void main_full( void );
-
-/*-----------------------------------------------------------*/
-
-int main( void )
-{
-       /* See http://www.FreeRTOS.org/TI_CC3220_SimpleLink_FreeRTOS_Demo.html for
-    instructions. */
-
-
-       /* Prepare the hardware to run this demo. */
-       prvSetupHardware();
-
-       /* The configCREATE_SIMPLE_TICKLESS_DEMO setting is described at the top
-       of this file. */
-       #if( configCREATE_SIMPLE_TICKLESS_DEMO == 1 )
-       {
-               main_blinky();
-       }
-       #else
-       {
-               main_full();
-       }
-       #endif
-
-       return 0;
-}
-/*-----------------------------------------------------------*/
-
-static void prvSetupHardware( void )
-{
-    /* Call board init functions */
-    Board_initGeneral();
-    Board_initGPIO();
-    GPIO_write( Board_LED0, Board_GPIO_LED_OFF );
-}
-/*-----------------------------------------------------------*/
-
-void vMainToggleLED( void )
-{
-static uint32_t ulLEDState = Board_GPIO_LED_OFF;
-
-    ulLEDState = !ulLEDState;
-    GPIO_write( Board_LED0, ulLEDState );
-}
-/*-----------------------------------------------------------*/
-
-void vApplicationMallocFailedHook( void )
-{
-       /* vApplicationMallocFailedHook() will only be called if
-       configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h.  It is a hook
-       function that will get called if a call to pvPortMalloc() fails.
-       pvPortMalloc() is called internally by the kernel whenever a task, queue,
-       timer or semaphore is created.  It is also called by various parts of the
-       demo application.  If heap_1.c or heap_2.c are used, then the size of the
-       heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in
-       FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used
-       to query the size of free heap space that remains (although it does not
-       provide information on how the remaining heap might be fragmented). */
-       taskDISABLE_INTERRUPTS();
-       for( ;; );
-}
-/*-----------------------------------------------------------*/
-
-void vApplicationIdleHook( void )
-{
-       /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set
-       to 1 in FreeRTOSConfig.h.  It will be called on each iteration of the idle
-       task.  It is essential that code added to this hook function never attempts
-       to block in any way (for example, call xQueueReceive() with a block time
-       specified, or call vTaskDelay()).  If the application makes use of the
-       vTaskDelete() API function (as this demo application does) then it is also
-       important that vApplicationIdleHook() is permitted to return to its calling
-       function, because it is the responsibility of the idle task to clean up
-       memory allocated by the kernel to any task that has since been deleted. */
-}
-/*-----------------------------------------------------------*/
-
-void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
-{
-       ( void ) pcTaskName;
-       ( void ) pxTask;
-
-       /* Run time stack overflow checking is performed if
-       configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook
-       function is called if a stack overflow is detected. */
-       taskDISABLE_INTERRUPTS();
-       for( ;; );
-}
-/*-----------------------------------------------------------*/
-
-void *malloc( size_t xSize )
-{
-       /* There should not be a heap defined, so trap any attempts to call
-       malloc. */
-       taskDISABLE_INTERRUPTS();
-       for( ;; );
-}
-/*-----------------------------------------------------------*/
-
-/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an
-implementation of vApplicationGetIdleTaskMemory() to provide the memory that is
-used by the Idle task. */
-void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
-{
-/* If the buffers to be provided to the Idle task are declared inside this
-function then they must be declared static - otherwise they will be allocated on
-the stack and so not exists after this function exits. */
-static StaticTask_t xIdleTaskTCB;
-static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];
-
-    /* Pass out a pointer to the StaticTask_t structure in which the Idle task's
-    state will be stored. */
-    *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;
-
-    /* Pass out the array that will be used as the Idle task's stack. */
-    *ppxIdleTaskStackBuffer = uxIdleTaskStack;
-
-    /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.
-    Note that, as the array is necessarily of type StackType_t,
-    configMINIMAL_STACK_SIZE is specified in words, not bytes. */
-    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
-}
-/*-----------------------------------------------------------*/
-
-/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the
-application must provide an implementation of vApplicationGetTimerTaskMemory()
-to provide the memory that is used by the Timer service task. */
-void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )
-{
-/* If the buffers to be provided to the Timer task are declared inside this
-function then they must be declared static - otherwise they will be allocated on
-the stack and so not exists after this function exits. */
-static StaticTask_t xTimerTaskTCB;
-static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];
-
-    /* Pass out a pointer to the StaticTask_t structure in which the Timer
-    task's state will be stored. */
-    *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;
-
-    /* Pass out the array that will be used as the Timer task's stack. */
-    *ppxTimerTaskStackBuffer = uxTimerTaskStack;
-
-    /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.
-    Note that, as the array is necessarily of type StackType_t,
-    configMINIMAL_STACK_SIZE is specified in words, not bytes. */
-    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
-}
-/*-----------------------------------------------------------*/
-
-/* Catch asserts so the file and line number of the assert can be viewed. */
-void vMainAssertCalled( const char *pcFileName, uint32_t ulLineNumber )
-{
-    taskENTER_CRITICAL();
-    for( ;; )
-    {
-        /* Use the variables to prevent compiler warnings and in an attempt to
-        ensure they can be viewed in the debugger.  If the variables get
-        optimised away then set copy their values to file scope or globals then
-        view the variables they are copied to. */
-        ( void ) pcFileName;
-        ( void ) ulLineNumber;
-    }
-}
-/*-----------------------------------------------------------*/
-
-/* To enable the libraries to build. */
-void PowerCC32XX_enterLPDS( void *driverlibFunc )
-{
-    ( void ) driverlibFunc;
-
-    /* This function is not implemented so trap any calls to it by halting
-    here. */
-    configASSERT( driverlibFunc == NULL  );
-}
+/*\r
+ * FreeRTOS Kernel V10.0.0\r
+ * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software. If you wish to use our Amazon\r
+ * FreeRTOS name, please do so in a fair use way that does not cause confusion.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+/******************************************************************************\r
+ * This project provides two demo applications.  A simple blinky style project,\r
+ * and a more comprehensive test and demo application.  The\r
+ * configCREATE_SIMPLE_TICKLESS_DEMO setting (defined in FreeRTOSConfig.h) is\r
+ * used to select between the two.  The simply blinky demo is implemented and\r
+ * described in main_blinky.c.  The more comprehensive test and demo application\r
+ * is implemented and described in main_full.c.\r
+ *\r
+ * The blinky demo uses FreeRTOS's tickless idle mode to reduce power\r
+ * consumption.  See the notes on the web page below regarding the difference\r
+ * in power saving that can be achieved between using the generic tickless\r
+ * implementation (as used by the blinky demo) and a tickless implementation\r
+ * that is tailored specifically to the CC3220.\r
+ *\r
+ * This file implements the code that is not demo specific.\r
+ *\r
+ * See http://www.FreeRTOS.org/TI_CC3220_SimpleLink_FreeRTOS_Demo.html for\r
+ * instructions.\r
+ *\r
+ */\r
+\r
+/* Standard includes. */\r
+#include <stdio.h>\r
+\r
+/* TI includes. */\r
+#include <ti/drivers/GPIO.h>\r
+#include <ti/boards/CC3220SF_LAUNCHXL/Board.h>\r
+\r
+/* Kernel includes. */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * Set up the hardware ready to run this demo.\r
+ */\r
+static void prvSetupHardware( void );\r
+\r
+/*\r
+ * main_blinky() is used when configCREATE_SIMPLE_TICKLESS_DEMO is set to 1.\r
+ * main_full() is used when configCREATE_SIMPLE_TICKLESS_DEMO is set to 0.\r
+ */\r
+extern void main_blinky( void );\r
+extern void main_full( void );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+int main( void )\r
+{\r
+       /* See http://www.FreeRTOS.org/TI_CC3220_SimpleLink_FreeRTOS_Demo.html for\r
+    instructions. */\r
+\r
+\r
+       /* Prepare the hardware to run this demo. */\r
+       prvSetupHardware();\r
+\r
+       /* The configCREATE_SIMPLE_TICKLESS_DEMO setting is described at the top\r
+       of this file. */\r
+       #if( configCREATE_SIMPLE_TICKLESS_DEMO == 1 )\r
+       {\r
+               main_blinky();\r
+       }\r
+       #else\r
+       {\r
+               main_full();\r
+       }\r
+       #endif\r
+\r
+       return 0;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvSetupHardware( void )\r
+{\r
+    /* Call board init functions */\r
+    Board_initGeneral();\r
+    Board_initGPIO();\r
+    GPIO_write( Board_LED0, Board_GPIO_LED_OFF );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vMainToggleLED( void )\r
+{\r
+static uint32_t ulLEDState = Board_GPIO_LED_OFF;\r
+\r
+    ulLEDState = !ulLEDState;\r
+    GPIO_write( Board_LED0, ulLEDState );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationMallocFailedHook( void )\r
+{\r
+       /* vApplicationMallocFailedHook() will only be called if\r
+       configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h.  It is a hook\r
+       function that will get called if a call to pvPortMalloc() fails.\r
+       pvPortMalloc() is called internally by the kernel whenever a task, queue,\r
+       timer or semaphore is created.  It is also called by various parts of the\r
+       demo application.  If heap_1.c or heap_2.c are used, then the size of the\r
+       heap available to pvPortMalloc() is defined by configTOTAL_HEAP_SIZE in\r
+       FreeRTOSConfig.h, and the xPortGetFreeHeapSize() API function can be used\r
+       to query the size of free heap space that remains (although it does not\r
+       provide information on how the remaining heap might be fragmented). */\r
+       taskDISABLE_INTERRUPTS();\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationIdleHook( void )\r
+{\r
+       /* vApplicationIdleHook() will only be called if configUSE_IDLE_HOOK is set\r
+       to 1 in FreeRTOSConfig.h.  It will be called on each iteration of the idle\r
+       task.  It is essential that code added to this hook function never attempts\r
+       to block in any way (for example, call xQueueReceive() with a block time\r
+       specified, or call vTaskDelay()).  If the application makes use of the\r
+       vTaskDelete() API function (as this demo application does) then it is also\r
+       important that vApplicationIdleHook() is permitted to return to its calling\r
+       function, because it is the responsibility of the idle task to clean up\r
+       memory allocated by the kernel to any task that has since been deleted. */\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )\r
+{\r
+       ( void ) pcTaskName;\r
+       ( void ) pxTask;\r
+\r
+       /* Run time stack overflow checking is performed if\r
+       configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook\r
+       function is called if a stack overflow is detected. */\r
+       taskDISABLE_INTERRUPTS();\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void *malloc( size_t xSize )\r
+{\r
+       /* There should not be a heap defined, so trap any attempts to call\r
+       malloc. */\r
+       taskDISABLE_INTERRUPTS();\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an\r
+implementation of vApplicationGetIdleTaskMemory() to provide the memory that is\r
+used by the Idle task. */\r
+void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )\r
+{\r
+/* If the buffers to be provided to the Idle task are declared inside this\r
+function then they must be declared static - otherwise they will be allocated on\r
+the stack and so not exists after this function exits. */\r
+static StaticTask_t xIdleTaskTCB;\r
+static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];\r
+\r
+    /* Pass out a pointer to the StaticTask_t structure in which the Idle task's\r
+    state will be stored. */\r
+    *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;\r
+\r
+    /* Pass out the array that will be used as the Idle task's stack. */\r
+    *ppxIdleTaskStackBuffer = uxIdleTaskStack;\r
+\r
+    /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.\r
+    Note that, as the array is necessarily of type StackType_t,\r
+    configMINIMAL_STACK_SIZE is specified in words, not bytes. */\r
+    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the\r
+application must provide an implementation of vApplicationGetTimerTaskMemory()\r
+to provide the memory that is used by the Timer service task. */\r
+void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )\r
+{\r
+/* If the buffers to be provided to the Timer task are declared inside this\r
+function then they must be declared static - otherwise they will be allocated on\r
+the stack and so not exists after this function exits. */\r
+static StaticTask_t xTimerTaskTCB;\r
+static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];\r
+\r
+    /* Pass out a pointer to the StaticTask_t structure in which the Timer\r
+    task's state will be stored. */\r
+    *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;\r
+\r
+    /* Pass out the array that will be used as the Timer task's stack. */\r
+    *ppxTimerTaskStackBuffer = uxTimerTaskStack;\r
+\r
+    /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.\r
+    Note that, as the array is necessarily of type StackType_t,\r
+    configMINIMAL_STACK_SIZE is specified in words, not bytes. */\r
+    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/* Catch asserts so the file and line number of the assert can be viewed. */\r
+void vMainAssertCalled( const char *pcFileName, uint32_t ulLineNumber )\r
+{\r
+volatile BaseType_t xSetToNonZeroToStepOutOfLoop = 0;\r
+\r
+    taskENTER_CRITICAL();\r
+    while( xSetToNonZeroToStepOutOfLoop == 0 )\r
+    {\r
+        /* Use the variables to prevent compiler warnings and in an attempt to\r
+        ensure they can be viewed in the debugger.  If the variables get\r
+        optimised away then set copy their values to file scope or globals then\r
+        view the variables they are copied to. */\r
+        ( void ) pcFileName;\r
+        ( void ) ulLineNumber;\r
+    }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/* To enable the libraries to build. */\r
+void PowerCC32XX_enterLPDS( void *driverlibFunc )\r
+{\r
+    ( void ) driverlibFunc;\r
+\r
+    /* This function is not implemented so trap any calls to it by halting\r
+    here. */\r
+    configASSERT( driverlibFunc == NULL  );\r
+}\r