I'm using FreeRTOS V8.2.3 and a STM32746G with the discovery board. I create a simple FreeRTOS application and all works fine. Now I create a Simple Bootloader (no RTOS) The Simple Bootloader is mapped ta 0x08000000 my Application is mapped 0x08010000. After the jump below the code I used
~~~ typedef void (pfunction)(void); // address == 0x08010000. void JmpToAddress(unsigned int address) { uint8t i; uint32t jumpaddress = *(_IO uint32t)(address + 4); pfunction pjumpfunction = (pfunction)jumpaddress; __disableirq(); // stop all interrupts // Disable IRQs for(i = 0;i < 8;i++) { NVIC->ICER[i] = 0xFFFFFFFF; } // Clear pending IRQs for(i = 0;i < 8;i++) { NVIC->ICPR[i] = 0xFFFFFFFF; }
__enable_irq();
__set_CONTROL(0);
// re-init stack pointer (first entry of the vector table)
__set_MSP(*(__IO uint32_t*)address);
pjumpfunction(); } ~~~
my application start correctly RTOS create theall the tasks and jump to the firsttask. My code is ~~~ firsttask(void const * argument) { kernelStatus = osKernelRunning();// status is ok
for( ;; ) {
// do somethings ...
OSIDelay(200); //never exit
}
} ~~~
It Seem's as the scheduler dosen't run. Any Idea
This is a very old thread, and without knowing what happens at the address you are jumping to it is difficult to know.
You need to have a vector table set up for the application you are jumping to, set the vector base address register to that vector table, and make sure the FreeRTOS interrupt handlers (PendSV, SysTick and SVCall) handlers are installed in the vector table. I would then recommend leaving interrupts globally disabled, reading the reset address out of the second position of the vector table used by the application you are jumping to, and jumping to that address to ensure the C run time code is also executed before main().