]> git.sur5r.net Git - freertos/commitdiff
Carry on working on SAMA5D3 demo:
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 29 Jul 2014 21:28:22 +0000 (21:28 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 29 Jul 2014 21:28:22 +0000 (21:28 +0000)
- Add full interrupt nesting tests.
- Add additional critical section/context switching tests.
- Set interrupt priorities so everything can run at once without any software watchdog errors.
- Re-enable interrupts in each IRQ handler.
- Add in run-time stats.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2282 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

14 files changed:
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/AtmelFiles/libboard_sama5d3x-ek/source/board_lowlevel.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/AtmelFiles/libchip_sama5d3x/source/mmu.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/CDCCommandConsole.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/FreeRTOSConfig.h
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/FreeRTOS_tick_config.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/Full_Demo/IntQueueTimer.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/Full_Demo/main_full.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/RTOSDemo.ewp
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/cstartup_with_FreeRTOS_vectors.s
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/main.c
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/settings/RTOSDemo.dbgdt
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/settings/RTOSDemo.dni
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/settings/RTOSDemo.wsdt
FreeRTOS/Demo/CORTEX_A5_SAMA5D3x_Xplained_IAR/settings/RTOSDemo.wspos

index 3e0b86334b0ce58a4ad0690912b2b676517375b2..64660bfe48167f88dcff81a3c6847c417b35fc11 100644 (file)
@@ -77,11 +77,11 @@ extern WEAK void LowLevelInit( void )
     if ((uint32_t)LowLevelInit < DDR_CS_ADDR) /* Code not in external mem */ {\r
         PMC_SelectExt12M_Osc();\r
         PMC_SwitchMck2Main();\r
-        PMC_SetPllA( CKGR_PLLAR_STUCKTO1 | \r
+        PMC_SetPllA( CKGR_PLLAR_STUCKTO1 |\r
                      CKGR_PLLAR_PLLACOUNT(0x3F) |\r
                      CKGR_PLLAR_OUTA(0x0) |\r
-                     CKGR_PLLAR_MULA(65) | \r
-                     CKGR_PLLAR_DIVA(1), \r
+                     CKGR_PLLAR_MULA(65) |\r
+                     CKGR_PLLAR_DIVA(1),\r
                      0x3u << 8);\r
         PMC_SetMckPllaDiv(PMC_MCKR_PLLADIV2_DIV2);\r
         PMC_SetMckPrescaler(PMC_MCKR_PRES_CLOCK);\r
index a2aeb93a8ef1c99919b6580808158e0c5c15f2db..d29cae23348252fcfbd98caaeabc4bcbcf28016f 100644 (file)
@@ -1,5 +1,5 @@
 /* ----------------------------------------------------------------------------\r
- *         SAM Software Package License \r
+ *         SAM Software Package License\r
  * ----------------------------------------------------------------------------\r
  * Copyright (c) 2013, Atmel Corporation\r
  *\r
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
  * ----------------------------------------------------------------------------\r
  */\r
\r
+\r
 /** \file */\r
 \r
-/** \r
+/**\r
  * \addtogroup mmu MMU Initialization\r
  *\r
  * \section Usage\r
@@ -38,7 +38,7 @@
  * translation table entries. TLBs avoid the requirement for every memory access to perform a translation table\r
  * lookup. The ARM architecture does not specify the exact form of the TLB structures for any design. In a\r
  * similar way to the requirements for caches, the architecture only defines certain principles for TLBs:\r
- * \r
+ *\r
  * The MMU supports memory accesses based on memory sections or pages:\r
  * Supersections Consist of 16MB blocks of memory. Support for Supersections is optional.\r
  * -# Sections Consist of 1MB blocks of memory.\r
@@ -54,7 +54,7 @@
  * \ref mmu.c\n\r
  * \ref mmu.h \n\r
  */\r
\r
+\r
 /*------------------------------------------------------------------------------ */\r
 /*         Headers                                                               */\r
 /*------------------------------------------------------------------------------ */\r
@@ -240,4 +240,4 @@ void MMU_Initialize(uint32_t *pTB)
     CP15_WriteTTB((unsigned int)pTB);\r
     /* Program the domain access register */\r
     CP15_WriteDomainAccessControl(0xC0000000); // only domain 15: access are not checked\r
-}
\ No newline at end of file
+}\r
index 8acbbd3c2cf78da1ae6298e2c634a899f71813f7..3cb73a4c6648e45a5429e051bdf80bc1ab43e8fe 100644 (file)
@@ -477,8 +477,9 @@ void USBDCallbacks_Initialized( void )
 {\r
        /* CDC specific re-implementation of weak callback function.  Invoked after\r
        the USB driver has been initialised. By default, configures the UDP/UDPHS\r
-       interrupt. */\r
-       IRQ_ConfigureIT( ID_UDPHS, 0, USBD_IrqHandler );\r
+       interrupt.  The interrupt priority is set to the highest to ensure the\r
+       interrupt nesting tests interfer as little as possible with the USB. */\r
+       IRQ_ConfigureIT( ID_UDPHS, 7, USBD_IrqHandler );\r
        IRQ_EnableIT( ID_UDPHS );\r
 }\r
 /*-----------------------------------------------------------*/\r
index dcfb963c2270b5bf169c3b2accf6290ff8068b0e..afa4c9380d47e25d7719e6c5c5806609049d8fe8 100644 (file)
@@ -87,7 +87,7 @@
 #define configUSE_TICK_HOOK                                            1\r
 #define configMAX_PRIORITIES                                   ( 5 )\r
 #define configMINIMAL_STACK_SIZE                               ( ( unsigned short ) 160 )\r
-#define configTOTAL_HEAP_SIZE                                  ( ( size_t ) ( 38912 ) )\r
+#define configTOTAL_HEAP_SIZE                                  ( ( size_t ) ( 45 * 1024 ) )\r
 #define configMAX_TASK_NAME_LEN                                        ( 10 )\r
 #define configUSE_TRACE_FACILITY                               1\r
 #define configUSE_16_BIT_TICKS                                 0\r
 #define configQUEUE_REGISTRY_SIZE                              8\r
 #define configCHECK_FOR_STACK_OVERFLOW                 2\r
 #define configUSE_RECURSIVE_MUTEXES                            1\r
-#define configUSE_MALLOC_FAILED_HOOK                   0\r
+#define configUSE_MALLOC_FAILED_HOOK                   1\r
 #define configUSE_APPLICATION_TASK_TAG                 0\r
 #define configUSE_COUNTING_SEMAPHORES                  1\r
 \r
 /* Co-routine definitions. */\r
-#define configUSE_CO_ROUTINES                  0\r
-#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )\r
+#define configUSE_CO_ROUTINES                                  0\r
+#define configMAX_CO_ROUTINE_PRIORITIES                ( 2 )\r
 \r
 /* Software timer definitions. */\r
-#define configUSE_TIMERS                               1\r
-#define configTIMER_TASK_PRIORITY              ( configMAX_PRIORITIES - 1 )\r
-#define configTIMER_QUEUE_LENGTH               5\r
-#define configTIMER_TASK_STACK_DEPTH   ( configMINIMAL_STACK_SIZE * 2 )\r
+#define configUSE_TIMERS                                               1\r
+#define configTIMER_TASK_PRIORITY                              ( configMAX_PRIORITIES - 1 )\r
+#define configTIMER_QUEUE_LENGTH                               5\r
+#define configTIMER_TASK_STACK_DEPTH                   ( configMINIMAL_STACK_SIZE * 2 )\r
 \r
 /* Set the following definitions to 1 to include the API function, or zero\r
 to exclude the API function. */\r
-#define INCLUDE_vTaskPrioritySet                       1\r
-#define INCLUDE_uxTaskPriorityGet                      1\r
-#define INCLUDE_vTaskDelete                                    1\r
-#define INCLUDE_vTaskCleanUpResources          1\r
-#define INCLUDE_vTaskSuspend                           1\r
-#define INCLUDE_vTaskDelayUntil                                1\r
-#define INCLUDE_vTaskDelay                                     1\r
-#define INCLUDE_eTaskGetState                          1\r
-#define INCLUDE_xEventGroupSetBitFromISR       1\r
-#define INCLUDE_xTimerPendFunctionCall         1\r
+#define INCLUDE_vTaskPrioritySet                               1\r
+#define INCLUDE_uxTaskPriorityGet                              1\r
+#define INCLUDE_vTaskDelete                                            1\r
+#define INCLUDE_vTaskCleanUpResources                  1\r
+#define INCLUDE_vTaskSuspend                                   1\r
+#define INCLUDE_vTaskDelayUntil                                        1\r
+#define INCLUDE_vTaskDelay                                             1\r
+#define INCLUDE_eTaskGetState                                  1\r
+#define INCLUDE_xEventGroupSetBitFromISR               1\r
+#define INCLUDE_xTimerPendFunctionCall                 1\r
 \r
 /* This demo makes use of one or more example stats formatting functions.  These\r
 format the raw data provided by the uxTaskGetSystemState() function in to human\r
@@ -140,13 +140,16 @@ FreeRTOS/Source/tasks.c for limitations. */
 /* Prevent C code being included in assembly files when the IAR compiler is\r
 used. */\r
 #ifndef __IASMARM__\r
-       /* Run time stats gathering definitions. */\r
-       unsigned long ulGetRunTimeCounterValue( void );\r
-       void vInitialiseRunTimeStats( void );\r
 \r
-       #define configGENERATE_RUN_TIME_STATS   0\r
-//_RB_ #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vInitialiseRunTimeStats()\r
-//_RB_ #define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeCounterValue()\r
+       /* The interrupt nesting test creates a 20KHz timer.  For convenience the\r
+       20KHz timer is also used to generate the run time stats time base, removing\r
+       the need to use a separate timer for that purpose.  The 20KHz timer\r
+       increments ulHighFrequencyTimerCounts, which is used as the time base.\r
+       Therefore the following macro is not implemented. */\r
+       #define configGENERATE_RUN_TIME_STATS   1\r
+       extern volatile uint32_t ulHighFrequencyTimerCounts;\r
+       #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()\r
+       #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerCounts\r
 \r
        /* The size of the global output buffer that is available for use when there\r
        are multiple command interpreters running at once (for example, one on a UART\r
index d034a4463b5ebbbd4bb2012e2bfd3b5b232ac8ee..e90c521f75b0344a1512211921463aafcd2a0ac6 100644 (file)
@@ -88,6 +88,8 @@ static void System_Handler( void );
 \r
 static void System_Handler( void )\r
 {\r
+       __enable_interrupt();\r
+\r
        /* See the comments above the function prototype in this file. */\r
        FreeRTOS_Tick_Handler();\r
 }\r
