text: /*
   * FreeRTOS Kernel V10.0.1
   * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  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.
   *
   * http://www.FreeRTOS.org
   * http://aws.amazon.com/freertos
   *
   * 1 tab == 4 spaces!
   */
  #include "FreeRTOS.h"
  #include "semphr.h"
  
  #define isrCLEAR_EINT_1 2
  
  /*
   * Interrupt routine that simply wakes vButtonHandlerTask on each interrupt 
   * generated by a push of the built in button.  The wrapper takes care of
   * the ISR entry.  This then calls the actual handler function to perform
   * the work.  This work should not be done in the wrapper itself unless
   * you are absolutely sure that no stack space is used.
   */
  void vButtonISRWrapper( void ) __attribute__ ((naked));
  void vButtonHandler( void ) __attribute__ ((noinline));
  
  void vButtonHandler( void )
  {
  extern SemaphoreHandle_t xButtonSemaphore;
  portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
  
  	xSemaphoreGiveFromISR( xButtonSemaphore, &xHigherPriorityTaskWoken );
  
  	if( xHigherPriorityTaskWoken )
  	{
  		/* We have woken a task.  Calling "yield from ISR" here will ensure
  		the interrupt returns to the woken task if it has a priority higher
  		than the interrupted task. */
  		portYIELD_FROM_ISR();
  	}
  
      EXTINT = isrCLEAR_EINT_1;
      VICVectAddr = 0;
  }
  /*-----------------------------------------------------------*/
  
  void vButtonISRWrapper( void )
  {
  	/* Save the context of the interrupted task. */
  	portSAVE_CONTEXT();
  
  	/* Call the handler to do the work.  This must be a separate function to
  	the wrapper to ensure the correct stack frame is set up. */
  	__asm volatile( "bl vButtonHandler" );
  
  	/* Restore the context of whichever task is going to run once the interrupt
  	completes. */
  	portRESTORE_CONTEXT();
  }
  
  
  
  