新人崩潰在點(diǎn)燈程序

下面是 STM32 視頻教程上的點(diǎn)燈程序, 但是在Risc-V的 CH32V203F8P6 開發(fā)板上編譯, 卻得不到想要的結(jié)果!

延時函數(shù):?for(int i=0; i < 50000000; i ++) 實(shí)際只執(zhí)行了一次, 但是如果改用 Delay_Ms() 函數(shù)就完全正常,?

難道編譯器跳過了某些程序段?! 或者是程序段也會緩存運(yùn)行?!

==================================

#include?

#include


int main() {

? ? //init the clock for port C

? ? USART_Printf_Init(115200);

? ? Delay_Init();

? ? RCC->APB2PCENR |= (1 <<3);

? ? GPIOB->CFGHR |= ((1<<20)|(1<<21));? // p106

? ? GPIOB->CFGHR &= ~((1<<22)|(1<<23));


? ? while(1){

? ? ? ? GPIOB->BSHR = (1<<13);? //p107

? ? ? ? printf("ON\r\n");

//? ? ? ? Delay_Ms(1000);??

? ? ? ? for(int i=0; i < 50000000; i ++);? //被跳過??

? ? ? ? GPIOB->BSHR = (1 << (13+16));

? ? ? ? printf("OFF\r\n");

//? ? ? ? Delay_Ms(1000);??

? ? ? ? for(int i=0; i < 50000000; i ++);??

? ? }

}


int i 這種定義變量i?鬼知道i是16位整數(shù)還是32位?如果是16位整數(shù)后面的循環(huán)值遠(yuǎn)遠(yuǎn)超過16位整數(shù)的范圍了吧?

建議定義成uint_32更直觀。


您好,當(dāng)工程中使用自定義延時函數(shù)不起作用時,編譯器(MounRiver)有可能會將該延時函數(shù)優(yōu)化掉(認(rèn)為其為無效函數(shù)),可以通過以下兩個方法解決該問題,具體如下:

(1)把最里面的for循環(huán)里面加個nop指令就可以避免優(yōu)化,如下圖1。

(2)降低優(yōu)化等級,如下圖2。此外建議自定義延時函數(shù)時,延時數(shù)值盡量設(shè)置大一些。

image.png

圖1

image.png

圖2


吧主大神啊!! 菜鳥拜服~~

.....

話說回來, 關(guān)于[編譯器優(yōu)化]的這個坑, 不知道能坑死多少人... ?



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

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