@@ -113,7 +115,7 @@ void vConfigureTickInterrupt( void )
        /* Configure interrupt on PIT.  Note this is on the system interrupt, which\r
        is shared with other system peripherals, so System_Handler() must be\r
        installed in place of FreeRTOS_Tick_Handler() if other system handlers are\r
-       required. */\r
+       required.  The tick must be given the lowest priority (0 in the SAMA5 AIC) */\r
        IRQ_ConfigureIT( ID_PIT, 0, FreeRTOS_Tick_Handler );\r
        /* See commend directly above IRQ_ConfigureIT( ID_PIT, 0, System_Handler ); */\r
        IRQ_EnableIT( ID_PIT );\r
@@ -129,5 +131,3 @@ void vConfigureTickInterrupt( void )
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-\r
-\r
index 4c648d874287c0433fd58c3cfe23fa0638a1be09..8a11f5f5a0b29d01ae6ea69a61e19205cc79d063 100644 (file)
 /*\r
  * This file initialises three timers as follows:\r
  *\r
- * Timer 0 and Timer 1 provide the interrupts that are used with the IntQ\r
+ * TC0 channels 0 and 1 provide the interrupts that are used with the IntQ\r
  * standard demo tasks, which test interrupt nesting and using queues from\r
- * interrupts.  Both these interrupts operate below the maximum syscall\r
- * interrupt priority.\r
+ * interrupts.  As the interrupt is shared the nesting achieved is not as deep\r
+ * as normal when this test is executed, but still worth while.\r
  *\r
- * Timer 2 is a much higher frequency timer that tests the nesting of interrupts\r
- * that execute above the maximum syscall interrupt priority.\r
+ * TC2 channel 0 provides a much higher frequency timer that tests the nesting of\r
+ * interrupts that execute above the maximum syscall interrupt priority.\r
  *\r
  * All the timers can nest with the tick interrupt - creating a maximum\r
- * interrupt nesting depth of 4.\r
+ * interrupt nesting depth of 3 (normally 4, if the first two timers used\r
+ * separate interrupts).\r
  *\r
  * For convenience, the high frequency timer is also used to provide the time\r
  * base for the run time stats.\r
 #include "IntQueueTimer.h"\r
 #include "IntQueue.h"\r
 \r
+/* Library includes. */\r
+#include "board.h"\r
+\r
 /* The frequencies at which the first two timers expire are slightly offset to\r
-ensure they don't remain synchronised.  The frequency of the interrupt that\r
-operates above the max syscall interrupt priority is 10 times faster so really\r
-hammers the interrupt entry and exit code. */\r
+ensure they don't remain synchronised.  The frequency of the highest priority\r
+interrupt is 20 times faster so really hammers the interrupt entry and exit\r
+code. */\r
 #define tmrTIMERS_USED 3\r
 #define tmrTIMER_0_FREQUENCY   ( 2000UL )\r
