From e018ceebed74b8223482bc9d1ed0b31c938381da Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Mon, 29 Oct 2012 23:04:19 +0200 Subject: New example files --- boards/ek-lm4f120xl/freertos_demo/switch_task.c | 175 ++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 boards/ek-lm4f120xl/freertos_demo/switch_task.c (limited to 'boards/ek-lm4f120xl/freertos_demo/switch_task.c') diff --git a/boards/ek-lm4f120xl/freertos_demo/switch_task.c b/boards/ek-lm4f120xl/freertos_demo/switch_task.c new file mode 100644 index 0000000..3665af4 --- /dev/null +++ b/boards/ek-lm4f120xl/freertos_demo/switch_task.c @@ -0,0 +1,175 @@ +//***************************************************************************** +// +// switch_task.c - A simple switch task to process the buttons. +// +// Copyright (c) 2012 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 9453 of the EK-LM4F120XL Firmware Package. +// +//***************************************************************************** + +#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 ulLastTime; + unsigned long ulSwitchDelay = 25; + unsigned char ucCurButtonState, ucPrevButtonState; + unsigned char ucMessage; + + ucCurButtonState = ucPrevButtonState = 0; + + // + // Get the current tick count. + // + ulLastTime = xTaskGetTickCount(); + + // + // Loop forever. + // + while(1) + { + // + // Poll the debounced state of the buttons. + // + ucCurButtonState = ButtonsPoll(0, 0); + + // + // Check if previous debounced state is equal to the current state. + // + if(ucCurButtonState != ucPrevButtonState) + { + ucPrevButtonState = ucCurButtonState; + + // + // Check to make sure the change in state is due to button press + // and not due to button release. + // + if((ucCurButtonState & ALL_BUTTONS) != 0) + { + if((ucCurButtonState & ALL_BUTTONS) == LEFT_BUTTON) + { + ucMessage = LEFT_BUTTON; + + // + // Guard UART from concurrent access. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Left Button is pressed.\n"); + xSemaphoreGive(g_pUARTSemaphore); + } + else if((ucCurButtonState & ALL_BUTTONS) == RIGHT_BUTTON) + { + ucMessage = 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, &ucMessage, 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(&ulLastTime, ulSwitchDelay / portTICK_RATE_MS); + } +} + +//***************************************************************************** +// +// Initializes the switch task. +// +//***************************************************************************** +unsigned long +SwitchTaskInit(void) +{ + // + // Unlock the GPIO LOCK register for Right button to work. + // + HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD; + 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