/* | |
FreeRTOS V8.2.2 - Copyright (C) 2015 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 is a very simply blinky style example that can be generated | |
* automatically by the Xilinx SDK. | |
* | |
* The example generates a Tx task, an Rx task, and a queue. The Tx task | |
* simply uses the queue to send a value to the Rx task every 500ms. The Rx | |
* prints out a message each time it receives the value. | |
* | |
* The demo does little in the way of hardware configuration. Separate projects | |
* are provided that include comprehensive demos which demonstrate additional | |
* hardware configuration, and additional FreeRTOS features. See the following | |
* link for more details: http://www.freertos.org/a00090.html#XILINX | |
*/ | |
/* FreeRTOS includes. */ | |
#include "FreeRTOS.h" | |
#include "task.h" | |
#include "queue.h" | |
/* Xilinx includes. */ | |
#include "xil_printf.h" | |
#include "xparameters.h" | |
/*-----------------------------------------------------------*/ | |
/* The Tx and Rx tasks as described at the top of this file. */ | |
static void prvTxTask( void *pvParameters ); | |
static void prvRxTask( void *pvParameters ); | |
/*-----------------------------------------------------------*/ | |
/* The queue used by the Tx and Rx tasks, as described at the top of this | |
file. */ | |
static QueueHandle_t xQueue = NULL; | |
int main( void ) | |
{ | |
xil_printf( "Hello from Freertos\r\n" ); | |
/* Create the two tasks. The Tx task is given a lower priority than the | |
Rx task, so the Rx task will leave the Blocked state and pre-empt the Tx | |
task as soon as the Tx task places an item in the queue. */ | |
xTaskCreate( prvTxTask, /* The function that implements the task. */ | |
( const char * ) "Tx", /* Text name for the task, provided to assist debugging only. */ | |
configMINIMAL_STACK_SIZE, /* The stack allocated to the task. */ | |
NULL, /* The task parameter is not used, so set to NULL. */ | |
tskIDLE_PRIORITY, /* The task runs at the idle priority. */ | |
NULL ); | |
xTaskCreate( prvRxTask, ( const char * ) "GB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL ); | |
/* Create the queue used by the tasks. The Rx task has a higher priority | |
than the Tx task, so will preempt the Tx task and remove values from the | |
queue as soon as the Tx task writes to the queue - therefore the queue can | |
never have more than one item in it. */ | |
xQueue = xQueueCreate( 1, /* There is only one space in the queue. */ | |
sizeof( uint32_t ) ); /* Each space in the queue is large enough to hold a uint32_t. */ | |
/* Check the queue was created. */ | |
configASSERT( xQueue ); | |
/* Start the tasks and timer running. */ | |
vTaskStartScheduler(); | |
/* If all is well, the scheduler will now be running, and the following line | |
will never be reached. If the following line does execute, then there was | |
insufficient FreeRTOS heap memory available for the idle and/or timer tasks | |
to be created. See the memory management section on the FreeRTOS web site | |
for more details. */ | |
for( ;; ); | |
} | |
/*-----------------------------------------------------------*/ | |
static void prvTxTask( void *pvParameters ) | |
{ | |
const TickType_t x500ms = pdMS_TO_TICKS( 500UL ); | |
uint32_t ulValueToSend = 0; | |
for( ;; ) | |
{ | |
/* Delay for 500ms. */ | |
vTaskDelay( x500ms ); | |
/* Send the next value on the queue. The queue should always be | |
empty at this point so a block time of 0 is used. */ | |
xQueueSend( xQueue, /* The queue being written to. */ | |
&ulValueToSend, /* The address of the data being sent. */ | |
0UL ); /* The block time. */ | |
} | |
} | |
/*-----------------------------------------------------------*/ | |
static void prvRxTask( void *pvParameters ) | |
{ | |
uint32_t ulValueReceived; | |
for( ;; ) | |
{ | |
/* Block to wait for data arriving on the queue. */ | |
xQueueReceive( xQueue, /* The queue being read. */ | |
&ulValueReceived, /* Data is read into this address. */ | |
portMAX_DELAY ); /* Wait without a timeout for data. */ | |
/* Print the received data. */ | |
xil_printf( "Rx task received %u\r\n", ( unsigned int ) ulValueReceived ); | |
} | |
} | |