CH32X035 MRS v1.92 卡在while循環(huán)里出不來

MCU:? CH32X035C8

MRS 版本: v1.92



void SysTick_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));


void SysTick_Handler(void)

{

? ? runMilis++;


? ? SysTick->SR = 0;

}


//-------------------------------------------------------------------------------------//

// Get System tick counter

//-------------------------------------------------------------------------------------//

uint32_t get_time_tick(void)

{

? ? return runMilis;

}


//--------------------------------------------------------------------------//

// Delay function

//--------------------------------------------------------------------------//

void DelayMS( uint32_t nMS )

{

? ? volatile uint32_t now = get_time_tick();


? ? while( (get_time_tick() - now) < nMS );

}


仿真時(shí) nMS = 500,? 變量 now = 1,? runMilis = 5389, 按理已經(jīng)應(yīng)該return了,但實(shí)際上程序還卡在while里出不來。


請問原廠的FAE,這個(gè)函數(shù)有什么問題嗎?為何一直卡???是不是編譯器有啥BUG?

同樣的程序,在keil MDK里運(yùn)行正常,但到了MRS里就會一直卡住

79f6ede03c9fe9e270227a43c6a0b7e.png


沒有看見你的runMilis變量的聲明。這個(gè)變量應(yīng)該是也需要定義為volatile的。反而是now變量可以不必使用volatile。

從左側(cè)透露出的反匯編可以推測,lw a5,12這句應(yīng)當(dāng)是在讀取內(nèi)存中now變量的值,反而沒有看到應(yīng)該存在的讀取內(nèi)存中runMilis變量的指令,下面的sub指令直接令寄存器a4的值減去a5的值。假如你將runMilis變量定義為volatile的,則應(yīng)當(dāng)同時(shí)出現(xiàn)兩句lw指令,分別從內(nèi)存加載runMilis和now變量。

綜上,將runMilis變量用volatile修飾應(yīng)該可以解決。


感謝樓上網(wǎng)友的回答!


事實(shí)上我的runMilis變量也是加了volatile修飾的。感覺MRS的編譯器非常奇怪,即使按照ANSI C的寫法,仍會有一些奇奇怪怪的的問題。

1724342794485.png


根據(jù)實(shí)際debug發(fā)現(xiàn),函數(shù)內(nèi)的now變量如果不加volatile修飾,則會被編譯器optimization out


debug時(shí)看到變量被優(yōu)化不影響該變量在函數(shù)內(nèi)的讀取,因?yàn)榇藭r(shí)變量只是固定存于寄存器中,理論上并不影響程序運(yùn)行,只是調(diào)試時(shí)麻煩。

我也常遇到gcc有時(shí)自作聰明把全局變量變成寄存器訪問(即沒有每次訪問去都去內(nèi)存讀現(xiàn)在的值),這一點(diǎn)還是等待官方工作人員來幫忙吧。


您好,附件例程是我根據(jù)你的配置測試,測試并沒有遇到卡死的問題,你可以測試一下。或可將你可復(fù)現(xiàn)問題的工程發(fā)我郵箱(lzs@wch.cn)具體看一下。

icon_rar.gifCH32X035 SysTick.zipimage.png



只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频