新人崩溃在点灯程序

下面是 STM32 视频教程上的点灯程序, 但是在Risc-V的 CH32V203F8P6 开发板上编译, 却得不到想要的结果!

延时函数: for(int i=0; i < 50000000; i ++) 实际只执行了一次, 但是如果改用 Delay_Ms() 函数就完全正常, 

难道编译器跳过了某些程序段?! 或者是程序段也会缓存运行?!

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

#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位整数还是32位?如果是16位整数后面的循环值远远超过16位整数的范围了吧?

建议定义成uint_32更直观。


您好,当工程中使用自定义延时函数不起作用时,编译器(MounRiver)有可能会将该延时函数优化掉(认为其为无效函数),可以通过以下两个方法解决该问题,具体如下:

(1)把最里面的for循环里面加个nop指令就可以避免优化,如下图1。

(2)降低优化等级,如下图2。此外建议自定义延时函数时,延时数值尽量设置大一些。

image.png

图1

image.png

图2


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

.....

话说回来, 关于[编译器优化]的这个坑, 不知道能坑死多少人... ?



只有登录才能回复,可以选择微信账号登录