Wierd timing error

I got a wierd timing problem. I have two tasks. There is a constant task switch between these two tasks. I use the cycle counter timer to measure the total length of the task switch. But here is the wierd part. When i add one line of code, the code is faster, than when i remove the line. How is this possible? when i add the code. the total cycles is: 4846. When i remove the line. the total cycles is: 4897. Below the source code:
/*******************************************************************
* Includes
*******************************************************************/
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "swv.h"
/*******************************************************************
* Defines
*******************************************************************/
#define COUNTER

#define MAX_LOOPS 10

#define DEMCR           (*((volatile uint32_t *)0xE000EDFC))
#define DWT_CTRL        (*(volatile uint32_t *)0xe0001000)

#define mainFIRST_TASK_PRIORITY (tskIDLE_PRIORITY + 2)
#define mainSECOND_TASK_PRIORITY (tskIDLE_PRIORITY + 2)

/*******************************************************************
* Types
*******************************************************************/
xTaskHandle xHandleFirst;
xTaskHandle xHandleSecond;
/*******************************************************************
* Data
*******************************************************************/
uint32_t m_nStart;               //DEBUG Stopwatch start cycle counter value
uint32_t m_nStop;                //DEBUG Stopwatch stop cycle counter value

/*******************************************************************
* Local Function Prototypes
*******************************************************************/
static void prvFirst(void *pvParameters);
static void prvSecond(void *pvParameters);

int main(void)
{
    /* Enable DWT */
    DEMCR |= 0x01000000;
    /* Enable CPU cycle counter */
    DWT_CTRL |= 1;

    while(1)
    {
        xTaskCreate(prvSecond, (const char *) "S",
                    configMINIMAL_STACK_SIZE,NULL,
                    mainSECOND_TASK_PRIORITY, &xHandleSecond);
        xTaskCreate(prvFirst, (const char *) "F",
                    configMINIMAL_STACK_SIZE,NULL,
                    mainFIRST_TASK_PRIORITY, &xHandleFirst);
        vTaskStartScheduler();
    }
}

//Task 1
static void prvFirst(void *pvParameters)
{
    while(1)
    {
        m_nStart = *((volatile uint32_t *)0xE0001004); // save clockcycle count
        for(uint32_t count1 = 0; count1 < MAX_LOOPS; count1++)
        {
            taskYIELD();
        }
        vTaskDelete(xHandleFirst);
    }
}

//task 2
static void prvSecond(void *pvParameters)
{
    while(1)
    {
        for (uint32_t count2 = 0; count2 < MAX_LOOPS-1; count2++)
        {
            taskYIELD();
        }
        m_nStop = *((volatile uint32_t *)0xE0001004); // save clockcycle count
        
// ADD ONE LINE OF CODE AFTER THIS. THE CODE RUNS FASTER
        SWV_printnum(m_nStop);
        SWV_puts("rn");
        SWV_printnum(m_nStart);
        SWV_puts("rn"); 
        
        vTaskDelete(xHandleSecond);
    }
    
}

Wierd timing error

When you say “// ADD ONE LINE OF CODE AFTER THIS. THE CODE RUNS FASTER” do you mean add a line of code between that comment and the call to SWV_printnum()? If so, what is the line? If you are trying to get the switch as fast as possible then:
  • ensure configCHECKFORSTACK_OVERFLOW is 0
  • ensure no trace macros are enabled
  • ensure run-time stats are disable
  • ensure configUSEPORTOPTIMISEDTASKSELECTION is set to 1.
Regards.

Wierd timing error

Thanks for the answer. When i remove one line of code below the “//ADD ONE LINE etc.. “the code runs faster. for example the line “SWV_puts(“rn”); With the settings you send i get the following timing: code: SWVprintnum(mnStop); SWVputs(“rn”); SWVprintnum(mnStart); SWVputs(“rn”); The timing is: 4542 code: SWVprintnum(mnStop); SWVputs(“rn”); SWVprintnum(mnStart); // SWVputs(“rn”); The timing is: 4488 So then its the other way aroud.. but its still wierd, because i already saved the clockcyclecounter..

Wierd timing error

Do you have compiler optimisation turned on? I suspect so. With optimisation turned off I would not expect any difference. Regards.

Wierd timing error

Compiler optimalisation and optiimize for time are turned off Compiler settings: –c99 -c –cpu Cortex-M4.fp -DEVAL -DMICROLIB -g -O0 –apcs=interwork –split_sections

Wierd timing error

After enabeling Flash prefetch, Instruction cache, Data cache, the delay is 50 ns instead of 5 ms