Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem


Cortex-M3 allocating memory before scheduler start locks interrupts

Posted by smith84 on December 5, 2013

I am running FreeRTOS 7.4.0 on a Cortex-M3 processor (no MPU).

My initialisation code creates a timer before the OS start, and after the call to xTimerCreate() the BASEPRI is set to block interrupts - this causes other problems in my startup routines.

I have managed to trace the code as follows (showing what I think are the relevant parts only!):

  • xTimerCreate()
    • pvPortMalloc()
    • vTaskSuspendAll()
      • xTaskResumeAll()
      • taskENTER_CRITICAL(): this increments the uxCriticalNesting counter which was at the init value of 0xaaaaaaaa to 0xaaaaaaab
        • portDISABLE_INTERRUPTS(): sets BASEPRI to block interrupts
      • taskEXIT_CRITICAL(): this decrements uxCriticalNesting back to 0xaaaaaaaa which is greater than 0 so it does not call portENABLE_INTERRUPTS()

This mess with uxCriticalNesting is all fixed up when the scheduler is started and uxCriticalNesting is set to 0.

My understanding is that I should be able to create timers and tasks etc before the scheduler is started. However, with this call tree it seems that any call for these types of operations will block the interrupts below the OS masking level.

Any suggestions as to what I can try to resolve this problem? I could simply modify the initialisation value of uxCriticalNesting but that doesn't seem to be the right thing to do.

Cortex-M3 allocating memory before scheduler start locks interrupts

Posted by rtel on December 5, 2013

This behaviour is completely intentional and the reason why the critical nesting count is never initialised to 0. It is done like this to prevent interrupts attempting to use RTOS API functions before the RTOS has been started - if an interrupt attempted a context switch when the kernel is not running the system would crash. If the crash is caused by an interrupt the user may not understand what has happened.

If you can guarantee this is not going to happen in your system then you can initialise the critical nesting variable to 0 instead of whichever non-zero value is used.


Cortex-M3 allocating memory before scheduler start locks interrupts

Posted by smith84 on December 5, 2013

Thanks for the quick reply. With that information I know that I can work around the problem by using busy-wait loops until the scheduler is started.

[ Back to the top ]    [ About FreeRTOS ]    [ Privacy ]    [ Sitemap ]    [ ]

Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.

Latest News

NXP tweet showing LPC5500 (ARMv8-M Cortex-M33) running FreeRTOS.

Version 10.1.1 of the FreeRTOS kernel is available for immediate download. MIT licensed.

View a recording of the "OTA Update Security and Reliability" webinar, presented by TI and AWS.


FreeRTOS and other embedded software careers at AWS.

FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

Espressif ESP32

IAR Partner

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers


STMicro RTOS partner supporting ARM7, ARM Cortex-M3, ARM Cortex-M4 and ARM Cortex-M0

Texas Instruments MCU Developer Network RTOS partner for ARM and MSP430 microcontrollers

OpenRTOS and SafeRTOS

Xilinx Microblaze and Zynq partner