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/led_task.c | 235 +++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 boards/ek-lm4f120xl/freertos_demo/led_task.c (limited to 'boards/ek-lm4f120xl/freertos_demo/led_task.c') diff --git a/boards/ek-lm4f120xl/freertos_demo/led_task.c b/boards/ek-lm4f120xl/freertos_demo/led_task.c new file mode 100644 index 0000000..90befb5 --- /dev/null +++ b/boards/ek-lm4f120xl/freertos_demo/led_task.c @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// led_task.c - A simple flashing LED task. +// +// 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 "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "drivers/rgb.h" +#include "drivers/buttons.h" +#include "utils/uartstdio.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 LED toggle task. +// +//***************************************************************************** +#define LEDTASKSTACKSIZE 128 // Stack size in words + +//***************************************************************************** +// +// The item size and queue size for the LED message queue. +// +//***************************************************************************** +#define LED_ITEM_SIZE sizeof(unsigned char) +#define LED_QUEUE_SIZE 5 + +//***************************************************************************** +// +// Default LED toggle delay value. LED toggling frequency is twice this number. +// +//***************************************************************************** +#define LED_TOGGLE_DELAY 250 + +//***************************************************************************** +// +// The queue that holds messages sent to the LED task. +// +//***************************************************************************** +xQueueHandle g_pLEDQueue; + +// +// [G, R, B] range is 0 to 0xFFFF per color. +// +static unsigned long g_ulColors[3] = { 0x0000, 0x0000, 0x0000 }; +static unsigned char g_ucColorsIndx; + +extern xSemaphoreHandle g_pUARTSemaphore; + +//***************************************************************************** +// +// This task toggles the user selected LED at a user selected frequency. User +// can make the selections by pressing the left and right buttons. +// +//***************************************************************************** +static void +LEDTask(void *pvParameters) +{ + portTickType ulWakeTime; + unsigned long ulLEDToggleDelay; + unsigned char cMessage; + + // + // Initialize the LED Toggle Delay to default value. + // + ulLEDToggleDelay = LED_TOGGLE_DELAY; + + // + // Get the current tick count. + // + ulWakeTime = xTaskGetTickCount(); + + // + // Loop forever. + // + while(1) + { + // + // Read the next message, if available on queue. + // + if(xQueueReceive(g_pLEDQueue, &cMessage, 0) == pdPASS) + { + // + // If left button, update to next LED. + // + if(cMessage == LEFT_BUTTON) + { + // + // Update the LED buffer to turn off the currently working. + // + g_ulColors[g_ucColorsIndx] = 0x0000; + + // + // Update the index to next LED + g_ucColorsIndx++; + if(g_ucColorsIndx > 2) + { + g_ucColorsIndx = 0; + } + + // + // Update the LED buffer to turn on the newly selected LED. + // + g_ulColors[g_ucColorsIndx] = 0x8000; + + // + // Configure the new LED settings. + // + RGBColorSet(g_ulColors); + + // + // Guard UART from concurrent access. Print the currently + // blinking LED. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Led %d is blinking. [G, R, B]\n", g_ucColorsIndx); + xSemaphoreGive(g_pUARTSemaphore); + } + + // + // If right button, update delay time between toggles of led. + // + if(cMessage == RIGHT_BUTTON) + { + ulLEDToggleDelay *= 2; + if(ulLEDToggleDelay > 1000) + { + ulLEDToggleDelay = LED_TOGGLE_DELAY / 2; + } + + // + // Guard UART from concurrent access. Print the currently + // blinking frequency. + // + xSemaphoreTake(g_pUARTSemaphore, portMAX_DELAY); + UARTprintf("Led blinking frequency is %d ms.\n", + (ulLEDToggleDelay * 2)); + xSemaphoreGive(g_pUARTSemaphore); + } + } + + // + // Turn on the LED. + // + RGBEnable(); + + // + // Wait for the required amount of time. + // + vTaskDelayUntil(&ulWakeTime, ulLEDToggleDelay / portTICK_RATE_MS); + + // + // Turn off the LED. + // + RGBDisable(); + + // + // Wait for the required amount of time. + // + vTaskDelayUntil(&ulWakeTime, ulLEDToggleDelay / portTICK_RATE_MS); + } +} + +//***************************************************************************** +// +// Initializes the LED task. +// +//***************************************************************************** +unsigned long +LEDTaskInit(void) +{ + // + // Initialize the GPIOs and Timers that drive the three LEDs. + // + RGBInit(1); + RGBIntensitySet(0.3f); + + // + // Turn on the Green LED + // + g_ucColorsIndx = 0; + g_ulColors[g_ucColorsIndx] = 0x8000; + RGBColorSet(g_ulColors); + + // + // Print the current loggling LED and frequency. + // + UARTprintf("\nLed %d is blinking. [G, R, B]\n", g_ucColorsIndx); + UARTprintf("Led blinking frequency is %d ms.\n", (LED_TOGGLE_DELAY * 2)); + + // + // Create a queue for sending messages to the LED task. + // + g_pLEDQueue = xQueueCreate(LED_QUEUE_SIZE, LED_ITEM_SIZE); + + // + // Create the LED task. + // + if(xTaskCreate(LEDTask, (signed portCHAR *)"LED", LEDTASKSTACKSIZE, NULL, + tskIDLE_PRIORITY + PRIORITY_LED_TASK, NULL) != pdTRUE) + { + return(1); + } + + // + // Success. + // + return(0); +} -- cgit v1.3.1