硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1404|回复: 25
收起左侧

[技术讨论] 大家帮我看一下这段代码,为啥我查看Delay变量每次都是加了4?

[复制链接]

86

主题

550

回帖

808

积分

金牌会员

积分
808
发表于 2024-10-25 09:01:30 | 显示全部楼层 |阅读模式
void Dt(uint32_t Ms)
{
     uint32_t Temp;
     for (Temp = 0; Temp < 32768; Temp++);
}

volatile uint32_t Delay = 0;
int main(void)
{
    Hardware_init();// 硬件初始化
    sys_init();     // 软件初始化
    __enable_irq(); // 开中断
    //SCB->SCR = BIT1;// 配置系统休眠参数
    //__WFI();        // 主函数结束,中断函数开始运行
    for(;;)
    {
        Dt(100);
        Delay = Delay+ 1;
    }
}

回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 09:06:31 | 显示全部楼层
我把优化等级改为default,就是每次Delay+1, 如果改为-Ofast, 每次Delay + 4, 而且Dt(100)都不执行, 还能这样优化的?
回复

使用道具 举报

0

主题

290

回帖

290

积分

高级会员

积分
290
发表于 2024-10-25 09:22:30 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 09:06
我把优化等级改为default,就是每次Delay+1, 如果改为-Ofast, 每次Delay + 4, 而且Dt(100)都不执行, 还能 ...

延时函数变量前面加volatile前缀。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-10-25 09:32:00 | 显示全部楼层
Delay这么写不行,都得给你优化了。
在MDK AC6的高等级优化下,for循环延迟执行异常了
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=98478

=======================================================
ps:
楼主这个芯片不会是LKS32吧,最近我打算研究的这个问题,看他们的函数就是Hardware_init();

https://forum.anfulai.cn/forum.p ... &extra=page%3D1
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 09:32:58 | 显示全部楼层
eric2013 发表于 2024-10-25 09:32
Delay这么写不行,都得给你优化了。
在MDK AC6的高等级优化下,for循环延迟执行异常了
https://www.armbb ...

就是lks32,凌鸥的,我先不管那个延时函数,就是那个Delay变量也不行, 每次都加4,
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2024-10-25 09:36:00 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 09:06
我把优化等级改为default,就是每次Delay+1, 如果改为-Ofast, 每次Delay + 4, 而且Dt(100)都不执行, 还能 ...

这种问题直接看反汇编,编译器可能觉得你的Delay没其他用途,每次加1,对for做了循环展开优化,干脆一下子延时4次然后加4次;
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 09:38:01 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-10-25 09:42 编辑

我又改了一下代码,保证我的Delay变量是有意义的,但如果使用O2及以上优化,Delay变量还是执行一次加4,这个是啥优化手段啊? 我平时一直用的iar,没用kiel....
这样写有哪里有规范吗?

uint8_t Plus(uint32_t t)
{
     if (t > 25765)
     {
         return 1;
     }
     else
     {
         return 0;
     }
}

