URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/rtos/freertos-6.1.1/Demo/dsPIC_MPLAB
- from Rev 591 to Rev 592
- ↔ Reverse comparison
Rev 591 → Rev 592
/serial/serial.c
0,0 → 1,252
/* |
FreeRTOS V6.1.1 - Copyright (C) 2011 Real Time Engineers Ltd. |
|
*************************************************************************** |
* * |
* If you are: * |
* * |
* + New to FreeRTOS, * |
* + Wanting to learn FreeRTOS or multitasking in general quickly * |
* + Looking for basic training, * |
* + Wanting to improve your FreeRTOS skills and productivity * |
* * |
* then take a look at the FreeRTOS books - available as PDF or paperback * |
* * |
* "Using the FreeRTOS Real Time Kernel - a Practical Guide" * |
* http://www.FreeRTOS.org/Documentation * |
* * |
* A pdf reference manual is also available. Both are usually delivered * |
* to your inbox within 20 minutes to two hours when purchased between 8am * |
* and 8pm GMT (although please allow up to 24 hours in case of * |
* exceptional circumstances). Thank you for your support! * |
* * |
*************************************************************************** |
|
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 exception 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. See the GNU General Public License for |
more details. You should have received a copy of the GNU General Public |
License and the FreeRTOS license exception along with FreeRTOS; if not it |
can be viewed here: http://www.freertos.org/a00114.html and also obtained |
by writing to Richard Barry, contact details for whom are available on the |
FreeRTOS WEB site. |
|
1 tab == 4 spaces! |
|
http://www.FreeRTOS.org - Documentation, latest information, license and |
contact details. |
|
http://www.SafeRTOS.com - A version that is certified for use in safety |
critical systems. |
|
http://www.OpenRTOS.com - Commercial support, development, porting, |
licensing and training services. |
*/ |
|
|
/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER. |
|
NOTE: This driver is primarily to test the scheduler functionality. It does |
not effectively use the buffers or DMA and is therefore not intended to be |
an example of an efficient driver. */ |
|
/* Standard include file. */ |
#include <stdlib.h> |
|
/* Scheduler include files. */ |
#include "FreeRTOS.h" |
#include "queue.h" |
#include "task.h" |
|
/* Demo app include files. */ |
#include "serial.h" |
|
/* Hardware setup. */ |
#define serOUTPUT 0 |
#define serINPUT 1 |
#define serLOW_SPEED 0 |
#define serONE_STOP_BIT 0 |
#define serEIGHT_DATA_BITS_NO_PARITY 0 |
#define serNORMAL_IDLE_STATE 0 |
#define serAUTO_BAUD_OFF 0 |
#define serLOOPBACK_OFF 0 |
#define serWAKE_UP_DISABLE 0 |
#define serNO_HARDWARE_FLOW_CONTROL 0 |
#define serSTANDARD_IO 0 |
#define serNO_IRDA 0 |
#define serCONTINUE_IN_IDLE_MODE 0 |
#define serUART_ENABLED 1 |
#define serINTERRUPT_ON_SINGLE_CHAR 0 |
#define serTX_ENABLE 1 |
#define serINTERRUPT_ENABLE 1 |
#define serINTERRUPT_DISABLE 0 |
#define serCLEAR_FLAG 0 |
#define serSET_FLAG 1 |
|
|
/* The queues used to communicate between tasks and ISR's. */ |
static xQueueHandle xRxedChars; |
static xQueueHandle xCharsForTx; |
|
static portBASE_TYPE xTxHasEnded; |
/*-----------------------------------------------------------*/ |
|
xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength ) |
{ |
char cChar; |
|
/* Create the queues used by the com test task. */ |
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) ); |
xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed char ) ); |
|
/* Setup the UART. */ |
U2MODEbits.BRGH = serLOW_SPEED; |
U2MODEbits.STSEL = serONE_STOP_BIT; |
U2MODEbits.PDSEL = serEIGHT_DATA_BITS_NO_PARITY; |
U2MODEbits.ABAUD = serAUTO_BAUD_OFF; |
U2MODEbits.LPBACK = serLOOPBACK_OFF; |
U2MODEbits.WAKE = serWAKE_UP_DISABLE; |
U2MODEbits.UEN = serNO_HARDWARE_FLOW_CONTROL; |
U2MODEbits.IREN = serNO_IRDA; |
U2MODEbits.USIDL = serCONTINUE_IN_IDLE_MODE; |
U2MODEbits.UARTEN = serUART_ENABLED; |
|
U2BRG = (unsigned short)(( (float)configCPU_CLOCK_HZ / ( (float)16 * (float)ulWantedBaud ) ) - (float)0.5); |
|
U2STAbits.URXISEL = serINTERRUPT_ON_SINGLE_CHAR; |
U2STAbits.UTXEN = serTX_ENABLE; |
U2STAbits.UTXINV = serNORMAL_IDLE_STATE; |
U2STAbits.UTXISEL0 = serINTERRUPT_ON_SINGLE_CHAR; |
U2STAbits.UTXISEL1 = serINTERRUPT_ON_SINGLE_CHAR; |
|
/* It is assumed that this function is called prior to the scheduler being |
started. Therefore interrupts must not be allowed to occur yet as they |
may attempt to perform a context switch. */ |
portDISABLE_INTERRUPTS(); |
|
IFS1bits.U2RXIF = serCLEAR_FLAG; |
IFS1bits.U2TXIF = serCLEAR_FLAG; |
IPC7bits.U2RXIP = configKERNEL_INTERRUPT_PRIORITY; |
IPC7bits.U2TXIP = configKERNEL_INTERRUPT_PRIORITY; |
IEC1bits.U2TXIE = serINTERRUPT_ENABLE; |
IEC1bits.U2RXIE = serINTERRUPT_ENABLE; |
|
/* Clear the Rx buffer. */ |
while( U2STAbits.URXDA == serSET_FLAG ) |
{ |
cChar = U2RXREG; |
} |
|
xTxHasEnded = pdTRUE; |
|
return NULL; |
} |
/*-----------------------------------------------------------*/ |
|
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime ) |
{ |
/* Only one port is supported. */ |
( void ) pxPort; |
|
/* Get the next character from the buffer. Return false if no characters |
are available or arrive before xBlockTime expires. */ |
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) ) |
{ |
return pdTRUE; |
} |
else |
{ |
return pdFALSE; |
} |
} |
/*-----------------------------------------------------------*/ |
|
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime ) |
{ |
/* Only one port is supported. */ |
( void ) pxPort; |
|
/* Return false if after the block time there is no room on the Tx queue. */ |
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS ) |
{ |
return pdFAIL; |
} |
|
/* A critical section should not be required as xTxHasEnded will not be |
written to by the ISR if it is already 0 (is this correct?). */ |
if( xTxHasEnded ) |
{ |
xTxHasEnded = pdFALSE; |
IFS1bits.U2TXIF = serSET_FLAG; |
} |
|
return pdPASS; |
} |
/*-----------------------------------------------------------*/ |
|
void vSerialClose( xComPortHandle xPort ) |
{ |
} |
/*-----------------------------------------------------------*/ |
|
void __attribute__((__interrupt__, auto_psv)) _U2RXInterrupt( void ) |
{ |
char cChar; |
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; |
|
/* Get the character and post it on the queue of Rxed characters. |
If the post causes a task to wake force a context switch as the woken task |
may have a higher priority than the task we have interrupted. */ |
IFS1bits.U2RXIF = serCLEAR_FLAG; |
while( U2STAbits.URXDA ) |
{ |
cChar = U2RXREG; |
xQueueSendFromISR( xRxedChars, &cChar, &xHigherPriorityTaskWoken ); |
} |
|
if( xHigherPriorityTaskWoken != pdFALSE ) |
{ |
taskYIELD(); |
} |
} |
/*-----------------------------------------------------------*/ |
|
void __attribute__((__interrupt__, auto_psv)) _U2TXInterrupt( void ) |
{ |
signed char cChar; |
portBASE_TYPE xTaskWoken = pdFALSE; |
|
/* If the transmit buffer is full we cannot get the next character. |
Another interrupt will occur the next time there is space so this does |
not matter. */ |
IFS1bits.U2TXIF = serCLEAR_FLAG; |
while( !( U2STAbits.UTXBF ) ) |
{ |
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWoken ) == pdTRUE ) |
{ |
/* Send the next character queued for Tx. */ |
U2TXREG = cChar; |
} |
else |
{ |
/* Queue empty, nothing to send. */ |
xTxHasEnded = pdTRUE; |
break; |
} |
} |
|
if( xTaskWoken != pdFALSE ) |
{ |
taskYIELD(); |
} |
} |
|
|
/timertest.c
0,0 → 1,162
/* |
FreeRTOS V6.1.1 - Copyright (C) 2011 Real Time Engineers Ltd. |
|
*************************************************************************** |
* * |
* If you are: * |
* * |
* + New to FreeRTOS, * |
* + Wanting to learn FreeRTOS or multitasking in general quickly * |
* + Looking for basic training, * |
* + Wanting to improve your FreeRTOS skills and productivity * |
* * |
* then take a look at the FreeRTOS books - available as PDF or paperback * |
* * |
* "Using the FreeRTOS Real Time Kernel - a Practical Guide" * |
* http://www.FreeRTOS.org/Documentation * |
* * |
* A pdf reference manual is also available. Both are usually delivered * |
* to your inbox within 20 minutes to two hours when purchased between 8am * |
* and 8pm GMT (although please allow up to 24 hours in case of * |
* exceptional circumstances). Thank you for your support! * |
* * |
*************************************************************************** |
|
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 exception 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. See the GNU General Public License for |
more details. You should have received a copy of the GNU General Public |
License and the FreeRTOS license exception along with FreeRTOS; if not it |
can be viewed here: http://www.freertos.org/a00114.html and also obtained |
by writing to Richard Barry, contact details for whom are available on the |
FreeRTOS WEB site. |
|
1 tab == 4 spaces! |
|
http://www.FreeRTOS.org - Documentation, latest information, license and |
contact details. |
|
http://www.SafeRTOS.com - A version that is certified for use in safety |
critical systems. |
|
http://www.OpenRTOS.com - Commercial support, development, porting, |
licensing and training services. |
*/ |
|
/* High speed timer test as described in main.c. */ |
|
|
/* Scheduler includes. */ |
#include "FreeRTOS.h" |
|
/* Demo includes. */ |
#include "partest.h" |
|
/* The number of interrupts to pass before we start looking at the jitter. */ |
#define timerSETTLE_TIME 5 |
|
/* The maximum value the 16bit timer can contain. */ |
#define timerMAX_COUNT 0xffff |
|
/*-----------------------------------------------------------*/ |
|
/* |
* Measure the time between this interrupt and the previous interrupt to |
* calculate the timing jitter. Remember the maximum value the jitter has |
* ever been calculated to be. |
*/ |
static void prvCalculateAndStoreJitter( void ); |
|
/*-----------------------------------------------------------*/ |
|
/* The maximum time (in processor clocks) between two consecutive timer |
interrupts so far. */ |
unsigned portSHORT usMaxJitter = 0; |
|
/*-----------------------------------------------------------*/ |
|
void vSetupTimerTest( unsigned portSHORT usFrequencyHz ) |
{ |
/* T2 is used to generate interrupts. T4 is used to provide an accurate |
time measurement. */ |
T2CON = 0; |
T4CON = 0; |
TMR2 = 0; |
TMR4 = 0; |
|
/* Timer 2 is going to interrupt at usFrequencyHz Hz. */ |
PR2 = ( unsigned portSHORT ) ( configCPU_CLOCK_HZ / ( unsigned portLONG ) usFrequencyHz ); |
|
/* Timer 4 is going to free run from minimum to maximum value. */ |
PR4 = ( unsigned portSHORT ) timerMAX_COUNT; |
|
/* Setup timer 2 interrupt priority to be above the kernel priority so |
the timer jitter is not effected by the kernel activity. */ |
IPC1bits.T2IP = configKERNEL_INTERRUPT_PRIORITY + 1; |
|
/* Clear the interrupt as a starting condition. */ |
IFS0bits.T2IF = 0; |
|
/* Enable the interrupt. */ |
IEC0bits.T2IE = 1; |
|
/* Start both timers. */ |
T2CONbits.TON = 1; |
T4CONbits.TON = 1; |
} |
/*-----------------------------------------------------------*/ |
|
static void prvCalculateAndStoreJitter( void ) |
{ |
static unsigned portSHORT usLastCount = 0, usSettleCount = 0; |
unsigned portSHORT usThisCount, usDifference; |
|
/* Capture the timer value as we enter the interrupt. */ |
usThisCount = TMR4; |
|
if( usSettleCount >= timerSETTLE_TIME ) |
{ |
/* What is the difference between the timer value in this interrupt |
and the value from the last interrupt. */ |
usDifference = usThisCount - usLastCount; |
|
/* Store the difference in the timer values if it is larger than the |
currently stored largest value. The difference over and above the |
expected difference will give the 'jitter' in the processing of these |
interrupts. */ |
if( usDifference > usMaxJitter ) |
{ |
usMaxJitter = usDifference; |
} |
} |
else |
{ |
/* Don't bother storing any values for the first couple of |
interrupts. */ |
usSettleCount++; |
} |
|
/* Remember what the timer value was this time through, so we can calculate |
the difference the next time through. */ |
usLastCount = usThisCount; |
} |
/*-----------------------------------------------------------*/ |
|
void __attribute__((__interrupt__, auto_psv)) _T2Interrupt( void ) |
{ |
/* Work out the time between this and the previous interrupt. */ |
prvCalculateAndStoreJitter(); |
|
/* Clear the timer interrupt. */ |
IFS0bits.T2IF = 0; |
} |
|
|
/timertest.h
0,0 → 1,63
/* |
FreeRTOS V6.1.1 - Copyright (C) 2011 Real Time Engineers Ltd. |
|
*************************************************************************** |
* * |
* If you are: * |
* * |
* + New to FreeRTOS, * |
* + Wanting to learn FreeRTOS or multitasking in general quickly * |
* + Looking for basic training, * |
* + Wanting to improve your FreeRTOS skills and productivity * |
* * |
* then take a look at the FreeRTOS books - available as PDF or paperback * |
* * |
* "Using the FreeRTOS Real Time Kernel - a Practical Guide" * |
* http://www.FreeRTOS.org/Documentation * |
* * |
* A pdf reference manual is also available. Both are usually delivered * |
* to your inbox within 20 minutes to two hours when purchased between 8am * |
* and 8pm GMT (although please allow up to 24 hours in case of * |
* exceptional circumstances). Thank you for your support! * |
* * |
*************************************************************************** |
|
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 exception 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. See the GNU General Public License for |
more details. You should have received a copy of the GNU General Public |
License and the FreeRTOS license exception along with FreeRTOS; if not it |
can be viewed here: http://www.freertos.org/a00114.html and also obtained |
by writing to Richard Barry, contact details for whom are available on the |
FreeRTOS WEB site. |
|
1 tab == 4 spaces! |
|
http://www.FreeRTOS.org - Documentation, latest information, license and |
contact details. |
|
http://www.SafeRTOS.com - A version that is certified for use in safety |
critical systems. |
|
http://www.OpenRTOS.com - Commercial support, development, porting, |
licensing and training services. |
*/ |
|
#ifndef TIMER_TEST_H |
#define TIMER_TEST_H |
|
/* Setup the high frequency timer interrupt. */ |
void vSetupTimerTest( unsigned short usFrequencyHz ); |
|
#endif /* TIMER_TEST_H */ |
|
|
|