Quality RTOS & Embedded Software

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


Interrupts on a Cortex M4, BASEPRI register

Posted by cablecoder on February 24, 2017

I am using FreeRTOS on a Cortex M4 platform (specifically an EFM32 from Silicon Labs). I'm doing a bunch of setup prior to starting the operating system; allocating things, creating the semaphores I'll need, etc. These make calls to things like pvPortMalloc and xSemaphoreCreateBinary. I've noticed that these calls will alter the BASEPRI register to a value of 0xA000. This masks off a bunch of interrupts, and essentially makes it so that the system won't trigger interrupts that aren't the highest priority until freeRTOS has started the scheduler.

I can get by with calling malloc instead of pvPortMalloc when freeRTOS isn't running, but I need to call xSemaphoreCreateBinary. Can someone tell me how to properly allow this call to be made prior to the scheduler being started, such that I can still have interrupts working? I've tried just calling "setBASEPRIO(0)", but this causes me to hit an Assert once the scheduler is running and an interrupt fires. Even if I manually call "setBASEPRIO(191)" before starting the scheduler.

Interrupts on a Cortex M4, BASEPRI register

Posted by rtel on February 24, 2017

Most of the FreeRTOS API functions are designed to leave interrupt disabled if they are called before the scheduler has started. This dates back to a time when a lot of support requests resulted from interrupts in application code trying to use the FreeRTOS API before the scheduler was started. If interrupt are disable between the FreeRTOS API first being used and the scheduler being started then that can't happen. You can manually set the basepri back to 0, or alternatively create a configuration task, start the scheduler, perform any initialisation you want from the configuration task, then re-purpose the configuration task once the configuration is complete.

Interrupts on a Cortex M4, BASEPRI register

Posted by cablecoder on February 27, 2017

Ah, I had an additional problem with an interrupt being set to too high of a priority, which I'd added while attempting to diagnose the problem originally. Thanks!

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

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

Latest News

Version 10.1.0 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