-#define tmrTIMER_1_FREQUENCY   ( 2001UL )\r
+#define tmrTIMER_1_FREQUENCY   ( 2003UL )\r
 #define tmrTIMER_2_FREQUENCY   ( 20000UL )\r
 \r
-/*-----------------------------------------------------------*/\r
+/* The channels used in TC0 for generating the three interrupts. */\r
+#define tmrTC0_CHANNEL_0               0 /* At tmrTIMER_0_FREQUENCY */\r
+#define tmrTC0_CHANNEL_1               1 /* At tmrTIMER_1_FREQUENCY */\r
+#define tmrTC1_CHANNEL_0               0 /* At tmrTIMER_2_FREQUENCY */\r
 \r
-/*\r
- * The single interrupt service routines that is used to service all three\r
- * timers.\r
- */\r
-static void prvTimerHandler( void *CallBackRef );\r
+/* The bit within the RC_SR register that indicates an RC compare. */\r
+#define tmrRC_COMPARE                  ( 1UL << 4UL )\r
 \r
+/* The high frequency interrupt given the highest priority or all.  The priority\r
+of the lower frequency timers must still be above the tick interrupt priority. */\r
+#define tmrLOWER_PRIORITY              1\r
+#define tmrHIGHER_PRIORITY             5\r
 /*-----------------------------------------------------------*/\r
 \r
