使用MDK AC6(CLANG)一定要格外小心,下面是我在調試BOOT時出現的問題,浪費了我好長時間。
200214 willow add
CLANG 在下面的編譯中有問題,AC5就沒有問題,程序正常。
但是使用AC6發現只要一執行__set_MSP(StackAddr);所有的局部變量就會變化,
經過單步執行生成的彙編語言,發現__set_MSP會使用R0, 但AC5不用R0, R0中保存的就是pUserApp,
只有通過SP做相對尋址的,在改變SP後,就會有問題。
而把pUserApp定義成全局變量 , pUserApp的尋址就不會通過SP,而是通過PC, __set_MSP執行後雖然SP改變了, 但PC不變, 依然可以通過PC找到正常的變量 。
void (*pUserApp)(void);
void Jump_To_APP(uint32_t app_address)
{
uint32_t JumpAddress;
uint32_t StackAddr;
//register void (*pUserApp)(void);
__asm("CPSID I"); //關中斷
StackAddr = *(volatile uint32_t*)app_address;
JumpAddress = *(volatile uint32_t*) (app_address+4);
//JumpAddress = (app_address+4);
pUserApp = (void (*)(void)) JumpAddress;
/* Initialize user application's Stack Pointer */
// __set_PSP(*(volatile uint32_t*) app_address);
// __set_CONTROL(0);
__set_MSP(StackAddr);
pUserApp();
}
上面說的是一個難點,下面就是有規律的了,按照下圖所示,修改即可
我一般都用CMSIS 5下面的定義的宏,這樣無論是在AC4 還是AC5都可以用。