2013-11-27 11:15 AM
I've developed a single project[using two separate irom sections which keil currently manages] that contains my bootloader and ApplicationMain(). The first flash block is reserved for the bootloader that runs upon power-up which then depending on criteria will either remain in the bootloader or run the rest of my project[found in following flash sections]...
#define ApplicationMain() ((void (*)())(0x08005d69))()
if((BootLoaderSaved.BootLoaderProgrammedFlag1 == VALID_FW_PRESENT_FLAG1) && (BootLoaderSaved.BootLoaderProgrammedFlag2 == VALID_FW_PRESENT_FLAG2) && (BootLoaderSaved.BootLoaderProgrammedFlag3 == VALID_FW_PRESENT_FLAG3))
ApplicationMain();
else
{
FLASH_If_Init();
while(1)
{
BootLoaderDoReceive();
BootLoaderDoTransmit();
}
My current implementation requires the known location of my ApplicationMain which I get from looking at the project *.map file...no sooner the address of ApplicationMain() changes, I get a hard fault...my question is -- do the ST IAP examples expect whatever user application's main() to be fixed at 0x08004000, if so, how does one accomplish this in keil?
What does__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); do exactly? I noticed that the code appears to be running correctly even without the line present in my current code...
2013-11-27 05:36 PM
Missing a couple of major plot points here.
The loader and app really need to be independent and free standing, each will have it's own vector table, stack and C runtime startup code. There are other ways, be this is likely to be the easiest and most robust method. Each will get a unique region of IROM so as not to step on each other. The IRAM can be the same, because there should be no expectation of returning, but you could carve out some space for parameters, etc. You are not attempting to call main(), but rather the initialization code from the compiler. Setting the MSP (Stack Pointer) while preferred, does get done later in the Keil start up code. Nominally to __initial_sp, the same value in the vector table. The transfer code is looking to load both SP and PC (Program Counter - ResetHandler) from the first two words of the vector table for the Application image. Linking through the vector table, and establishing it for the processor in SCB->VTOR, means you don't have to code special addresses in the Boot images, and you won't get Hard Faults because you are not jumping to some arbitrary/random location.