+/* Handlers for the three timer channels. */\r
+static void prvTC0_Handler( void );\r
+static void prvTC1_Handler( void );\r
+\r
 /* Used to provide a means of ensuring the intended interrupt nesting depth is\r
 actually being reached. */\r
 extern uint32_t ulPortInterruptNesting;\r
@@ -120,11 +132,76 @@ volatile uint32_t ulHighFrequencyTimerCounts = 0;
 \r
 void vInitialiseTimerForIntQueueTest( void )\r
 {\r
+const uint32_t ulDivider = 128UL, ulTCCLKS = 3UL;\r
+\r
+       /* Enable the TC clocks. */\r
+       PMC->PMC_PCER0 = 1 << ID_TC0;\r
+       PMC->PMC_PCER0 = 1 << ID_TC1;\r
+\r
+       /* Configure TC0 channel 0 for a tmrTIMER_0_FREQUENCY frequency and trigger\r
+       on RC compare. */\r
+       TC_Configure( TC0, tmrTC0_CHANNEL_0, ulTCCLKS | TC_CMR_CPCTRG );\r
+       TC0->TC_CHANNEL[ tmrTC0_CHANNEL_0 ].TC_RC = BOARD_MCK / ( tmrTIMER_0_FREQUENCY * ulDivider );\r
+       TC0->TC_CHANNEL[ tmrTC0_CHANNEL_0 ].TC_IER = TC_IER_CPCS;\r
+\r
+       /* Configure TC0 channel 1 for a tmrTIMER_1_FREQUENCY frequency and trigger\r
+       on RC compare. */\r
+       TC_Configure( TC0, tmrTC0_CHANNEL_1, ulTCCLKS | TC_CMR_CPCTRG );\r
+       TC0->TC_CHANNEL[ tmrTC0_CHANNEL_1 ].TC_RC = BOARD_MCK / ( tmrTIMER_1_FREQUENCY * ulDivider );\r
+       TC0->TC_CHANNEL[ tmrTC0_CHANNEL_1 ].TC_IER = TC_IER_CPCS;\r
+\r
+       /* Configure TC1 channel 0 tmrTIMER_2_FREQUENCY frequency and trigger on\r
+       RC compare. */\r
+       TC_Configure( TC1, tmrTC1_CHANNEL_0, ulTCCLKS | TC_CMR_CPCTRG );\r
+       TC1->TC_CHANNEL[ tmrTC1_CHANNEL_0 ].TC_RC = BOARD_MCK / ( tmrTIMER_2_FREQUENCY * ulDivider );\r
+       TC1->TC_CHANNEL[ tmrTC1_CHANNEL_0 ].TC_IER = TC_IER_CPCS;\r
+\r
+       /* Enable interrupts and start the timers. */\r
+       IRQ_ConfigureIT( ID_TC0, tmrLOWER_PRIORITY, prvTC0_Handler );\r
+       IRQ_ConfigureIT( ID_TC1, tmrHIGHER_PRIORITY, prvTC1_Handler );\r
+       IRQ_EnableIT( ID_TC0 );\r
+       IRQ_EnableIT( ID_TC1 );\r
+       TC_Start( TC0, tmrTC0_CHANNEL_0 );\r
+       TC_Start( TC0, tmrTC0_CHANNEL_1 );\r
+       TC_Start( TC1, tmrTC1_CHANNEL_0 );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-static void prvTimerHandler( void *pvCallBackRef )\r
+static void prvTC0_Handler( void )\r
 {\r
-       ( void ) pvCallBackRef;\r
+#warning Why can interrupts only be enabled inside the C function?\r
+       __enable_interrupt();\r
+\r
+    /* Read will clear the status bit. */\r
+       if( ( TC0->TC_CHANNEL[ tmrTC0_CHANNEL_0 ].TC_SR & tmrRC_COMPARE ) != 0 )\r
+       {\r
+               portYIELD_FROM_ISR( xFirstTimerHandler() );\r
+       }\r
+\r
+       if( ( TC0->TC_CHANNEL[ tmrTC0_CHANNEL_1 ].TC_SR & tmrRC_COMPARE ) != 0 )\r
+       {\r
+               portYIELD_FROM_ISR( xSecondTimerHandler() );\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvTC1_Handler( void )\r
+{\r
+volatile uint32_t ulDummy;\r
+\r
+       __enable_interrupt();\r
+\r
+    /* Dummy read to clear status bit. */\r
+    ulDummy = TC1->TC_CHANNEL[ tmrTC1_CHANNEL_0 ].TC_SR;\r
+\r
+       /* Latch the maximum nesting count. */\r
+       if( ulPortInterruptNesting > ulMaxRecordedNesting )\r
+       {\r
+               ulMaxRecordedNesting = ulPortInterruptNesting;\r
+       }\r
+\r
+       /* Keep a count of the number of interrupts to use as a time base for the\r
+       run-time stats. */\r
+       ulHighFrequencyTimerCounts++;\r
 }\r
 \r
index eb60eed62c869f7b1070220fd74e06c798d1ff71..1eff84509612a2ad97c9fb1b8f0c9800e1a91c72 100644 (file)
@@ -233,7 +233,7 @@ void main_full( void )
        /* Start all the other standard demo/test tasks.  They have not particular\r
        functionality, but do demonstrate how to use the FreeRTOS API and test the\r
        kernel port. */\r
-//_RB_ vStartInterruptQueueTasks();\r
+       vStartInterruptQueueTasks();\r
        vStartDynamicPriorityTasks();\r
        vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );\r
        vCreateBlockTimeTasks();\r
@@ -251,7 +251,7 @@ void main_full( void )
        vUARTCommandConsoleStart( mainUART_COMMAND_CONSOLE_STACK_SIZE, mainUART_COMMAND_CONSOLE_TASK_PRIORITY );\r
 \r
        /* Register the standard CLI commands. */\r
-//     vRegisterSampleCLICommands();\r
+       vRegisterSampleCLICommands();\r
 \r
        /* Create the register check tasks, as described at the top of this     file */\r
        xTaskCreate( prvRegTestTaskEntry1, "Reg1", configMINIMAL_STACK_SIZE, mainREG_TEST_TASK_1_PARAMETER, tskIDLE_PRIORITY, NULL );\r
@@ -313,7 +313,7 @@ unsigned long ulErrorFound = pdFALSE;
                that they are all still running, and that none have detected an error. */\r
                if( xAreIntQueueTasksStillRunning() != pdTRUE )\r
                {\r
-//_RB_                 ulErrorFound = pdTRUE;\r
+                       ulErrorFound = pdTRUE;\r
                }\r
 \r
                if( xAreMathsTaskStillRunning() != pdTRUE )\r
@@ -455,9 +455,41 @@ static void prvRegTestTaskEntry2( void *pvParameters )
 \r
 static void prvPseudoRandomiser( void *pvParameters )\r
 {\r
-const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL, ulMinDelay = ( 35 / portTICK_PERIOD_MS );\r
+const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL, ulMinDelay = ( 35 / portTICK_PERIOD_MS ), ulIBit = ( 1UL << 7UL );\r
 volatile uint32_t ulNextRand = ( uint32_t ) &pvParameters, ulValue;\r
 \r
+       /* A few minor port tests before entering the randomiser loop.\r
+\r
+       At this point interrupts should be enabled. */\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == 0 );\r
+\r
+       /* The CPU does not have an interrupt mask register, so critical sections\r
+       have to globally disable interrupts.  Therefore entering a critical section\r
+       should leave the I bit set. */\r
+       taskENTER_CRITICAL();\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == ulIBit );\r
+\r
+       /* Nest the critical sections. */\r
+       taskENTER_CRITICAL();\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == ulIBit );\r
+\r
+       /* After yielding the I bit should still be set.  Note yielding is possible\r
+       in a critical section as each task maintains its own critical section\r
+       nesting count so some tasks are in critical sections and others are not -\r
+       however this is *not* something task code should do! */\r
+       taskYIELD();\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == ulIBit );\r
+\r
+       /* The I bit should not be cleared again until both critical sections have\r
+       been exited. */\r
+       taskEXIT_CRITICAL();\r
+       taskYIELD();\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == ulIBit );\r
+       taskEXIT_CRITICAL();\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == 0 );\r
+       taskYIELD();\r
+       configASSERT( ( __get_CPSR() & ulIBit ) == 0 );\r
+\r
        /* This task does nothing other than ensure there is a little bit of\r
        disruption in the scheduling pattern of the other tasks.  Normally this is\r
        done by generating interrupts at pseudo random times. */\r
