OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Demo/] [MB91460_Softune/] [SRC/] [utility/] [taskutility.c] - Rev 584

Compare with Previous | Blame | View Log

/* THIS SAMPLE CODE IS PROVIDED AS IS AND IS SUBJECT TO ALTERATIONS. FUJITSU */
/* MICROELECTRONICS ACCEPTS NO RESPONSIBILITY OR LIABILITY FOR ANY ERRORS OR */
/* ELIGIBILITY FOR ANY PURPOSES.											 */
/*				 (C) Fujitsu Microelectronics Europe GmbH					 */
/*------------------------------------------------------------------------
  taskutility.C
  - 
-------------------------------------------------------------------------*/
#include "mb91467d.h"
#include "vectors.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
 
static void vUART5Task( void *pvParameters );
 
const char			ASCII[] = "0123456789ABCDEF";
 
void				vInitUart5( void );
 
 
static xQueueHandle xQueue;
 
void vInitUart5( void )
{
	//Initialize UART asynchronous mode
	BGR05 = 1666;	//  9600 Baud @ 16MHz
	SCR05 = 0x17;	// 7N2
	SMR05 = 0x0d;	// enable SOT3, Reset, normal mode
	SSR05 = 0x00;	// LSB first
	PFR19_D4 = 1;	// enable UART
	PFR19_D5 = 1;	// enable UART
 
	//EPFR19 = 0x00;   // enable UART
	SSR05_RIE = 1;
}
 
void Putch5( char ch )	/* sends a char */
{
	while( SSR05_TDRE == 0 );
 
	/* wait for transmit buffer empty */
	TDR05 = ch; /* put ch into buffer */
}
 
char Getch5( void ) /* waits for and returns incomming char */
{
	volatile unsigned	ch;
 
	while( SSR05_RDRF == 0 );
 
	/* wait for data received */
	if( SSR05_ORE )			/* overrun error */
	{
		ch = RDR05;			/* reset error flags */
		return ( char ) ( -1 );
	}
	else
	{
		return( RDR05 );	/* return char */
	}
}
 
void Puts5( const char *Name5 ) /* Puts a String to UART */
{
	volatile portSHORT	i, len;
	len = strlen( Name5 );
 
	for( i = 0; i < len; i++ )	/* go through string */
	{
		if( Name5[i] == 10 )
		{
			Putch5( 13 );
		}
 
		Putch5( Name5[i] );					/* send it out */
	}
}
 
void Puthex5( unsigned long n, unsigned char digits )
{
	unsigned portCHAR	digit = 0, div = 0, i;
 
	div = ( 4 * (digits - 1) );				/* init shift divisor */
	for( i = 0; i < digits; i++ )
	{
		digit = ( (n >> div) & 0xF );		/* get hex-digit value */
		Putch5( digit + ((digit < 0xA) ? '0' : 'A' - 0xA) );
		div -= 4;		/* next digit shift */
	}
}
 
void Putdec5( unsigned long x, int digits )
{
	portSHORT	i;
	portCHAR	buf[10], sign = 1;
 
	if( digits < 0 )
	{					/* should be print of zero? */
		digits *= ( -1 );
		sign = 1;
	}
 
	buf[digits] = '\0'; /* end sign of string */
 
	for( i = digits; i > 0; i-- )
	{
		buf[i - 1] = ASCII[x % 10];
		x = x / 10;
	}
 
	if( sign )
	{
		for( i = 0; buf[i] == '0'; i++ )
		{				/* no print of zero */
			if( i < digits - 1 )
			{
				buf[i] = ' ';
			}
		}
	}
 
	Puts5( buf );		/* send string */
}
 
void vUtilityStartTraceTask( unsigned portBASE_TYPE uxPriority )
{
	xQueue = xQueueCreate( 5, sizeof( char ) );
 
	if( xQueue != NULL )
	{
		portENTER_CRITICAL();
		vInitUart5();
		portENTER_CRITICAL();
 
		xTaskCreate( vUART5Task, (signed portCHAR *) "UART5", configMINIMAL_STACK_SIZE * 2, ( void * ) NULL, uxPriority, NULL );
	}
}
 
static void vUART5Task( void *pvParameters )
{
	static portCHAR	buff[ 900 ] = { 0 };
	unsigned portLONG	trace_len, j;
 
	unsigned portCHAR	ch;
 
	SSR05_RIE = 1;
	Puts5( "\n -------------MB91467D FreeRTOS DEMO Task List and Trace Utility----------- \n" );
 
	for( ;; )
	{
		Puts5( "\n\rPress any of the following keys for the corresponding functionality: " );
 
		Puts5( "\n\r1: To call vTaskList() and display current task status " );
 
		Puts5( "\n\r2: To call vTaskStartTrace() and to display trace results once the trace ends" );
 
		/* Block on the semaphore.  The UART interrupt will use the semaphore to
		wake this task when required. */
		xQueueReceive( xQueue, &ch, portMAX_DELAY );
 
		switch( ch )
		{
			case '1':
				vTaskList( (signed char *) buff );
				Puts5( "\n\rThe current task list is as follows...." );
				Puts5( "\n\r----------------------------------------------" );
				Puts5( "\n\rName		  State  Priority  Stack   Number" );
				Puts5( "\n\r----------------------------------------------" );
				Puts5( buff );
				Puts5( "\r----------------------------------------------" );
				break;
 
			case '2':
				vTaskStartTrace( (signed char *) buff, sizeof( buff ) );
				Puts5( "\n\rThe trace started!!" );
				vTaskDelay( (portTickType) 450 );
				trace_len = ulTaskEndTrace();
				Puts5( "\n\rThe trace ended!!" );
				Puts5( "\n\rThe trace is as follows...." );
				Puts5( "\n\r--------------------------------------------------------" );
				Puts5( "\n\r  Tick	 | Task Number  |	 Tick	 | Task Number  |" );
				Puts5( "\n\r--------------------------------------------------------\n\r" );
				for( j = 0; j < trace_len; j++ )
				{
					Puthex5( buff[j], 2 );
					if( j % 4 == 3 )
					{
						Puts5( "   |   " );
					}
 
					if( j % 16 == 15 )
					{
						Puts5( "\n" );
					}
				}
 
				Puts5( "\r--------------------------------------------------------" );
				break;
 
			default:
				break;
		}
 
		Puts5( "\n" );
	}
}
 
__interrupt void UART5_RxISR( void )
{
unsigned portCHAR ch;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
 
	ch = RDR05;
	xQueueSendFromISR( xQueue, &ch, &xHigherPriorityTaskWoken );
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.