/* 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 ); }