mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-20 05:21:59 -04:00
Prepare the MSP430X IAR demo for release.
This commit is contained in:
parent
eb94f856a8
commit
34f15ddecd
|
@ -74,7 +74,7 @@
|
|||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10 * 1024 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configMAX_TASK_NAME_LEN ( 10 )
|
||||
#define configUSE_TRACE_FACILITY 0
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
|
@ -92,15 +92,20 @@
|
|||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskDelete 0
|
||||
#define INCLUDE_vTaskCleanUpResources 0
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
|
||||
/* The MSP430X port uses a callback function to configure its tick interrupt.
|
||||
This allows the application to choose the tick interrupt source.
|
||||
configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct
|
||||
interrupt vector for the chosen tick interrupt source. This implementation of
|
||||
vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this
|
||||
case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */
|
||||
#define configTICK_INTERRUPT_VECTOR TIMER0_A0_VECTOR
|
||||
|
||||
/* Prevent the following definitions being included when FreeRTOSConfig.h
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -74,6 +74,7 @@ void vParTestInitialise( void )
|
|||
|
||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
||||
{
|
||||
/* Only two LEDs are provided on the hardware. */
|
||||
taskENTER_CRITICAL();
|
||||
{
|
||||
if( xValue != pdFALSE )
|
||||
|
@ -85,6 +86,9 @@ void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|||
|
||||
case 1: LED_PORT_OUT |= LED_2;
|
||||
break;
|
||||
|
||||
default: /* Nothing to do here, there are only two LEDs. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -96,6 +100,8 @@ void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
|||
|
||||
case 1: LED_PORT_OUT &= ~LED_2;
|
||||
break;
|
||||
default: /* Nothing to do here, there are only two LEDs. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -128,6 +134,8 @@ void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
|||
LED_PORT_OUT &= ~LED_2;
|
||||
}
|
||||
break;
|
||||
default: /* Nothing to do here, there are only two LEDs. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
taskEXIT_CRITICAL();
|
||||
|
|
|
@ -1862,6 +1862,9 @@
|
|||
<file>
|
||||
<name>$PROJ_DIR$\RegTest.s43</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\RunTimeStatsConfig.c</name>
|
||||
</file>
|
||||
<file>
|
||||
<name>$PROJ_DIR$\serial.c</name>
|
||||
</file>
|
||||
|
|
|
@ -53,8 +53,16 @@
|
|||
#include "msp430.h"
|
||||
#include "FreeRTOSConfig.h"
|
||||
|
||||
/*
|
||||
* The definition of the "register test" tasks, as described at the top of
|
||||
* main.c
|
||||
*/
|
||||
|
||||
|
||||
|
||||
IMPORT usRegTest1Counter
|
||||
IMPORT usRegTest2Counter
|
||||
IMPORT vPortYield
|
||||
|
||||
EXPORT vRegTest1Task
|
||||
EXPORT vRegTest2Task
|
||||
|
@ -63,6 +71,7 @@
|
|||
|
||||
vRegTest1Task:
|
||||
|
||||
/* Fill each general purpose register with a known value. */
|
||||
movx.a #0x44444, r4
|
||||
movx.a #0x55555, r5
|
||||
movx.a #0x66666, r6
|
||||
|
@ -78,6 +87,9 @@ vRegTest1Task:
|
|||
|
||||
prvRegTest1Loop:
|
||||
|
||||
/* Test each general purpose register to check that it still contains the
|
||||
expected known value, jumping to vRegTest1Error if any register contains
|
||||
an unexpected value. */
|
||||
cmpx.a #0x44444, r4
|
||||
jne vRegTest1Error
|
||||
cmpx.a #0x55555, r5
|
||||
|
@ -102,7 +114,12 @@ prvRegTest1Loop:
|
|||
jne vRegTest1Error
|
||||
cmpx.a #0xfffff, r15
|
||||
jne vRegTest1Error
|
||||
|
||||
/* This task is still running without jumping to vRegTest1Error, so increment
|
||||
the loop counter so the check task knows the task is running error free. */
|
||||
incx.w &usRegTest1Counter
|
||||
|
||||
/* Loop again, performing the same tests. */
|
||||
jmp prvRegTest1Loop
|
||||
nop
|
||||
|
||||
|
@ -110,49 +127,56 @@ prvRegTest1Loop:
|
|||
vRegTest1Error:
|
||||
jmp vRegTest1Error
|
||||
nop
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* See the comments in vRegTest1Task. This task is the same, it just uses
|
||||
different values in its registers. */
|
||||
vRegTest2Task:
|
||||
|
||||
movx.a #0x44444, r4
|
||||
movx.a #0x55555, r5
|
||||
movx.a #0x66666, r6
|
||||
movx.a #0x77777, r7
|
||||
movx.a #0x88888, r8
|
||||
movx.a #0x99999, r9
|
||||
movx.a #0xaaaaa, r10
|
||||
movx.a #0xbbbbb, r11
|
||||
movx.a #0xccccc, r12
|
||||
movx.a #0xddddd, r13
|
||||
movx.a #0xeeeee, r14
|
||||
movx.a #0xfffff, r15
|
||||
movx.a #0x14441, r4
|
||||
movx.a #0x15551, r5
|
||||
movx.a #0x16661, r6
|
||||
movx.a #0x17771, r7
|
||||
movx.a #0x18881, r8
|
||||
movx.a #0x19991, r9
|
||||
movx.a #0x1aaa1, r10
|
||||
movx.a #0x1bbb1, r11
|
||||
movx.a #0x1ccc1, r12
|
||||
movx.a #0x1ddd1, r13
|
||||
movx.a #0x1eee1, r14
|
||||
movx.a #0x1fff1, r15
|
||||
|
||||
prvRegTest2Loop:
|
||||
|
||||
cmpx.a #0x44444, r4
|
||||
cmpx.a #0x14441, r4
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0x55555, r5
|
||||
cmpx.a #0x15551, r5
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0x66666, r6
|
||||
cmpx.a #0x16661, r6
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0x77777, r7
|
||||
cmpx.a #0x17771, r7
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0x88888, r8
|
||||
cmpx.a #0x18881, r8
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0x99999, r9
|
||||
cmpx.a #0x19991, r9
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0xaaaaa, r10
|
||||
cmpx.a #0x1aaa1, r10
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0xbbbbb, r11
|
||||
cmpx.a #0x1bbb1, r11
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0xccccc, r12
|
||||
cmpx.a #0x1ccc1, r12
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0xddddd, r13
|
||||
cmpx.a #0x1ddd1, r13
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0xeeeee, r14
|
||||
cmpx.a #0x1eee1, r14
|
||||
jne vRegTest2Error
|
||||
cmpx.a #0xfffff, r15
|
||||
cmpx.a #0x1fff1, r15
|
||||
jne vRegTest2Error
|
||||
|
||||
/* Also perform a manual yield, just to increase the scope of the test. */
|
||||
calla #vPortYield
|
||||
|
||||
incx.w &usRegTest2Counter
|
||||
jmp prvRegTest2Loop
|
||||
nop
|
||||
|
|
115
Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c
Normal file
115
Demo/MSP430X_MSP430F5438_IAR/RunTimeStatsConfig.c
Normal file
|
@ -0,0 +1,115 @@
|
|||
/*
|
||||
FreeRTOS V6.1.0 - Copyright (C) 2010 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.
|
||||
*/
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
|
||||
/* Hardware includes. */
|
||||
#include "msp430.h"
|
||||
#include "hal_MSP-EXP430F5438.h"
|
||||
|
||||
/* This demo uses Timer A1 to generate the time base for gathering run time
|
||||
statistics information. Run time statistics show much processing time has
|
||||
been allocated to each task since the application booted. */
|
||||
|
||||
/* The time base for the run time stats is generated by a 16 bit timer. Each
|
||||
time the timer overflows ulStatsOverflowCount is incremented. Therefore,
|
||||
when converting the total run time to a 32 bit number, the most significant two
|
||||
bytes are given by ulStatsOverflowCount and the least significant two bytes are
|
||||
given by the current timer counter value. Care must be taken with data
|
||||
consistency when combining the two in case a timer overflow occurs as the
|
||||
value is being read. */
|
||||
volatile unsigned long ulStatsOverflowCount = 0;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vConfigureTimerForRunTimeStats( void )
|
||||
{
|
||||
/* Ensure the timer is stopped. */
|
||||
TA1CTL = 0;
|
||||
|
||||
/* Run the timer from the ACLK/4. */
|
||||
TA1CTL = TASSEL_1 | ID__4;
|
||||
|
||||
/* Clear everything to start with. */
|
||||
TA1CTL |= TACLR;
|
||||
|
||||
/* Enable the interrupts. */
|
||||
TA1CCTL0 = CCIE;
|
||||
|
||||
/* Start up clean. */
|
||||
TA1CTL |= TACLR;
|
||||
|
||||
/* Continuous mode. */
|
||||
TA1CTL |= MC__CONTINOUS;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#pragma vector=TIMER1_A0_VECTOR
|
||||
static __interrupt void prvRunTimeStatsOverflowISR( void )
|
||||
{
|
||||
ulStatsOverflowCount++;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
inline unsigned long ulGetRunTimeStatsTime( void )
|
||||
{
|
||||
unsigned long ulReturn;
|
||||
|
||||
TA1CTL &= ~MC__CONTINOUS;
|
||||
ulReturn = ( ( ulStatsOverflowCount << 16UL ) | ( unsigned long ) TA1R );
|
||||
TA1CTL |= MC__CONTINOUS;
|
||||
|
||||
return ulReturn;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
|
@ -195,9 +195,9 @@
|
|||
|
||||
// *** Modified to place code in high memory and insodoing, testing the port.
|
||||
// Original code
|
||||
//-P(CODE)CODE=5C00-FF7F,10000-45BFF
|
||||
-P(CODE)CODE=5C00-FF7F,10000-45BFF
|
||||
// Modified code
|
||||
-P(CODE)CODE=10000-45BFF
|
||||
//-P(CODE)CODE=10000-45BFF
|
||||
|
||||
-Z(CODE)CODE_ID
|
||||
|
||||
|
|
|
@ -51,6 +51,87 @@
|
|||
licensing and training services.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The documentation page for this demo available on http://www.FreeRTOS.org
|
||||
* documents the hardware configuration required to run this demo. It also
|
||||
* provides more information on the expected demo application behaviour.
|
||||
*
|
||||
* main() creates all the demo application tasks, then starts the scheduler.
|
||||
* A lot of the created tasks are from the pool of "standard demo" tasks. The
|
||||
* web documentation provides more details of the standard demo tasks, which
|
||||
* provide no particular functionality but do provide good examples of how to
|
||||
* use the FreeRTOS API.
|
||||
*
|
||||
* In addition to the standard demo tasks, the following tasks, interrupts and
|
||||
* tests are defined and/or created within this file:
|
||||
*
|
||||
* "LCD" task - The LCD task is a 'gatekeeper' task. It is the only task that
|
||||
* is permitted to access the LCD and therefore ensures access to the LCD is
|
||||
* always serialised and there are no mutual exclusion issues. When a task or
|
||||
* an interrupt wants to write to the LCD, it does not access the LCD directly
|
||||
* but instead sends the message to the LCD task. The LCD task then performs
|
||||
* the actual LCD output. This mechanism also allows interrupts to, in effect,
|
||||
* write to the LCD by sending messages to the LCD task.
|
||||
*
|
||||
* The LCD task is also a demonstration of a 'controller' task design pattern.
|
||||
* Some tasks do not actually send a string to the LCD task directly, but
|
||||
* instead send a command that is interpreted by the LCD task. In a normal
|
||||
* application these commands can be control values or set points, in this
|
||||
* simple example the commands just result in messages being displayed on the
|
||||
* LCD.
|
||||
*
|
||||
* "Button Poll" task - This task polls the state of the 'up' key on the
|
||||
* joystick input device. It uses the vTaskDelay() API function to control
|
||||
* the poll rate to ensure debouncing is not necessary and that the task does
|
||||
* not use all the available CPU processing time.
|
||||
*
|
||||
* Button Interrupt and run time stats display - The select button on the
|
||||
* joystick input device is configured to generate an external interrupt. The
|
||||
* handler for this interrupt sends a message to LCD task, which interprets the
|
||||
* message to mean, firstly write a message to the LCD, and secondly, generate
|
||||
* a table of run time statistics. The run time statistics are displayed as a
|
||||
* table that contains information on how much processing time each task has
|
||||
* been allocated since the application started to execute. This information
|
||||
* is provided both as an absolute time, and as a percentage of the total run
|
||||
* time. The information is displayed in the terminal IO window of the IAR
|
||||
* embedded workbench. The online documentation for this demo shows a screen
|
||||
* shot demonstrating where the run time stats can be viewed.
|
||||
*
|
||||
* Idle Hook - The idle hook is a function that is called on each iteration of
|
||||
* the idle task. In this case it is used to place the processor into a low
|
||||
* power mode. Note however that this application is implemented using standard
|
||||
* components, and is therefore not optimised for low power operation. Lower
|
||||
* power consumption would be achieved by converting polling tasks into event
|
||||
* driven tasks, and slowing the tick interrupt frequency.
|
||||
*
|
||||
* "Check" function called from the tick hook - The tick hook is called during
|
||||
* each tick interrupt. It is called from an interrupt context so must execute
|
||||
* quickly, not attempt to block, and not call any FreeRTOS API functions that
|
||||
* do not end in "FromISR". In this case the tick hook executes a 'check'
|
||||
* function. This only executes every five seconds. Its main function is to
|
||||
* check that all the standard demo tasks are still operational. Each time it
|
||||
* executes it sends a status code to the LCD task. The LCD task interprets the
|
||||
* code and displays an appropriate message - which will be PASS if no tasks
|
||||
* have reported any errors, or a message stating which task has reported an
|
||||
* error.
|
||||
*
|
||||
* "Reg test" tasks - These fill the registers with known values, then check
|
||||
* that each register still contains its expected value. Each task uses
|
||||
* different values. The tasks run with very low priority so get preempted
|
||||
* very frequently. A check variable is incremented on each iteration of the
|
||||
* test loop. A register containing an unexpected value is indicative of an
|
||||
* error in the context switching mechanism and will result in a branch to a
|
||||
* null loop - which in turn will prevent the check variable from incrementing
|
||||
* any further and allow the check task (described a above) to determine that an
|
||||
* error has occurred. The nature of the reg test tasks necessitates that they
|
||||
* are written in assembly code.
|
||||
*
|
||||
* *NOTE 2* vApplicationSetupTimerInterrupt() is called by the kernel to let
|
||||
* the application set up a timer to generate the tick interrupt. In this
|
||||
* example a timer A0 is used for this purpose.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -88,30 +169,58 @@ of the same message and indicate what the status actually is. */
|
|||
to send messages from tasks and interrupts the the LCD task. */
|
||||
#define mainQUEUE_LENGTH ( 5 )
|
||||
|
||||
/* Priorities used by the test and demo tasks. */
|
||||
#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainGENERIC_QUEUE_TEST_PRIORITY ( tskIDLE_PRIORITY )
|
||||
|
||||
/* The LED used by the comtest tasks. See the comtest.c file for more
|
||||
information. In this case it is deliberately out of range as there are only
|
||||
two LEDs, and they are both already in use. */
|
||||
#define mainCOM_TEST_LED ( 3 )
|
||||
information. */
|
||||
#define mainCOM_TEST_LED ( 1 )
|
||||
|
||||
/* The baud rate used by the comtest tasks described at the top of this file. */
|
||||
#define mainCOM_TEST_BAUD_RATE ( 9600 )
|
||||
#define mainCOM_TEST_BAUD_RATE ( 115200 )
|
||||
|
||||
/* The maximum number of lines of text that can be displayed on the LCD. */
|
||||
#define mainMAX_LCD_LINES ( 8 )
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* The reg test tasks as described at the top of this file.
|
||||
*/
|
||||
extern void vRegTest1Task( void *pvParameters );
|
||||
extern void vRegTest2Task( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Configures clocks, LCD, port pints, etc. necessary to execute this demo.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
static void prvTerminalIOTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Definition of the LCD/controller task described in the comments at the top
|
||||
* of this file.
|
||||
*/
|
||||
static void prvLCDTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Definition of the button poll task described in the comments at the top of
|
||||
* this file.
|
||||
*/
|
||||
static void prvButtonPollTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Converts a status message value into an appropriate string for display on
|
||||
* the LCD. The string is written to pcBuffer.
|
||||
*/
|
||||
static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Variables that are incremented on each iteration of the reg test tasks -
|
||||
provided the tasks have not reported any errors. The check task inspects these
|
||||
variables to ensure they are still incrementing as expected. If a variable
|
||||
stops incrementing then it is likely that its associate task has stalled. */
|
||||
volatile unsigned short usRegTest1Counter = 0, usRegTest2Counter = 0;
|
||||
volatile unsigned long ulStatsOverflowCount = 0;
|
||||
|
||||
/* The handle of the queue used to send messages from tasks and interrupts to
|
||||
the LCD task. */
|
||||
|
@ -121,19 +230,24 @@ static xQueueHandle xLCDQueue = NULL;
|
|||
task. */
|
||||
typedef struct
|
||||
{
|
||||
char cMessageID; /* << States what the message is. */
|
||||
unsigned long ulMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID. */
|
||||
char cMessageID; /* << States what the message is. */
|
||||
unsigned long ulMessageValue; /* << States the message value (can be an integer, string pointer, etc. depending on the value of cMessageID). */
|
||||
} xQueueMessage;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void main( void )
|
||||
{
|
||||
/* Configure the peripherals used by this demo application. This includes
|
||||
configuring the joystick input select button to generate interrupts. */
|
||||
prvSetupHardware();
|
||||
|
||||
/* Create the queue used by tasks and interrupts to send strings to the LCD
|
||||
task. */
|
||||
xLCDQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( xQueueMessage ) );
|
||||
|
||||
/* If the queue could not be created then don't create any tasks that might
|
||||
attempt to use the queue. */
|
||||
if( xLCDQueue != NULL )
|
||||
{
|
||||
/* Add the created queue to the queue registry so it can be viewed in
|
||||
|
@ -145,22 +259,26 @@ void main( void )
|
|||
vStartDynamicPriorityTasks();
|
||||
vStartGenericQueueTasks( mainGENERIC_QUEUE_TEST_PRIORITY );
|
||||
|
||||
/* Create the terminal IO and button poll tasks, as described at the top
|
||||
of this file. */
|
||||
xTaskCreate( prvTerminalIOTask, ( signed char * ) "IO", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL );
|
||||
/* Create the LCD, button poll and register test tasks, as described at
|
||||
the top of this file. */
|
||||
xTaskCreate( prvLCDTask, ( signed char * ) "LCD", configMINIMAL_STACK_SIZE * 2, NULL, mainLCD_TASK_PRIORITY, NULL );
|
||||
xTaskCreate( prvButtonPollTask, ( signed char * ) "BPoll", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
|
||||
|
||||
/* Create the register test tasks as described at the top of this file. */
|
||||
xTaskCreate( vRegTest1Task, "Reg1", configMINIMAL_STACK_SIZE, NULL, 0, NULL );
|
||||
xTaskCreate( vRegTest2Task, "Reg2", configMINIMAL_STACK_SIZE, NULL, 0, NULL );
|
||||
|
||||
/* Start the scheduler. */
|
||||
vTaskStartScheduler();
|
||||
}
|
||||
|
||||
/* If all is well then this line will never be reached. If it is reached
|
||||
then it is likely that there was insufficient (FreeRTOS) heap memory space
|
||||
to create the idle task. This may have been trapped by the malloc() failed
|
||||
hook function, if one is configured. */
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvTerminalIOTask( void *pvParameters )
|
||||
static void prvLCDTask( void *pvParameters )
|
||||
{
|
||||
xQueueMessage xReceivedMessage;
|
||||
|
||||
|
@ -192,7 +310,7 @@ unsigned char ucLine = 1;
|
|||
xQueueReceive( xLCDQueue, &xReceivedMessage, portMAX_DELAY );
|
||||
|
||||
/* Clear the LCD if no room remains for any more text output. */
|
||||
if( ucLine > 8 )
|
||||
if( ucLine > mainMAX_LCD_LINES )
|
||||
{
|
||||
halLcdClearScreen();
|
||||
ucLine = 0;
|
||||
|
@ -225,7 +343,7 @@ unsigned char ucLine = 1;
|
|||
the LCD - in this case the
|
||||
pointer to the string to print
|
||||
is sent directly in the
|
||||
lMessageValue member of the
|
||||
ulMessageValue member of the
|
||||
message. This just demonstrates
|
||||
a different communication
|
||||
technique. */
|
||||
|
@ -244,6 +362,9 @@ unsigned char ucLine = 1;
|
|||
break;
|
||||
}
|
||||
|
||||
/* Output the message that was placed into the cBuffer array within the
|
||||
switch statement above, then move onto the next line ready for the next
|
||||
message to arrive on the queue. */
|
||||
halLcdPrintLine( cBuffer, ucLine, OVERWRITE_TEXT );
|
||||
ucLine++;
|
||||
}
|
||||
|
@ -260,7 +381,7 @@ static void prvGenerateStatusMessage( char *pcBuffer, long lStatusValue )
|
|||
break;
|
||||
case mainERROR_DYNAMIC_TASKS : sprintf( pcBuffer, "Err: Dynamic tsks" );
|
||||
break;
|
||||
case mainERROR_COM_TEST : sprintf( pcBuffer, "Err: COM test" ); /* Error in COM test - is the Loopback connector connected? */
|
||||
case mainERROR_COM_TEST : sprintf( pcBuffer, "Err: COM test" );
|
||||
break;
|
||||
case mainERROR_GEN_QUEUE_TEST : sprintf( pcBuffer, "Error: Gen Q test" );
|
||||
break;
|
||||
|
@ -286,6 +407,7 @@ xQueueMessage xMessage;
|
|||
|
||||
if( ucState != 0 )
|
||||
{
|
||||
/* The button was pressed. */
|
||||
ucState = pdTRUE;
|
||||
}
|
||||
|
||||
|
@ -307,6 +429,8 @@ xQueueMessage xMessage;
|
|||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
/* Convert a Hz value to a KHz value, as required by the Init_FLL_Settle()
|
||||
function. */
|
||||
unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );
|
||||
|
||||
halBoardInit();
|
||||
|
@ -316,64 +440,18 @@ unsigned long ulCPU_Clock_KHz = ( configCPU_CLOCK_HZ / 1000UL );
|
|||
|
||||
halButtonsInit( BUTTON_ALL );
|
||||
halButtonsInterruptEnable( BUTTON_SELECT );
|
||||
|
||||
/* Initialise the LCD, but note that the backlight is not used as the
|
||||
library function uses timer A0 to modulate the backlight, and this file
|
||||
defines vApplicationSetupTimerInterrupt() to also use timer A0 to generate
|
||||
the tick interrupt. If the backlight is required, then change either the
|
||||
halLCD library or vApplicationSetupTimerInterrupt() to use a different
|
||||
timer. Timer A1 is used for the run time stats time base6. */
|
||||
halLcdInit();
|
||||
halLcdBackLightInit();
|
||||
halLcdSetBackLight( 0 );
|
||||
halLcdSetContrast( 100 );
|
||||
halLcdClearScreen();
|
||||
|
||||
halLcdPrintLine( " www.FreeRTOS.org", 0, OVERWRITE_TEXT );
|
||||
|
||||
while( ( halButtonsPressed() & BUTTON_UP ) == 0 );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationSetupTimerInterrupt( void )
|
||||
{
|
||||
const unsigned short usACLK_Frequency_Hz = 32768;
|
||||
|
||||
/* Ensure the timer is stopped. */
|
||||
TA0CTL = 0;
|
||||
|
||||
/* Run the timer from the ACLK. */
|
||||
TA0CTL = TASSEL_1;
|
||||
|
||||
/* Clear everything to start with. */
|
||||
TA0CTL |= TACLR;
|
||||
|
||||
/* Set the compare match value according to the tick rate we want. */
|
||||
TA0CCR0 = usACLK_Frequency_Hz / configTICK_RATE_HZ;
|
||||
|
||||
/* Enable the interrupts. */
|
||||
TA0CCTL0 = CCIE;
|
||||
|
||||
/* Start up clean. */
|
||||
TA0CTL |= TACLR;
|
||||
|
||||
/* Up mode. */
|
||||
TA0CTL |= MC_1;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )
|
||||
{
|
||||
( void ) pxTask;
|
||||
( void ) pcTaskName;
|
||||
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
/* Want to leave the SMCLK running so the COMTest tasks don't fail. */
|
||||
__bis_SR_register( LPM1_bits + GIE );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
@ -413,8 +491,8 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
|
|||
xStatusMessage.ulMessageValue = mainERROR_GEN_QUEUE_TEST;
|
||||
}
|
||||
|
||||
/* Check the reg test tasks are still cycling. They will stop incrementing
|
||||
their loop counters if they encounter an error. */
|
||||
/* Check the reg test tasks are still cycling. They will stop
|
||||
incrementing their loop counters if they encounter an error. */
|
||||
if( usRegTest1Counter == usLastRegTest1Counter )
|
||||
{
|
||||
xStatusMessage.ulMessageValue = mainERROR_REG_TEST;
|
||||
|
@ -435,17 +513,18 @@ static xQueueMessage xStatusMessage = { mainMESSAGE_STATUS, pdPASS };
|
|||
ulCounter = 0;
|
||||
}
|
||||
|
||||
/* Just periodically toggle an LED to show that the tick interrupt is
|
||||
running. Note that this access LED_PORT_OUT in a non-atomic way, so tasks
|
||||
that access the same port must do so from a critical section. */
|
||||
if( ( ulCounter & 0xff ) == 0 )
|
||||
{
|
||||
if( ( LED_PORT_OUT & LED_1 ) == 0 )
|
||||
{
|
||||
LED_PORT_OUT |= LED_1;
|
||||
LED_PORT_OUT &= ~LED_2;
|
||||
}
|
||||
else
|
||||
{
|
||||
LED_PORT_OUT &= ~LED_1;
|
||||
LED_PORT_OUT |= LED_2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -473,46 +552,68 @@ portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vConfigureTimerForRunTimeStats( void )
|
||||
/* The MSP430X port uses this callback function to configure its tick interrupt.
|
||||
This allows the application to choose the tick interrupt source.
|
||||
configTICK_INTERRUPT_VECTOR must also be set in FreeRTOSConfig.h to the correct
|
||||
interrupt vector for the chosen tick interrupt source. This implementation of
|
||||
vApplicationSetupTimerInterrupt() generates the tick from timer A0, so in this
|
||||
case configTICK_INTERRUPT_VECTOR is set to TIMER0_A0_VECTOR. */
|
||||
void vApplicationSetupTimerInterrupt( void )
|
||||
{
|
||||
/* Ensure the timer is stopped. */
|
||||
TA1CTL = 0;
|
||||
const unsigned short usACLK_Frequency_Hz = 32768;
|
||||
|
||||
/* Run the timer from the ACLK/4. */
|
||||
TA1CTL = TASSEL_1 | ID__4;
|
||||
/* Ensure the timer is stopped. */
|
||||
TA0CTL = 0;
|
||||
|
||||
/* Run the timer from the ACLK. */
|
||||
TA0CTL = TASSEL_1;
|
||||
|
||||
/* Clear everything to start with. */
|
||||
TA1CTL |= TACLR;
|
||||
TA0CTL |= TACLR;
|
||||
|
||||
/* Set the compare match value according to the tick rate we want. */
|
||||
TA0CCR0 = usACLK_Frequency_Hz / configTICK_RATE_HZ;
|
||||
|
||||
/* Enable the interrupts. */
|
||||
TA1CCTL0 = CCIE;
|
||||
TA0CCTL0 = CCIE;
|
||||
|
||||
/* Start up clean. */
|
||||
TA1CTL |= TACLR;
|
||||
TA0CTL |= TACLR;
|
||||
|
||||
/* Continuous mode. */
|
||||
TA1CTL |= MC__CONTINOUS;
|
||||
/* Up mode. */
|
||||
TA0CTL |= MC_1;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
#pragma vector=TIMER1_A0_VECTOR
|
||||
static __interrupt void prvRunTimeStatsOverflowISR( void )
|
||||
void vApplicationIdleHook( void )
|
||||
{
|
||||
ulStatsOverflowCount++;
|
||||
/* Called on each iteration of the idle task. In this case the idle task
|
||||
just enters a low(ish) power mode. */
|
||||
__bis_SR_register( LPM1_bits + GIE );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
inline unsigned long ulGetRunTimeStatsTime( void )
|
||||
void vApplicationMallocFailedHook( void )
|
||||
{
|
||||
unsigned long ulReturn;
|
||||
/* Called if a call to pvPortMalloc() fails because there is insufficient
|
||||
free memory available in the FreeRTOS heap. pvPortMalloc() is called
|
||||
internally by FreeRTOS API functions that create tasks, queues or
|
||||
semaphores. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
TA1CTL &= ~MC__CONTINOUS;
|
||||
ulReturn = ( ( ulStatsOverflowCount << 16UL ) | ( unsigned long ) TA1R );
|
||||
TA1CTL |= MC__CONTINOUS;
|
||||
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName )
|
||||
{
|
||||
( void ) pxTask;
|
||||
( void ) pcTaskName;
|
||||
|
||||
return ulReturn;
|
||||
/* Run time stack overflow checking is performed if
|
||||
configconfigCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook
|
||||
function is called if a stack overflow is detected. */
|
||||
taskDISABLE_INTERRUPTS();
|
||||
for( ;; );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
|
|
@ -54,9 +54,11 @@
|
|||
|
||||
/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER.
|
||||
*
|
||||
* This file only supports UART A0 in loopback mode, and has not been tested
|
||||
* for real UART operation (only loopback mode) so is not guaranteed to have
|
||||
* a correct baud rate configuration.
|
||||
* This is not a proper UART driver. It only supports one port, uses loopback
|
||||
* mode, and is used to test interrupts that use the FreeRTOS API as part of
|
||||
* a wider test suite. Nor is it intended to show an efficient implementation
|
||||
* of a UART interrupt service routine as queues are used to pass individual
|
||||
* characters one at a time!
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
|
@ -70,9 +72,6 @@
|
|||
/* Demo application includes. */
|
||||
#include "serial.h"
|
||||
|
||||
/* Constants required to setup the hardware. */
|
||||
#define serTX_AND_RX ( ( unsigned portCHAR ) 0x03 )
|
||||
|
||||
/* Misc. constants. */
|
||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
||||
|
||||
|
@ -123,9 +122,8 @@ unsigned portLONG ulBaudRateCount;
|
|||
}
|
||||
portEXIT_CRITICAL();
|
||||
|
||||
/* Unlike other ports, this serial code does not allow for more than one
|
||||
com port. We therefore don't return a pointer to a port structure and can
|
||||
instead just return NULL. */
|
||||
/* Note the comments at the top of this file about this not being a generic
|
||||
UART driver. */
|
||||
return NULL;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
@ -149,6 +147,9 @@ signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOut
|
|||
{
|
||||
signed portBASE_TYPE xReturn;
|
||||
|
||||
/* Send the next character to the queue of characters waiting transmission,
|
||||
then enable the UART Tx interrupt, just in case UART transmission has already
|
||||
completed and switched itself off. */
|
||||
xReturn = xQueueSend( xCharsForTx, &cOutChar, xBlockTime );
|
||||
UCA1IE |= UCTXIE;
|
||||
|
||||
|
@ -190,6 +191,14 @@ portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
|
|||
}
|
||||
|
||||
__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
|
||||
|
||||
/* If writing to a queue caused a task to unblock, and the unblocked task
|
||||
has a priority equal to or above the task that this interrupt interrupted,
|
||||
then lHigherPriorityTaskWoken will have been set to pdTRUE internally within
|
||||
xQueuesendFromISR(), and portEND_SWITCHING_ISR() will ensure that this
|
||||
interrupt returns directly to the higher priority unblocked task.
|
||||
|
||||
THIS MUST BE THE LAST THING DONE IN THE ISR. */
|
||||
portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
||||
}
|
||||
|
||||
|
|
|
@ -26,12 +26,12 @@
|
|||
|
||||
|
||||
<PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><MixedMode>1</MixedMode><CodeCovShow>1</CodeCovShow><InstrProfShow>1</InstrProfShow></Disassembly>
|
||||
<Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:TA1CTL</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulSP_PC_Combined</Key><Value>4</Value></Fmt></watch_formats></Format><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>134</Column0><Column1>139</Column1><Column2>124</Column2><Column3>100</Column3></Watch><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Breakpoints><TASKVIEW><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>200</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3><Column4>100</Column4><Column5>100</Column5><Column6>100</Column6><Column7>150</Column7></TASKVIEW><TerminalIO><InputSource>1</InputSource><InputMode>10</InputMode><Filename>$PROJ_DIR$\TermIOInput.txt</Filename><InputEcho>1</InputEcho><ShowReset>0</ShowReset></TerminalIO><DeviceInformationWindow><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>150</Column0><Column1>150</Column1></DeviceInformationWindow><StateStorageDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></StateStorageDialog><SequencerDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><SequencerMask>0</SequencerMask><Advanced>0</Advanced></SequencerDialog></Static>
|
||||
<Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory><Watch><Format><struct_types/><watch_formats><Fmt><Key>{W}Watch-0:TA1CTL</Key><Value>4</Value></Fmt><Fmt><Key>{W}Watch-0:ulSP_PC_Combined</Key><Value>4</Value></Fmt></watch_formats></Format><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>134</Column0><Column1>139</Column1><Column2>124</Column2><Column3>100</Column3></Watch><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows><Window><Factory>Debug-Log</Factory></Window></Windows></PreferedWindows></Breakpoints><TASKVIEW><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>200</Column0><Column1>100</Column1><Column2>100</Column2><Column3>100</Column3><Column4>100</Column4><Column5>100</Column5><Column6>100</Column6><Column7>150</Column7></TASKVIEW><TerminalIO><InputSource>1</InputSource><InputMode>10</InputMode><Filename>$PROJ_DIR$\TermIOInput.txt</Filename><InputEcho>1</InputEcho><ShowReset>0</ShowReset></TerminalIO><DeviceInformationWindow><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><Column0>150</Column0><Column1>150</Column1></DeviceInformationWindow><StateStorageDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></StateStorageDialog><SequencerDialog><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><SequencerMask>0</SequencerMask><Advanced>0</Advanced></SequencerDialog><CallStack><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ViewArgs>1</ViewArgs></CallStack></Static>
|
||||
<Windows>
|
||||
|
||||
|
||||
|
||||
<Wnd1>
|
||||
<Wnd0>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-11539-27703</Identity>
|
||||
|
@ -39,24 +39,24 @@
|
|||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode></NodeDict></Session>
|
||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS_Source</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS_Source/Portable</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd1><Wnd2><Tabs><Tab><Identity>TabID-12395-27916</Identity><TabName>Terminal I/O</TabName><Factory>TerminalIO</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd2><Wnd4><Tabs><Tab><Identity>TabID-25408-8444</Identity><TabName>Tasks</TabName><Factory>TASKVIEW</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd4></Windows>
|
||||
<SelectedTab>0</SelectedTab></Wnd0><Wnd1><Tabs><Tab><Identity>TabID-12395-27916</Identity><TabName>Terminal I/O</TabName><Factory>TerminalIO</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd1><Wnd3><Tabs><Tab><Identity>TabID-28694-31512</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows>
|
||||
<Editor>
|
||||
|
||||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_lcd.c</Filename><XPos>0</XPos><YPos>809</YPos><SelStart>27981</SelStart><SelEnd>27996</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>353</YPos><SelStart>13834</SelStart><SelEnd>13834</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\queue.c</Filename><XPos>0</XPos><YPos>451</YPos><SelStart>19345</SelStart><SelEnd>19345</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\FreeRTOSConfig.h</Filename><XPos>0</XPos><YPos>54</YPos><SelStart>3921</SelStart><SelEnd>3921</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\lnk430F5438A_mod.xcl</Filename><XPos>0</XPos><YPos>177</YPos><SelStart>5081</SelStart><SelEnd>5081</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\tasks.c</Filename><XPos>0</XPos><YPos>1590</YPos><SelStart>50218</SelStart><SelEnd>50218</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\MSP430X\port.c</Filename><XPos>0</XPos><YPos>163</YPos><SelStart>7271</SelStart><SelEnd>7271</SelEnd></Tab><ActiveTab>6</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>237</YPos><SelStart>12630</SelStart><SelEnd>12630</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68><Toolbar-0917a2f0><key>430fet1</key></Toolbar-0917a2f0></Sizes></Row0><Row1><Sizes><Toolbar-078c7038><key>debuggergui.enu1</key></Toolbar-078c7038></Sizes></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>532</Bottom><Right>321</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>192262</sizeVertCX><sizeVertCY>543788</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>532</Bottom><Right>399</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>238690</sizeVertCX><sizeVertCY>543788</sizeVertCY></Rect></Wnd2></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>382</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>384</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>391039</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd4></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
<Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68><Toolbar-091d9c00><key>430fet1</key></Toolbar-091d9c00></Sizes></Row0><Row1><Sizes><Toolbar-0695a348><key>debuggergui.enu1</key></Toolbar-0695a348></Sizes></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10><Row11><Sizes/></Row11><Row12><Sizes/></Row12><Row13><Sizes/></Row13><Row14><Sizes/></Row14><Row15><Sizes/></Row15><Row16><Sizes/></Row16><Row17><Sizes/></Row17><Row18><Sizes/></Row18><Row19><Sizes/></Row19><Row20><Sizes/></Row20><Row21><Sizes/></Row21><Row22><Sizes/></Row22><Row23><Sizes/></Row23><Row24><Sizes/></Row24><Row25><Sizes/></Row25><Row26><Sizes/></Row26><Row27><Sizes/></Row27><Row28><Sizes/></Row28><Row29><Sizes/></Row29><Row30><Sizes/></Row30><Row31><Sizes/></Row31><Row32><Sizes/></Row32><Row33><Sizes/></Row33><Row34><Sizes/></Row34><Row35><Sizes/></Row35><Row36><Sizes/></Row36><Row37><Sizes/></Row37><Row38><Sizes/></Row38><Row39><Sizes/></Row39><Row40><Sizes/></Row40><Row41><Sizes/></Row41><Row42><Sizes/></Row42></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>321</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>192262</sizeVertCX><sizeVertCY>731161</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>716</Bottom><Right>399</Right><x>-2</x><y>-2</y><xscreen>121</xscreen><yscreen>150</yscreen><sizeHorzCX>72024</sizeHorzCX><sizeHorzCY>152749</sizeHorzCY><sizeVertCX>238690</sizeVertCX><sizeVertCY>731161</sizeVertCY></Rect></Wnd1></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>200</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>203666</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203666</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Project>
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[DebugChecksum]
|
||||
Checksum=-802929519
|
||||
Checksum=283457804
|
||||
[DisAssemblyWindow]
|
||||
NumStates=_ 1
|
||||
State 1=_ 1
|
||||
|
@ -14,7 +14,7 @@ Control Register=0
|
|||
NextState0=0
|
||||
NextState1=0
|
||||
[Action Register]
|
||||
Break=1
|
||||
Break=6
|
||||
State Storage=0
|
||||
[Profiling]
|
||||
Enabled=0
|
||||
|
@ -28,6 +28,10 @@ UseTrigger=1
|
|||
TriggerName=main
|
||||
LimitSize=0
|
||||
ByteLimit=50
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[TermIOLog]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
|
@ -35,13 +39,9 @@ LogFile=_ ""
|
|||
Enabled=0
|
||||
[DriverProfiling]
|
||||
Enabled=0
|
||||
Mode=303237632
|
||||
Mode=123810376
|
||||
Graph=0
|
||||
Symbiont=0
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[Breakpoints]
|
||||
Count=0
|
||||
[FET]
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
<Workspace>
|
||||
<ConfigDictionary>
|
||||
|
||||
<CurrentConfigs><Project>RTOSDemo/Release</Project></CurrentConfigs></ConfigDictionary>
|
||||
<CurrentConfigs><Project>RTOSDemo/Debug</Project></CurrentConfigs></ConfigDictionary>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Workspace>
|
||||
|
@ -33,7 +33,7 @@
|
|||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/F5XX_6XX_Core_Lib</ExpandedNode><ExpandedNode>RTOSDemo/MSP-EXP430F5438_HAL</ExpandedNode><ExpandedNode>RTOSDemo/Output</ExpandedNode><ExpandedNode>RTOSDemo/UserExperienceDemo</ExpandedNode></NodeDict></Session>
|
||||
<NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/UserExperienceDemo</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
|
@ -53,14 +53,14 @@
|
|||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_lcd.c</Filename><XPos>0</XPos><YPos>809</YPos><SelStart>27981</SelStart><SelEnd>27996</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>353</YPos><SelStart>13834</SelStart><SelEnd>13834</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\queue.c</Filename><XPos>0</XPos><YPos>451</YPos><SelStart>19345</SelStart><SelEnd>19345</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\FreeRTOSConfig.h</Filename><XPos>0</XPos><YPos>54</YPos><SelStart>3921</SelStart><SelEnd>3921</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\lnk430F5438A_mod.xcl</Filename><XPos>0</XPos><YPos>177</YPos><SelStart>5081</SelStart><SelEnd>5081</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\tasks.c</Filename><XPos>0</XPos><YPos>1590</YPos><SelStart>50218</SelStart><SelEnd>50218</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\MSP430X\port.c</Filename><XPos>0</XPos><YPos>163</YPos><SelStart>7271</SelStart><SelEnd>7271</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_MSP-EXP430F5438.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>669</SelStart><SelEnd>669</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\MSP-EXP430F5438_HAL\hal_board.c</Filename><XPos>0</XPos><YPos>44</YPos><SelStart>1725</SelStart><SelEnd>1725</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\serial.c</Filename><XPos>0</XPos><YPos>83</YPos><SelStart>4515</SelStart><SelEnd>4515</SelEnd></Tab><ActiveTab>9</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>42</YPos><SelStart>11777</SelStart><SelEnd>11777</SelEnd></Tab><ActiveTab>0</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>645</Bottom><Right>475</Right><x>-2</x><y>-2</y><xscreen>331</xscreen><yscreen>267</yscreen><sizeHorzCX>197024</sizeHorzCX><sizeHorzCY>271894</sizeHorzCY><sizeVertCX>283929</sizeVertCX><sizeVertCY>658859</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>293</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>295</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>300407</sizeHorzCY><sizeVertCX>197024</sizeVertCX><sizeVertCY>271894</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
<Top><Row0><Sizes><Toolbar-012aad68><key>iaridepm.enu1</key></Toolbar-012aad68></Sizes></Row0><Row1><Sizes/></Row1><Row2><Sizes/></Row2><Row3><Sizes/></Row3><Row4><Sizes/></Row4><Row5><Sizes/></Row5><Row6><Sizes/></Row6><Row7><Sizes/></Row7><Row8><Sizes/></Row8><Row9><Sizes/></Row9><Row10><Sizes/></Row10><Row11><Sizes/></Row11><Row12><Sizes/></Row12><Row13><Sizes/></Row13><Row14><Sizes/></Row14><Row15><Sizes/></Row15><Row16><Sizes/></Row16><Row17><Sizes/></Row17><Row18><Sizes/></Row18><Row19><Sizes/></Row19><Row20><Sizes/></Row20><Row21><Sizes/></Row21><Row22><Sizes/></Row22><Row23><Sizes/></Row23><Row24><Sizes/></Row24><Row25><Sizes/></Row25><Row26><Sizes/></Row26><Row27><Sizes/></Row27><Row28><Sizes/></Row28><Row29><Sizes/></Row29><Row30><Sizes/></Row30><Row31><Sizes/></Row31><Row32><Sizes/></Row32><Row33><Sizes/></Row33><Row34><Sizes/></Row34><Row35><Sizes/></Row35><Row36><Sizes/></Row36><Row37><Sizes/></Row37><Row38><Sizes/></Row38><Row39><Sizes/></Row39><Row40><Sizes/></Row40><Row41><Sizes/></Row41><Row42><Sizes/></Row42><Row43><Sizes/></Row43><Row44><Sizes/></Row44><Row45><Sizes/></Row45><Row46><Sizes/></Row46></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>645</Bottom><Right>475</Right><x>-2</x><y>-2</y><xscreen>331</xscreen><yscreen>267</yscreen><sizeHorzCX>197024</sizeHorzCX><sizeHorzCY>271894</sizeHorzCY><sizeVertCX>283929</sizeVertCX><sizeVertCY>658859</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>293</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>295</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>300407</sizeHorzCY><sizeVertCX>197024</sizeVertCX><sizeVertCY>271894</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Workspace>
|
||||
|
||||
|
|
Loading…
Reference in a new issue