| /* |
| FreeRTOS V8.2.1 - 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 ); |
| } |
| } |
| |
| |