index 55d30dbf7044e22669f010ec427b51912bb78ff5..df27bd85a85732c63f1d3e6b38c04ce43dc1b2e6 100644 (file)
           <name>CCDefines</name>\r
           <state>sama5d3x</state>\r
           <state>sram</state>\r
-          <state>TRACE_LEVEL=4</state>\r
+          <state>TRACE_LEVEL=0</state>\r
         </option>\r
         <option>\r
           <name>CCPreprocFile</name>\r
         <name>$PROJ_DIR$\..\Common\Minimal\TimerDemo.c</name>\r
       </file>\r
     </group>\r
+    <file>\r
+      <name>$PROJ_DIR$\CDCCommandConsole.c</name>\r
+    </file>\r
     <file>\r
       <name>$PROJ_DIR$\Full_Demo\IntQueueTimer.c</name>\r
     </file>\r
     <file>\r
       <name>$PROJ_DIR$\Full_Demo\reg_test.S</name>\r
     </file>\r
+    <file>\r
+      <name>$PROJ_DIR$\..\..\..\FreeRTOS-Plus\Demo\Common\FreeRTOS_Plus_CLI_Demos\Sample-CLI-commands.c</name>\r
+    </file>\r
   </group>\r
   <file>\r
     <name>$PROJ_DIR$\atmel_main.c</name>\r
   </file>\r
