From c3e4c9a25c2910d2d66d52215b3406b13d5b23d5 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Sun, 29 Jun 2014 12:34:32 +0300 Subject: Add more board models --- boards/ek-tm4c123gxl/freertos_demo/switch_task.c | 177 +++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 boards/ek-tm4c123gxl/freertos_demo/switch_task.c (limited to 'boards/ek-tm4c123gxl/freertos_demo/switch_task.c') diff --git a/boards/ek-tm4c123gxl/freertos_demo/switch_task.c b/boards/ek-tm4c123gxl/freertos_demo/switch_task.c new file mode 100644 index 0000000..cc90b73 --- /dev/null +++ b/boards/ek-tm4c123gxl/freertos_demo/switch_task.c @@ -0,0 +1,177 @@ +//***************************************************************************** +// +// switch_task.c - A simple switch task to process the buttons. +// +// Copyright (c) 2012-2014 Texas Instruments Incorporated. All rights reserved. +// Software License Agreement +// +// Texas Instruments (TI) is supplying this software for use solely and +// exclusively on TI's microcontroller products. The software is owned by +// TI and/or its suppliers, and is protected under applicable copyright +// laws. You may not combine this software with "viral" open-source +// software in order to form a larger program. +// +// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS. +// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT +// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY +// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2.1.0.12573 of the EK-TM4C123GXL Firmware Package. +// +//***************************************************************************** + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "inc/hw_gpio.h" +#include "driverlib/sysctl.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "drivers/buttons.h" +#include "utils/uartstdio.h" +#include "switch_task.h" +#include "led_task.h" +#include "priorities.h" +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +//***************************************************************************** +// +// The stack size for the display task. +// +//***************************************************************************** +#define SWITCHTASKSTACKSIZE 128 // Stack size in words + +extern xQueueHandle g_pLEDQueue; +extern xSemaphoreHandle g_pUARTSemaphore; + +//***************************************************************************** +// +// This task reads the buttons' state and passes this information to LEDTask. +// +//***************************************************************************** +static void +SwitchTask(void *pvParameters) +{ + portTickType ui16LastTime; + uint32_t ui32SwitchDelay = 25; + uint8_t ui8CurButtonState, ui8PrevButtonState; + uint8_t ui8Message; + + ui8CurButtonState = ui8PrevButtonState = 0; + + // + // Get the current tick count. + // + ui16LastTime = xTaskGetTickCount(); + + // + // Loop forever. + // + while(1) + { + // + // Poll the debounced state of the buttons. + // + ui8CurButtonState = ButtonsPoll(0, 0); + + // + // Check if previous debounced state is equal to the current state. + // + if(ui8CurButtonState != ui8PrevButtonState) + { + ui8PrevButtonState = ui8CurButtonState; + + // + // Check to make sure the change in state is due to button press + // and not due to button release. + // + if((ui8CurButtonState & ALL_BUTTONS) != 0) + { + if((ui8CurButtonState & ALL_BUTTONS) == LEFT_BUTTON) + { + ui8Message = LEFT_BUTTON; + + // + // Guard UART from concurrent access. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Left Button is pressed.\n"); + xSemaphoreGive(g_pUARTSemaphore); + } + else if((ui8CurButtonState & ALL_BUTTONS) == RIGHT_BUTTON) + { + ui8Message = RIGHT_BUTTON; + + // + // Guard UART from concurrent access. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Right Button is pressed.\n"); + xSemaphoreGive(g_pUARTSemaphore); + } + + // + // Pass the value of the button pressed to LEDTask. + // + if(xQueueSend(g_pLEDQueue, &ui8Message, portMAX_DELAY) != + pdPASS) + { + // + // Error. The queue should never be full. If so print the + // error message on UART and wait for ever. + // + UARTprintf("\nQueue full. This should never happen.\n"); + while(1) + { + } + } + } + } + + // + // Wait for the required amount of time to check back. + // + vTaskDelayUntil(&ui16LastTime, ui32SwitchDelay / portTICK_RATE_MS); + } +} + +//***************************************************************************** +// +// Initializes the switch task. +// +//***************************************************************************** +uint32_t +SwitchTaskInit(void) +{ + // + // Unlock the GPIO LOCK register for Right button to work. + // + HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; + HWREG(GPIO_PORTF_BASE + GPIO_O_CR) = 0xFF; + + // + // Initialize the buttons + // + ButtonsInit(); + + // + // Create the switch task. + // + if(xTaskCreate(SwitchTask, (signed portCHAR *)"Switch", + SWITCHTASKSTACKSIZE, NULL, tskIDLE_PRIORITY + + PRIORITY_SWITCH_TASK, NULL) != pdTRUE) + { + return(1); + } + + // + // Success. + // + return(0); +} -- cgit v1.3.1