mdk ac6 CLANG

使用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都可以用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章