-  <file>\r
-    <name>$PROJ_DIR$\CDCCommandConsole.c</name>\r
-  </file>\r
   <file>\r
     <name>$PROJ_DIR$\cstartup_with_FreeRTOS_vectors.s</name>\r
   </file>\r
index 5b6c331ecbce393221e94c1a5c93ad28da8c6584..f1225de18b771e42d46ef81960501af2af06cae3 100644 (file)
@@ -140,10 +140,14 @@ label:
         MSR     cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT      ; Change the mode\r
         LDR     sp, =SFE(IRQ_STACK)\r
 \r
-        /* Set up the SYS stack pointer. */\r
-        MSR     cpsr_c, #ARM_MODE_SYS | F_BIT              ; Change the mode\r
+        /* Set up the SVC stack pointer.  This allows the stack used by main()\r
+               to get reused by interrupts (which switch from IRQ mode to SVC mode). */\r
+        MSR     cpsr_c, #ARM_MODE_SVC | F_BIT              ; Change the mode\r
         LDR     sp, =SFE(CSTACK)\r
 \r
+               /* No need to set up stacks for any other mode as that stack used by\r
+               tasks is allocated by FreeRTOS. */\r
+\r
         /* Branch to main() */\r
         LDR     r0, =?main\r
         BLX     r0\r
index 4923fd1d2381dd848ddbb204ce8733a86d65081c..1cb080b7c4299d8e4fbe20a8fdf6ba25d371d521 100644 (file)
@@ -126,8 +126,7 @@ void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );
 void vApplicationTickHook( void );\r
 \r
 /*-----------------------------------------------------------*/\r
