I’m trying to develop a RTOS MBED application with a target.mbed_app_start address at 0x8008800 on a DISCO_L475VG_IOT01A with a custom bootloader.
If I build a bare metal led blink test application and use target.mbed_app_start to compile it at 0x8008800, the application perfectly runs after bootloader jump.
If I build the same application but add RTOS removing bare-metal requirement, and build it using target.mbed_app_start at the same address, I got the following:
++ MbedOS Error Info ++
Error Status: 0x80010131 Code: 305 Module: 1
Error Message: Kernel Error: 0xFFFFFFFA, Not allowed in ISR context
Location: 0x800A423
Error Value: 0xFFFFFFFA
Current Thread: Id: 0x0 Entry: 0x8003E59 StackSize: 0x0 StackMem: 0x8003E59 SP: 0x10000608
For more info, visit: mbedos-error
– MbedOS Error Info –
= System will be rebooted due to a fatal error =
= Reboot count(=5) reached maximum, system will halt after rebooting =�
because if I change the bootloader code to not set any interrupt (I attach a timeout callback to a Timer object and attached a receive ISR to a Serial) everything works fine when jumped to the application.
In details I’ve removed all .attach() callback functions from the bootloader and now the MBED RTOS application works as expected.
Does someone know how to use interrupt in STM32 bootloader in order to be able to use them also in the loaded application?
you forgot to share an info about what a MbedOs version do you use, but you probably use something lower than 6.
It is not about how to use Interrupt under bootlaoder, the bootloader is normal program. When you will test the same code without bootloader functionality, the result will be probably same.
More it is about a content of your callback fuction. So please share the code or exactly describe what you want to call from the ISR.
For example. From MbedOs 5.12 (before it fail silently but it was working) and above are most of methods of Serial API not usable in ISR because are covered by Mutexes.
Thanks for helping. I’m using the last MBED OS version, I’ve created a new project yesterday MBED_MAJOR_VERSION 6.
One note, I always use bootloader to run my application code. For instance, my application code is relocated to 0x08008800 with “target.mbed_start_app”.
If I directly jump to the application code trough a bootloader that dosen’t use interrupt, everything is fine once the application is executed (included all application intererrupts and so on).
If I use interrupts in the bootloader (a timeout object for example to start the jump), the application start with interrupts not properly set.
Here the bootloader code:
#include "mbed.h"
#define POST_APPLICATION_ADDR 0x08008800
Timeout start_app_timeout;
void start_application()
{
printf ("start_application()\n\r");
printf ("POST_APPLICATION_ADDR=%x\n\r\n\r", POST_APPLICATION_ADDR);
mbed_start_application(POST_APPLICATION_ADDR);
}
int main()
{
printf ("\n\r");
printf("Bootloader\r\n");
start_app_timeout.attach(&start_application, 2.0); //led not blinking in the application code
//start_application(); //application works with this
while(1);
}