OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5097|回复: 11

stm32f105的执行速度好奇怪?

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-13
在线时间
8 小时
发表于 2020-2-25 13:11:12 | 显示全部楼层 |阅读模式
我用stm32f105的PORTC口模拟8080时序刷液晶(ILI9488),为了提高刷屏速度,使用了inline函数LCD_WR_DATA(),但是测试时偶然发现一个奇怪的现象:我使用以下单色填充函数填充320*480的屏幕时,只需56ms左右
void LCD_FillSigleColor(u16 x0,u16 y0,u16 w,u16 h,u16 color)
{
        u32 s=w*h;
        _lcd_set_area(x0,x0+w-1,y0,y0+h-1);
        while(s--)
        {
                LCD_WR_DATA(color);
        }
}       



但是我稍作修改成如下:
void LCD_FillSigleColor(u16 x0,u16 y0,u16 w,u16 h,u16 color)
{
        u32 s=w*h;
        _lcd_set_area(x0,x0+w-1,y0,y0+h-1);
        w=0;
        w=0;
        while(s--)
        {
                LCD_WR_DATA(color);
        }
}

此时刷屏时间竟然要63ms,两条w=0;的语句竟然多出了7ms的时间?甚是不解,望大虾们指点迷津
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-13
在线时间
8 小时
 楼主| 发表于 2020-2-25 15:14:34 | 显示全部楼层
执行时间我用示波器和定时器都测量过,都一样是准的,确实是运行速度上有区别
回复 支持 反对

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-2-25 20:37:15 | 显示全部楼层
加那些没用的语句干嘛呢?
按理说这种废语句就算写了也会被编译器删掉,你是不是没开优化?把优化等级开到O2以上试试。
至于为啥多了7ms,我也不知道它怎么翻译机器码的,要是我来翻译就是2条机器码的事。所以,请查看反汇编窗口看看机器码啥样的。
回复 支持 反对

使用道具 举报

10

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
750
金钱
750
注册时间
2019-9-5
在线时间
134 小时
发表于 2020-2-26 08:38:18 | 显示全部楼层
W = 0了里面是不是加了延时
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-13
在线时间
8 小时
 楼主| 发表于 2020-2-26 13:23:05 | 显示全部楼层
0x00000000 发表于 2020-2-25 20:37
加那些没用的语句干嘛呢?
按理说这种废语句就算写了也会被编译器删掉,你是不是没开优化?把优化等级开到 ...

加这两条废语句没什么作用,只是验证这个7ms而已,看过了反汇编,编译器编译成_NOP()指令了
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-13
在线时间
8 小时
 楼主| 发表于 2020-2-26 13:23:58 | 显示全部楼层
黄faxian 发表于 2020-2-26 08:38
W = 0了里面是不是加了延时

没有任何延时,w=0;只是一条c代码,又不是函数入口,如何加延时啊?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-13
在线时间
8 小时
 楼主| 发表于 2020-2-26 13:26:21 | 显示全部楼层
0x00000000 发表于 2020-2-25 20:37
加那些没用的语句干嘛呢?
按理说这种废语句就算写了也会被编译器删掉,你是不是没开优化?把优化等级开到 ...

不过就算没优化,也不可能增加7ms吧
回复 支持 反对

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-2-26 23:06:45 | 显示全部楼层
彭军 发表于 2020-2-26 13:23
加这两条废语句没什么作用,只是验证这个7ms而已,看过了反汇编,编译器编译成_NOP()指令了

一个NOP指令平均消耗1个周期,不可能7ms的,除非你的MCU以几百赫兹频率运行,否则在72MHz的频率下,不过是几纳秒的事。
要么你的时间统计出错,要么你看错了。
你反汇编窗口发个截图看看。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2018-6-13
在线时间
8 小时
 楼主| 发表于 2020-2-28 16:34:36 | 显示全部楼层
0x00000000 发表于 2020-2-26 23:06
一个NOP指令平均消耗1个周期,不可能7ms的,除非你的MCU以几百赫兹频率运行,否则在72MHz的频率下,不过 ...

这是汇编代码
微信图片_20200228124950.png
回复 支持 反对

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-2-28 18:27:17 | 显示全部楼层

回帖奖励 +1 金钱


0x08000A60和0x08000A62的地址处有两条16bit的NOP指令,不知道是不是对应两句w=0;
如果是的话,就有点奇怪但是可以解释,因为0x08000A6C处有一条BNE指令,是个循环相关的,反复跳转到0x08000A50处执行,所以如果你的循环次数很多的话,哪怕是在循环体多了两条指令,也会多执行很多次。所以7ms就不奇怪了。
回复 支持 反对

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2021-12-28 15:01:18 | 显示全部楼层

回帖奖励 +1 金钱

帮顶     
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2020-11-26
在线时间
30 小时
发表于 2021-12-30 10:32:57 | 显示全部楼层

回帖奖励 +1 金钱


  帮顶
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 12:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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