volatile uint32_t Delay = 0;
int main(void)
{
    //Hardware_init();// 硬件初始化
    //sys_init();     // 软件初始化
    //__enable_irq(); // 开中断
    //SCB->SCR = BIT1;// 配置系统休眠参数
    //__WFI();        // 主函数结束,中断函数开始运行
    for(;;)
    {
        Delay = Delay+ 1;
        if (Plus(Delay) == 1)
        {
            SCB->SCR = BIT1;
        }
    }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-10-25 09:55:49 | 显示全部楼层
这样写就可以 了,二楼坛友贴的
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=98478
static  void bsp_delay(uint32_t us)
{
        while(us--)
        {
                for(int i = 0;i < 12;i++)
                {
                        __NOP();
                }
  }
}
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 09:58:27 | 显示全部楼层
eric2013 发表于 2024-10-25 09:55
这样写就可以 了,二楼坛友贴的
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=98478
static  voi ...

我的问题不是Delay被优化的问题,是变量值不对的问题, 我的Delay是一个变量,不是函数,,我就随便起了一个名字测试而已
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 10:18:35 | 显示全部楼层
我这边AC6编译器-Ofast反汇编显示是正常的,是加1,AC6编译器版本6.16。楼主是怎么确定变量一次就加4的,断点吗?AC6的断点不准是老毛病了,经常乱跑
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 10:29:10 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-10-25 10:32 编辑

我看的变量啊,而且我用jscope也是一样,我看反汇编也是加4


    36:         Delay = Delay+ 1;
0x00000ABA 6813      LDR      r3,[r2,#0x00]
0x00000ABC 1C5B      ADDS     r3,r3,#1
0x00000ABE 6013      STR      r3,[r2,#0x00]
0x00000AC0 6813      LDR      r3,[r2,#0x00]
0x00000AC2 4283      CMP      r3,r0
0x00000AC4 D301      BCC      0x00000ACA
0x00000AC6 2302      MOVS     r3,#0x02
0x00000AC8 600B      STR      r3,[r1,#0x00]
0x00000ACA 6813      LDR      r3,[r2,#0x00]
0x00000ACC 1C5B      ADDS     r3,r3,#1
0x00000ACE 6013      STR      r3,[r2,#0x00]
0x00000AD0 6813      LDR      r3,[r2,#0x00]
0x00000AD2 4283      CMP      r3,r0
0x00000AD4 D301      BCC      0x00000ADA
0x00000AD6 2302      MOVS     r3,#0x02
0x00000AD8 600B      STR      r3,[r1,#0x00]
0x00000ADA 6813      LDR      r3,[r2,#0x00]
0x00000ADC 1C5B      ADDS     r3,r3,#1
0x00000ADE 6013      STR      r3,[r2,#0x00]
0x00000AE0 6813      LDR      r3,[r2,#0x00]
0x00000AE2 4283      CMP      r3,r0
0x00000AE4 D3E1      BCC      0x00000AAA
0x00000AE6 2302      MOVS     r3,#0x02
0x00000AE8 600B      STR      r3,[r1,#0x00]
0x00000AEA E7DE      B        0x00000AAA

回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 10:43:32 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 10:29
我看的变量啊,而且我用jscope也是一样,我看反汇编也是加4

似乎是编译器的问题,加了好几次1,简单程序复杂化了
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 10:46:01 | 显示全部楼层
skyshine 发表于 2024-10-25 10:43
似乎是编译器的问题,加了好几次1,简单程序复杂化了

你那反汇编不会这样?好奇怪。。。
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 10:56:59 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 10:46
你那反汇编不会这样?好奇怪。。。

不会,我这边的反汇编是ADDS加一,STRLDR死等,CMP比较,然后跳转就没了。
要么换编译器,要么就用低优化等级,或者单独设置优化等级
硬汉哥写过单独设置优化等级的教程:https://forum.anfulai.cn/forum.php?mod=viewthread&tid=97702
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 11:05:30 | 显示全部楼层
skyshine 发表于 2024-10-25 10:56
不会,我这边的反汇编是ADDS加一,STRLDR死等,CMP比较,然后跳转就没了。
要么换编译器,要么就用低优 ...

不应该啊,编译器相同,优化相同,出来的代码怎么会不同?
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 14:05:29 | 显示全部楼层
skyshine 发表于 2024-10-25 10:56
不会,我这边的反汇编是ADDS加一,STRLDR死等,CMP比较,然后跳转就没了。
要么换编译器,要么就用低优 ...

你好,你能试一下我这个代码吗?我这边看一下不是加1,每次都加4。。。。你用我的工程编译下试试看

test.rar

54.24 KB, 下载次数: 1

回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 14:30:53 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 14:05
你好,你能试一下我这个代码吗?我这边看一下不是加1,每次都加4。。。。你用我的工程编译下试试看

编译器选项几乎一样,只有目标芯片不一样,我用的m0,结果是对的,用你这个工程编译,汇编里是加了4次1,和你之前发的一样
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 14:37:15 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-10-25 14:42 编辑
skyshine 发表于 2024-10-25 14:30
编译器选项几乎一样,只有目标芯片不一样,我用的m0,结果是对的,用你这个工程编译,汇编里是加了4次1, ...

好奇怪,我再改为M0试试, volatile的变量它也优化吗?

我选了M0也一样,还是加4

test.rar

113.98 KB, 下载次数: 1

回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 14:59:36 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 14:37
好奇怪,我再改为M0试试, volatile的变量它也优化吗?

我选了M0也一样,还是加4

我这边编译这个是正常的
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 15:06:51 | 显示全部楼层
skyshine 发表于 2024-10-25 14:59
我这边编译这个是正常的

编译没问题,调试的时候,还是加4,方便把你的测试程序给我试一下吗?
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 15:26:19 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 15:06
编译没问题,调试的时候,还是加4,方便把你的测试程序给我试一下吗?

我手边没有F0和F4的设备,只有G0的,仿真的时候,在Counter = Counter+ 1这里打断点,counter都是加一
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 15:32:54 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-10-25 15:33 编辑
skyshine 发表于 2024-10-25 15:26
我手边没有F0和F4的设备,只有G0的,仿真的时候,在Counter = Counter+ 1这里打断点,counter都是加一

用软件模拟仿真就行了,不要硬件设备的, 你把我的工程换成G0的试试
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 15:50:11 | 显示全部楼层
tangqianfeng 发表于 2024-10-25 15:32
用软件模拟仿真就行了,不要硬件设备的, 你把我的工程换成G0的试试

F0的仿真和汇编都没问题,G0仿真和汇编和实机调试都没问题,F4高优化等级仿真和汇编有问题,低优化等级仿真和汇编没问题
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 16:17:37 | 显示全部楼层
skyshine 发表于 2024-10-25 15:50
F0的仿真和汇编都没问题,G0仿真和汇编和实机调试都没问题,F4高优化等级仿真和汇编有问题,低优化等级仿 ...

你看我的mdk下的仿真,我选的f030
unused entities.gif
回复

使用道具 举报

3

主题

295

回帖

304

积分

高级会员

积分
304
发表于 2024-10-25 16:22:07 | 显示全部楼层
我用的keil535,我感觉没必要继续折腾了,解决方案我一开始就已经说过了
回复

使用道具 举报

86

主题

550

回帖

808

积分

金牌会员

积分
808
 楼主| 发表于 2024-10-25 16:26:26 | 显示全部楼层
skyshine 发表于 2024-10-25 16:22
我用的keil535,我感觉没必要继续折腾了,解决方案我一开始就已经说过了

好的,谢谢老兄
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 02:47 , Processed in 0.090738 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表