-\r
-#warning Try re-using the main stack.\r
+#warning check stack sizes in linker script.\r
 int main( void )\r
 {\r
        /* Configure the hardware ready to run the demo. */\r
index bdabf077877c88de262c0f1db8413f044bb3ecf5..9e63dcc510234a4b84499c882dcecf03876d618d 100644 (file)
@@ -8,11 +8,11 @@
         \r
       <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1622</ColumnWidth1></Debug-Log>\r
       <Build>\r
-        <ColumnWidth0>20</ColumnWidth0>\r
-        <ColumnWidth1>1216</ColumnWidth1>\r
-        <ColumnWidth2>324</ColumnWidth2>\r
-        <ColumnWidth3>81</ColumnWidth3>\r
-      </Build>\r
+        \r
+        \r
+        \r
+        \r
+      <ColumnWidth0>20</ColumnWidth0><ColumnWidth1>1216</ColumnWidth1><ColumnWidth2>324</ColumnWidth2><ColumnWidth3>81</ColumnWidth3></Build>\r
       <Workspace>\r
         <ColumnWidths>\r
           \r
           \r
           \r
         <item>500</item><item>20</item></col-widths>\r
-        <DisasmHistory><item>0x00302750</item></DisasmHistory>\r
+        <DisasmHistory><item>0x0030211C</item><item>0x00302750</item></DisasmHistory>\r
         \r
         \r
       <PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ShowCodeCoverage>1</ShowCodeCoverage><ShowInstrProfiling>1</ShowInstrProfiling></Disassembly>\r
-    <Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><WATCH_1><expressions><item></item></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>207</item><item>150</item><item>100</item><item>294</item></col-widths><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></WATCH_1><CallStack><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><col-names><item>Frame</item><item>_I0</item></col-names><col-widths><item>400</item><item>20</item></col-widths></CallStack><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><col-names><item>Breakpoint</item><item>_I0</item></col-names><col-widths><item>500</item><item>35</item></col-widths></Breakpoints><Find-in-Files><ColumnWidth0>497</ColumnWidth0><ColumnWidth1>82</ColumnWidth1><ColumnWidth2>746</ColumnWidth2><ColumnWidth3>331</ColumnWidth3></Find-in-Files></Static>\r
+    <Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><WATCH_1><expressions><item></item></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>207</item><item>150</item><item>100</item><item>294</item></col-widths><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></WATCH_1><CallStack><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><col-names><item>Frame</item><item>_I0</item></col-names><col-widths><item>400</item><item>20</item></col-widths></CallStack><Breakpoints><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><col-names><item>Breakpoint</item><item>_I0</item></col-names><col-widths><item>500</item><item>35</item></col-widths></Breakpoints><Find-in-Files><ColumnWidth0>497</ColumnWidth0><ColumnWidth1>82</ColumnWidth1><ColumnWidth2>746</ColumnWidth2><ColumnWidth3>331</ColumnWidth3></Find-in-Files><QuickWatch><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>100</item><item>150</item><item>100</item><item>100</item></col-widths><QWatchHistory><item>TC0</item><item>TC0-&gt;TC_CHANNEL[ tmrTC0_CHANNEL_0 ].TC_RC</item></QWatchHistory></QuickWatch></Static>\r
     <Windows>\r
       \r
       \r
@@ -63,7 +63,7 @@
             <Factory>Workspace</Factory>\r
             <Session>\r
               \r
-            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS Source</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS Source/portable</ExpandedNode></NodeDict></Session>\r
+            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/Full Demo</ExpandedNode></NodeDict></Session>\r
           </Tab>\r
         </Tabs>\r
         \r
       \r
       \r
       \r
-    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\CDCCommandConsole.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>397</YPos2><SelStart2>14920</SelStart2><SelEnd2>14920</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>110</YPos2><SelStart2>6002</SelStart2><SelEnd2>6002</SelEnd2></Tab><ActiveTab>1</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\ARM_CA5_No_GIC\port.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>288</YPos2><SelStart2>12369</SelStart2><SelEnd2>12369</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\Full_Demo\main_full.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>370</YPos2><SelStart2>15067</SelStart2><SelEnd2>15067</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\AtmelFiles\usb\common\core\USBDescriptors.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>165</YPos2><SelStart2>6026</SelStart2><SelEnd2>6026</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>109</YPos2><SelStart2>6007</SelStart2><SelEnd2>6007</SelEnd2></Tab><ActiveTab>2</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\CDCCommandConsole.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>309</YPos2><SelStart2>11984</SelStart2><SelEnd2>11984</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\Full_Demo\IntQueueTimer.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>162</YPos2><SelStart2>8098</SelStart2><SelEnd2>8116</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\tasks.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>1561</YPos2><SelStart2>55424</SelStart2><SelEnd2>55424</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\ARM_CA5_No_GIC\portmacro.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>107</YPos2><SelStart2>5219</SelStart2><SelEnd2>5219</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
     <Positions>\r
       \r
       \r
       \r
       \r
       \r
-    <Top><Row0><Sizes><Toolbar-00C8A108><key>iaridepm.enu1</key></Toolbar-00C8A108></Sizes></Row0><Row1><Sizes><Toolbar-14AD33B8><key>debuggergui.enu1</key></Toolbar-14AD33B8></Sizes></Row1></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>718</Bottom><Right>332</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>119048</sizeHorzCX><sizeHorzCY>203252</sizeHorzCY><sizeVertCX>198810</sizeVertCX><sizeVertCY>731707</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><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>203252</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203252</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+    <Top><Row0><Sizes><Toolbar-0104A108><key>iaridepm.enu1</key></Toolbar-0104A108></Sizes></Row0><Row1><Sizes><Toolbar-16133258><key>debuggergui.enu1</key></Toolbar-16133258></Sizes></Row1></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>718</Bottom><Right>332</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>119048</sizeHorzCX><sizeHorzCY>203252</sizeHorzCY><sizeVertCX>198810</sizeVertCX><sizeVertCY>731707</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><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>203252</sizeHorzCY><sizeVertCX>119048</sizeVertCX><sizeVertCY>203252</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
   </Desktop>\r
 </Project>\r
 \r
index 46e71dad308d37dc7dd5fa7f92e56d994c90e450..62ddf207369a175341fb85c85b89fc39e99306df 100644 (file)
@@ -14,7 +14,7 @@ Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
 Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0\r
 CStepIntDis=_ 0\r
 [DebugChecksum]\r
-Checksum=1771823120\r
+Checksum=1546321988\r
 [Exceptions]\r
 StopOnUncaught=_ 0\r
 StopOnThrow=_ 0\r
@@ -23,7 +23,7 @@ ShowArgs=0
 [Disassembly]\r
 MixedMode=1\r
 [watch_formats]\r
-Fmt0={W}1:xTickCount   4       0\r
+Fmt0={W}1:xTickCount   3       0\r
 [Log file]\r
 LoggingEnabled=_ 0\r
 LogFile=_ ""\r
@@ -42,7 +42,8 @@ Exclusions=
 [Disassemble mode]\r
 mode=0\r
 [Breakpoints2]\r
-Count=0\r
+Bp0=_ 1 "EMUL_CODE" "{$PROJ_DIR$\main.c}.214.2" 0 0 1 "" 0 "" 0\r
+Count=1\r
 [Aliases]\r
 Count=0\r
 SuppressDialog=0\r
index 6f18f10c0ae7f9a69a188fc28d52e600d0608081..86cb815576fec93866df6a993634f756057e5379 100644 (file)
@@ -44,7 +44,7 @@
             <Factory>Workspace</Factory>\r
             <Session>\r
               \r
-            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS Source</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS Source/event_groups.c</ExpandedNode></NodeDict></Session>\r
+            <NodeDict><ExpandedNode>RTOSDemo</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS Source</ExpandedNode><ExpandedNode>RTOSDemo/FreeRTOS Source/portable</ExpandedNode><ExpandedNode>RTOSDemo/Full Demo</ExpandedNode></NodeDict></Session>\r
           </Tab>\r
         </Tabs>\r
         \r
       \r
       \r
       \r
-    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\CDCCommandConsole.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>397</YPos2><SelStart2>14920</SelStart2><SelEnd2>14920</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>110</YPos2><SelStart2>6002</SelStart2><SelEnd2>6002</SelEnd2></Tab><ActiveTab>1</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\ARM_CA5_No_GIC\port.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>288</YPos2><SelStart2>12369</SelStart2><SelEnd2>12369</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
+    <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\Full_Demo\main_full.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>370</YPos2><SelStart2>15067</SelStart2><SelEnd2>15067</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\AtmelFiles\usb\common\core\USBDescriptors.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>165</YPos2><SelStart2>6026</SelStart2><SelEnd2>6026</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>109</YPos2><SelStart2>6007</SelStart2><SelEnd2>6007</SelEnd2></Tab><ActiveTab>2</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\CDCCommandConsole.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>309</YPos2><SelStart2>11984</SelStart2><SelEnd2>11984</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\Full_Demo\IntQueueTimer.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>162</YPos2><SelStart2>8098</SelStart2><SelEnd2>8116</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\tasks.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>1561</YPos2><SelStart2>55424</SelStart2><SelEnd2>55424</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\Source\portable\IAR\ARM_CA5_No_GIC\portmacro.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>107</YPos2><SelStart2>5219</SelStart2><SelEnd2>5219</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>\r
     <Positions>\r
       \r
       \r
       \r
       \r
       \r
-    <Top><Row0><Sizes><Toolbar-00C8A108><key>iaridepm.enu1</key></Toolbar-00C8A108></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>698</Bottom><Right>352</Right><x>-2</x><y>-2</y><xscreen>190</xscreen><yscreen>170</yscreen><sizeHorzCX>113095</sizeHorzCX><sizeHorzCY>172764</sizeHorzCY><sizeVertCX>210714</sizeVertCX><sizeVertCY>711382</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>242</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>244</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>247967</sizeHorzCY><sizeVertCX>113095</sizeVertCX><sizeVertCY>172764</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
+    <Top><Row0><Sizes><Toolbar-0104A108><key>iaridepm.enu1</key></Toolbar-0104A108></Sizes></Row0><Row1><Sizes/></Row1></Top><Left><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>668</Bottom><Right>352</Right><x>-2</x><y>-2</y><xscreen>190</xscreen><yscreen>170</yscreen><sizeHorzCX>113095</sizeHorzCX><sizeHorzCY>172764</sizeHorzCY><sizeVertCX>210714</sizeVertCX><sizeVertCY>680894</sizeVertCY></Rect></Wnd2></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>272</Bottom><Right>1682</Right><x>-2</x><y>-2</y><xscreen>1684</xscreen><yscreen>274</yscreen><sizeHorzCX>1002381</sizeHorzCX><sizeHorzCY>278455</sizeHorzCY><sizeVertCX>113095</sizeVertCX><sizeVertCY>172764</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>\r
   </Desktop>\r
 </Workspace>\r
 \r
index 311e77dd92603514854eee179429d69b921c30d1..af660bf8437fccfd64c11d4fafce53e050368d4d 100644 (file)
@@ -1,2 +1,2 @@
 [MainWindow]\r
-WindowPlacement=_ 67 68 1327 817 3\r
+WindowPlacement=_ 68 69 855 818 3\r