# FreeRTOS and power consumption

**URL:** <https://forums.freertos.org/t/freertos-and-power-consumption/3102>\
**Category:** Kernel\
**Created:** [June 19, 2014, 12:37pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102 "2014-06-19T12:37:31Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 19, 2014, 12:37pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/1 "2014-06-19T12:37:31Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Thursday, June 19, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#2a74):

Hi,  
I have a project running on STM32F2 ARM Cortex M3 CPU. We are trying to tune power consumption of the hardware. I personally trying to reduce CPU consumption. I came to the following situation:

- CPU is running at 120MHz. ART Accelerator is enabled.
- I have created NO TASK
- Before running vTaskStartScheduler() CPU consumes about 20mA
- After starting a scheduler CPU current rises up to 55mA

I know that FreeRTOS will create idle task and TimerTask (I have Timers enabled). But I can’t understand what specific CPU hardware is activated after starting scheduler that should consume 35mA. I do not believe SysTick interrupt can do it.  
According to STM datasheet CPU running at this clock at 3.3V with ART enabled and ALL PERIPHERAL ENABLED should consume up to 49mA. But in my case I have no peripheral enabled (except clocks and NVIC) and before scheduler is running power consumption is at 20mA.  
Can someone lite a light on the question what can cause to consume extra 35mA.  
Thanks.

---

<div class="post-metadata">

**Author:** ![rtel](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/rtel/32/31_2.png) [@rtel](https://forums.freertos.org/u/rtel)\
**Post date:** [June 19, 2014, 12:55pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/2 "2014-06-19T12:55:05Z")

</div>

**[rtel](https://sourceforge.net/u/rtel/)** wrote on [Thursday, June 19, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#3fd3):

The scheduler is just executable code running on the CPU. In a like for like situation it does not have the ability to increase the power consumed by the CPU. By in a like for like situation I mean:

- CPU running at the same frequency.
- The same peripherals, clocks and memories are enabled.
- The same amount of time is spent sleeping as opposed to running at full tilt.

Starting the scheduler will enable the SysTick timer - but nothing else. So that would have the potential to use extra power, but not 35mA worth.

When you run the system without FreeRTOS what is it doing? Is it running code all the time, or spending some time in sleep mode?

Using an RTOS can allow you to do more work for the same amount of power consumed simply by freeing up CPU time. That is done by ensuring everything is event driven, and absolutely no CPU cycles are wasted by polling anything.

In addition all RTOSs (that I am aware of) allow crude but very effective power saving by simply using the idle task to put the CPU into a low power state. Assuming your application is not going to use 100% of the CPU time this will give you massive power savings.

FreeRTOS goes further still, further than most conventional systems, by also allowing you to turn the tick interrupt off, enabling you to go into almost the deepest of the sleep modes available (not quite the deepest as the RAM and CPU register values must be retained). There is a generic Cortex-M tickless mode built into FreeRTOS, but the generic implementation is limited by the resolution and speed of the SysTick timer and the fact that the SysTick timer must remain on while in sleep mode. However the generic implementation can be overridden with a chip specific implementation that allows you to generate ticks from other time sources - low power 32-bit timers being the best. Here is an example running on an STM32L:

[http://www.freertos.org/STM32L-discovery-low-power-tickless-RTOS-demo.html](http://www.freertos.org/STM32L-discovery-low-power-tickless-RTOS-demo.html)

It is possible to get power consumption down to the uA level.

Regards.

---

<div class="post-metadata">

**Author:** ![htibosch](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/htibosch/32/62_2.png) [@htibosch](https://forums.freertos.org/u/htibosch)\
**Post date:** [June 19, 2014, 2:42pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/3 "2014-06-19T14:42:16Z")

</div>

**[heinbali01](https://sourceforge.net/u/heinbali01/)** wrote on [Thursday, June 19, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#9bff):

Hi,

I would also think that the extra 35mA is used because the CPU doesn’t sleep anymore.  
The prvIdleTask() function in task.c will be active 100% of the time, waiting for some event which never occurs.

The simplest way of reducing power would be to include a vApplicationIdleHook() handler which issues a sleep instruction.

The power consumption can be further reduced by using the tickless mode (configUSE\_TICKLESS\_IDLE). In this mode the kernel will calculate each time how long it may enter sleep mode. After waking up, it will calculate how long it has actually slept and update the tick counter accordingly.

You can go further, as Richard suggests, by using a low power 32-bit timer (a timer/counter). I used this method in a M4 and had the device sleep up to 35 seconds.

Note that by using tickless mode, there is no loss of performance, as long as the sleep will be ended by any interrupt source. The result of xTaskGetTickCount() may become a bit less reliable, because the actual sleep times will be estimated.

```auto

/* An example when using SYSTICK for tickless mode
 * on a CPU with 120 Mhz and a clock-tick of 1000 Hz */

/* 120,000,000 / 1,000 = 120,000 */
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
/* The maximum sleeping time is 139 ticks, 0.139 sec in this example */
/* 16,777,215 / 120,000 = 139 */
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER /
    ulTimerCountsForOneTick;

/* An example when using a 32-bit timer to wake-up from sleep */
/* 120,000,000 / 1,000 = 120,000 */
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
/* 4,294,967,295 / 120,000 = 35,791, or 35.8 seconds */
xMaximumPossibleSuppressedTicks = portMAX_32_BIT_NUMBER /
    ulTimerCountsForOneTick;
        

```

Regards.

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 19, 2014, 6:01pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/4 "2014-06-19T18:01:02Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Thursday, June 19, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#9bff/6a88):

Hi.  
Thanks for your help. You shouldn’t prove me advantages of os usage. I understand it and not going to stay without freertos.

Before starting scheduler my code initialize some peripherals. A few timers uart and some gpio. If I put while(1) before running scheduler I get 35ma less consumption.  
I’m trying to figure out what code may become running after scheduler started that can cause power consumption.

What about interrupts? Am I right that scheduler should configure and enable nvic?

Another concern is program flash usage. If I stop program with while(1) optimization strips off a lot of code. Can longer jumps and prefetch cash miss source 35mA?

---

<div class="post-metadata">

**Author:** ![rtel](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/rtel/32/31_2.png) [@rtel](https://forums.freertos.org/u/rtel)\
**Post date:** [June 19, 2014, 6:19pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/5 "2014-06-19T18:19:34Z")

</div>

**[rtel](https://sourceforge.net/u/rtel/)** wrote on [Thursday, June 19, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#d1dd):

> Another concern is program flash usage. If I stop program  
> with while(1) optimization strips off a lot of code. Can  
> longer jumps and prefetch cash miss source 35mA?

I suppose it would be possible, but I would doubt it.

Yes - when the scheduler is running the tick interrupt will be running, but I can’t image that would consume much more than just sitting in a while(1) loop using 100% CPU - other than your thoughts about longer jumps making use of more flash loads, etc.

Also, yes it configures the NVIC, but it does not enable it, it will be enabled already, all it does is set the priority of some of the system interrupts.

I would be interested to find the answer to this too. You could experiment by starting the scheduler without first creating any tasks, so only the Idle task runs, then measure the current. After that add the following code to the idle task hook function:

```auto
taskENTER_CRITICAL();
for( ;; );

```

That will leave it spinning in the idle task without the tick interrupt firing - does it make a difference to the current consumption?

Finally try adding a for( ;; ); loop before the call to vTaskStartScheduler() to see what the difference is.

How are you measuring the current? Externally, or getting the chip to measure it itself?

Regards,  
Richard Barry.

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 19, 2014, 8:07pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/6 "2014-06-19T20:07:56Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Thursday, June 19, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#d1dd/e117):

Thanks for your interest in this problem.  
I could continue experiments after weekend.

> How are you measuring the current? Externally, or getting the chip to  
> measure it itself?  
> Have a DVM connected to the CPU Vcc circuit. We rised up one resistor from  
> the power supply and put a DVD in series in amper-meter mode.

Interesting thing that my own bootloader running on the same board with  
FreeRTOS as well eats expected 20mA. Bootloader fits 32K and seats in first  
two 16K Flash segments.  
Well I will do what you have suggested and will let you know.

On Thu, Jun 19, 2014 at 9:19 PM, Real Time Engineers ltd. \<[rtel@users.sf.net](mailto:rtel@users.sf.net)

> wrote:

> Another concern is program flash usage. If I stop program  
> with while(1) optimization strips off a lot of code. Can  
> longer jumps and prefetch cash miss source 35mA?
> 
> I suppose it would be possible, but I would doubt it.
> 
> Yes - when the scheduler is running the tick interrupt will be running,  
> but I can’t image that would consume much more than just sitting in a  
> while(1) loop using 100% CPU - other than your thoughts about longer jumps  
> making use of more flash loads, etc.
> 
> Also, yes it configures the NVIC, but it does not enable it, it will be  
> enabled already, all it does is set the priority of some of the system  
> interrupts.
> 
> I would be interested to find the answer to this too. You could experiment  
> by starting the scheduler without first creating any tasks, so only the  
> Idle task runs, then measure the current. After that add the following code  
> to the idle task hook function:
> 
> taskENTER\_CRITICAL();for( ;; );
> 
> That will leave it spinning in the idle task without the tick interrupt  
> firing - does it make a difference to the current consumption?
> 
> Finally try adding a for( ;; ); loop before the call to  
> vTaskStartScheduler() to see what the difference is.
> 
> How are you measuring the current? Externally, or getting the chip to  
> measure it itself?
> 
> ## Regards, Richard Barry.
> 
> ## FreeRTOS and power consumption [https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/?limit=25#d1dd](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/?limit=25#d1dd)
> 
> Sent from [sourceforge.net](http://sourceforge.net) because you indicated interest in  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/p/freertos/discussion/382005/)
> 
> To unsubscribe from further messages, please visit  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/auth/subscriptions/)

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 24, 2014, 1:55pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/7 "2014-06-24T13:55:45Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Tuesday, June 24, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#d1dd/e117/1463):

Hi,  
Situation is absolutely awkful. I’ve spent a whole day today and here  
is what I have:  
My main looks like  
int main( void )  
{  
vTaskStartScheduler();  
while(1);  
}

This code eats 30mA with FreeRTOS 5.3.0  
But it eats 60mA with FreeRTOS 5.7.2  
If I add while(1) to TICK\_HOOK i get desired 30mA  
But even with 5.3.0 I can’t get it at 30mA after I add a few more  
lines of code before starting schedulers. Code is not HW related.  
At the same time my own bootloader that is running on the same boards  
stays stable at 30mA with both 5.3.0 and 5.7.2

I’m lost…

---

<div class="post-metadata">

**Author:** ![rtel](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/rtel/32/31_2.png) [@rtel](https://forums.freertos.org/u/rtel)\
**Post date:** [June 24, 2014, 2:42pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/8 "2014-06-24T14:42:05Z")

</div>

**[rtel](https://sourceforge.net/u/rtel/)** wrote on [Tuesday, June 24, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#8817):

This really is a mystery.

V5.3.0 is really (really) old, so a lot has changed since then, but there is no V5.7.2 so I don’t think that is what you meant. Can you give me the real version number so I can see what has changed between the two. ([http://www.freertos.org/History.txt](http://www.freertos.org/History.txt))

Are you using the same FreeRTOSConfig.h in each case?

Regards.

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 24, 2014, 2:57pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/9 "2014-06-24T14:57:12Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Tuesday, June 24, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#8817/6b67):

Sorry the versions are 7.3.0 and 7.5.2.  
I do not think problem is related to FreeRTOS although. Better give me  
any Idea what can cause to STM32F2 CPU consume extra 30mA

On Tue, Jun 24, 2014 at 5:42 PM, Real Time Engineers ltd.  
[rtel@users.sf.net](mailto:rtel@users.sf.net) wrote:

> This really is a mystery.
> 
> V5.3.0 is really (really) old, so a lot has changed since then, but there is  
> no V5.7.2 so I don’t think that is what you meant. Can you give me the real  
> version number so I can see what has changed between the two.  
> ([http://www.freertos.org/History.txt](http://www.freertos.org/History.txt))
> 
> Are you using the same FreeRTOSConfig.h in each case?
> 
> Regards.
> 
> * * *
> 
> FreeRTOS and power consumption
> 
> * * *
> 
> Sent from [sourceforge.net](http://sourceforge.net) because you indicated interest in  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/p/freertos/discussion/382005/)
> 
> To unsubscribe from further messages, please visit  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/auth/subscriptions/)

---

<div class="post-metadata">

**Author:** ![rtel](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/rtel/32/31_2.png) [@rtel](https://forums.freertos.org/u/rtel)\
**Post date:** [June 24, 2014, 3:06pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/10 "2014-06-24T15:06:17Z")

</div>

**[rtel](https://sourceforge.net/u/rtel/)** wrote on [Tuesday, June 24, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#f896):

So between those two versions some ‘improvements’ were made to the tickless idle functionality. Can you confirm that you have configUSE\_TICKLESS\_IDLE either undefined, or defined to 0 in FreeRTOSConfig.h? If so, then that will make no difference between the two versions.

There were also a few additional barrier instructions added to the Cortex-M port, but that is not going to make such a huge difference, if any at all.

Regards.

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 24, 2014, 3:09pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/11 "2014-06-24T15:09:35Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Tuesday, June 24, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#f896/acd7):

Confirm I do not touch configUSE\_TICKLESS\_IDLE (not defined)

On Tue, Jun 24, 2014 at 6:06 PM, Real Time Engineers ltd.  
[rtel@users.sf.net](mailto:rtel@users.sf.net) wrote:

> So between those two versions some ‘improvements’ were made to the tickless  
> idle functionality. Can you confirm that you have configUSE\_TICKLESS\_IDLE  
> either undefined, or defined to 0 in FreeRTOSConfig.h? If so, then that will  
> make no difference between the two versions.
> 
> There were also a few additional barrier instructions added to the Cortex-M  
> port, but that is not going to make such a huge difference, if any at all.
> 
> Regards.
> 
> * * *
> 
> FreeRTOS and power consumption
> 
> * * *
> 
> Sent from [sourceforge.net](http://sourceforge.net) because you indicated interest in  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/p/freertos/discussion/382005/)
> 
> To unsubscribe from further messages, please visit  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/auth/subscriptions/)

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 26, 2014, 7:34pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/12 "2014-06-26T19:34:28Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Thursday, June 26, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#f896/acd7/d597):

Hi,  
I’ve found a way to reduce power to desired 30mA. Once I disable  
vTaskDelete with

#define INCLUDE\_vTaskDelete 0

Power consumption gots down.

In my code I have a calls to vTaskDelete but only upon critical errors  
that does not actually happen. So I’m sure vTaskDelete function is not  
invocated.  
I’ve looked at all places where INCLUDE\_vTaskDelete is #ifdef’ed and  
do not see any logical explanation on how this can influence on power  
consumption. I recall I’m using v7.5.2. Maybe you have any idea?

---

<div class="post-metadata">

**Author:** ![rtel](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/rtel/32/31_2.png) [@rtel](https://forums.freertos.org/u/rtel)\
**Post date:** [June 26, 2014, 7:59pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/13 "2014-06-26T19:59:19Z")

</div>

**[rtel](https://sourceforge.net/u/rtel/)** wrote on [Thursday, June 26, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#c8cf):

I can’t see why that would make a difference.

If INCLUDE\_vTaskDelete is 0 then the function prvCheckTasksWaitingTermination() which is called repeatedly from the idle task would not do anything, but most of the time all it would do is one comparison anyway, so I can’t see how it would effect power consumption. Maybe as an experiment you could set INCLUDE\_vTaskDelete back to 1, and simply comment out the call to prvCheckTasksWaitingTermination() - which you will find easily enough by searching in tasks.c.

Note if you do that, and you are actually using vTaskDelete(), then you will eventually run out of heap as that is the function that frees memory allocated by the kernel to tasks that have since been deleted.

Regards.

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 27, 2014, 12:44pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/14 "2014-06-27T12:44:42Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Friday, June 27, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#c8cf/9dca):

Well…, I think we are pretty close.  
Commenting out prvCheckTasksWaitingTermination() makes the difference  
(-20mA). I went on and looked at the implementation of the  
prvCheckTasksWaitingTermination(): It has a loop

while( uxTasksDeleted \> ( unsigned portBASE\_TYPE ) 0U )  
{  
…  
}

It’s clear that uxTasksDeleted is always 0, so code inside the loop never  
gets executed. But if I comment out code inside the loop power consumption  
goes low. If I leave something inside it rises up. Actually a call to  
prvCheckTasksWaitingTermination() is the only thing that FreeRTOS is doing  
in idle and most of the time my application is in idle loop as it is fully  
even driven.

if code inside loop is commented we get following assemble code:  
70 prvIdleTask:  
75 0000 014B ldr r3, .L3 @ tmp137,  
76 .L2:  
77 0002 1A68 ldr r2, [r3, #0] @ uxTasksDeleted.74,  
uxTasksDeleted  
78 0004 FDE7 b .L2 @

Once I uncomment first line in the loop (which is vTaskSuspendAll() ) we  
get +20mA power and following code:  
714 .L109:  
715 0006 FFF7FEFF bl vTaskSuspendAll @  
716 .L111:  
717 000a 2368 ldr r3, [r4, #0] @ uxTasksDeleted.74,  
uxTasksDeleted  
718 000c 002B cmp r3, #0 @ uxTasksDeleted.74  
719 000e FAD1 bne .L109 @  
720 0010 FBE7 b .L111 @

This is a same busy loop as vTaskSuspendAll() never gets executed. I played  
a bit with code inside the loop and the only conclusion I can get to is  
that STM32 pipeline and or prefetch (or whatever else they have inside)  
gets cleared upon some conditional branch that cause to access to program  
flash and thus increase power consumption.

Really without understanding VHDL of the CPU core it’s impossible to  
predict behavior of the pipe line and even if I could find a sequence that  
would not disturb pipeline I do not want to stay dependent on it. Seams  
like a TICKLESS is the only reasonable solution? Where can I get more  
information about TICKLESS? I’m a bit afraid of putting a system into sleep  
mode. How would it react to events (like UART interrupt for example)?  
Should I configure each event to wake up from a sleep?

Thanks.

---

<div class="post-metadata">

**Author:** ![rtel](https://d3iykfbgfh8zhg.cloudfront.net/user_avatar/forums.freertos.org/rtel/32/31_2.png) [@rtel](https://forums.freertos.org/u/rtel)\
**Post date:** [June 27, 2014, 1:02pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/15 "2014-06-27T13:02:12Z")

</div>

**[rtel](https://sourceforge.net/u/rtel/)** wrote on [Friday, June 27, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#88ca):

Hmm. Very interesting. We will leave that one for the hardware guys to figure out.

If you want to use tickless idle in its most basic form, using just the lightest core sleep rather than any special low power modes, then all you need to do is set configUSE\_TICKLESS\_IDLE to 1 in FreeRTOSConfig.h. In that light sleep mode any interrupt will bring the CPU back out of sleep - and the tick count will get automatically adjusted to account for any ticks that would have occurred between going to sleep and the interrupt bringing it out of sleep again. Tasks that are blocked with a time out will also bring the CPU out of sleep when their timeout expires.

Please report back your findings, including the effect on power consumption, when you have tried turning this on.

Regards,  
Richard Barry

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 27, 2014, 2:47pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/16 "2014-06-27T14:47:53Z")

</div>

**[markwrichardson](https://sourceforge.net/u/markwrichardson/)** wrote on [Friday, June 27, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#c8cf/9dca/297e):

I don’t know how long your pipeline is on that processor. Try adding a series of ‘NOP’ instructions inside the loop at the start and see if that makes a difference. Start with a lot and then trim them back.

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [June 27, 2014, 3:48pm UTC](https://forums.freertos.org/t/freertos-and-power-consumption/3102/17 "2014-06-27T15:48:45Z")

</div>

**[znatok](https://sourceforge.net/u/znatok/)** wrote on [Friday, June 27, 2014](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/#c8cf/9dca/297e/9838):

Hi,  
TICKLESS definitely helped:  
TICKLESS=1 INCLUDE\_vTaskDelete=1 45mA  
TICKLESS=0 INCLUDE\_vTaskDelete=0 48mA  
TICKLESS=0 INCLUDE\_vTaskDelete=1 67mA

I tried to play with NOPs before and managed to get lower consumption with  
3 NOPs before vTaskSuspendAll  
inside loop  
while( uxTasksDeleted \> ( unsigned portBASE\_TYPE ) 0U )  
{  
\_\_asm volatile( “nop” );  
\_\_asm volatile( “nop” );  
\_\_asm volatile( “nop” );  
vTaskSuspendAll  
#if 0  
…  
#endif  
}

But once I uncommented rest of the code in loop current got’s back up.  
If you want me to run tests I can definitely do it but I do not think this  
is a good solution because: first we are not sure what exactly influence on  
STM32 core operation and second you can not fully control assembler output  
from the “C” code as optimizer can have it’s own tricks also linker can  
also move code (and this can be vital as well).

STM32F2 has so called “Adaptive real-time memory accelerator (ART  
Accelerator™)” which is turned all. But all you can find about it in  
documentation is this (they do not even explain how to turn it on/off, I  
had to ask it in forum):

2.3.5 Adaptive real-time memory accelerator (ART Accelerator™)  
The ART Accelerator™ is a memory accelerator which is optimized for STM32  
industrystandard ARM® Cortex™-M3 processors. It balances the inherent  
performance advantage of the ARM Cortex-M3 over Flash memory technologies,  
which normally requires the processor to wait for the Flash memory at  
higher operating frequencies. Thanks to the ART Accelerator™, the CPU can  
operate up to 120 MHz without wait states, thereby increasing the overall  
system speed and efficiency. To release the processor full 150 DMIPS  
performance at this frequency the accelerator implements an instruction  
prefetch queue and branch cache, which enables program execution from Flash  
memory at up to 120 MHz without wait states.

According to datasheet ART reduces power consumption in 10mA (at 120MHz,  
3.3V)  
Getting more info from ST is a waste of time. Based on my experience of  
working with other HW modules of this CPU I can tell that many times ST  
engineers do not know themselves how modules are working.

On Fri, Jun 27, 2014 at 5:47 PM, Mark [markwrichardson@users.sf.net](mailto:markwrichardson@users.sf.net) wrote:

> ## I don’t know how long your pipeline is on that processor. Try adding a series of ‘NOP’ instructions inside the loop at the start and see if that makes a difference. Start with a lot and then trim them back.
> 
> ## FreeRTOS and power consumption [https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/?limit=25#c8cf/9dca/297e](https://sourceforge.net/p/freertos/discussion/382005/thread/8849ff7c/?limit=25#c8cf/9dca/297e)
> 
> Sent from [sourceforge.net](http://sourceforge.net) because you indicated interest in  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/p/freertos/discussion/382005/)
> 
> To unsubscribe from further messages, please visit  
> [SourceForge.net: Log In to SourceForge.net](https://sourceforge.net/auth/subscriptions/)
