一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 6212|回复: 22

[STM8/STM32] 为什么STM的代码很多人都这样写?

[复制链接]
发表于 2015-12-10 15:23 | 显示全部楼层 |阅读模式
一直有个疑问,比如下面这条语句
  1. PB_DDR |= 1 << 5;
复制代码
我见过的C51书籍如果是这句的话,通常都是这样写:
  1. PB_DDR |= 0x20;
复制代码
我看的《stm8自学笔记》,这两种写法都有。
我很奇怪,为什么会有最上面的那种写法?哪种写法的效率更高?还是有其他什么原因?求解。


发表于 2015-12-10 15:47 | 显示全部楼层
上面的可读性更好,把PB_DDR的bit5置1
回复

使用道具 举报

 楼主| 发表于 2015-12-10 15:54 | 显示全部楼层
autolog 发表于 2015-12-10 15:47
上面的可读性更好,把PB_DDR的bit5置1

这种语句,是不是编译器编译的时候,自动处理了,不需要MCU的运算操作?
回复

使用道具 举报

发表于 2015-12-10 15:54 | 显示全部楼层
两种写法编译出来的代码是相同的,PB_DDR |= 1 << 5 的写法,可读性更好,物理意义更直观些
回复

使用道具 举报

发表于 2015-12-10 16:32 | 显示全部楼层
学习一下,一直用第二种方法,在avr中经常有人用第一种,如果都支持位寻址就没这麻烦吧
回复

使用道具 举报

发表于 2015-12-10 16:38 来自手机 | 显示全部楼层
hotdll 发表于 2015-12-10 15:54static/image/common/back.gif
引用:   autolog 发表于 2015-12-10 15:47   
上面的可读性更好,把PB_DDR的bit5置1  
这种语句,是不是编译器编译的时候,自动处理了,不需要MCU的运算操作...

回复

使用道具 举报

发表于 2015-12-10 17:06 | 显示全部楼层
哈哈,,

大神纠结这个啊.

第一句写:

PB_DDR |= 0x01 << 5;
这样就很明白,
首先将 0x01 向左移5位,
0x01是 PB0,向左移5位就是PB5.

而 直接
PB_DDR |= 0x20;
的话看起来很简洁,但是新手并不能一眼看出这个0x20对应的是第几位.
效率两个看编译器,
一般来说编译器会自动优化的,效率估计一样.
回复

使用道具 举报

 楼主| 发表于 2015-12-10 18:15 | 显示全部楼层
junyee 发表于 2015-12-10 17:06
哈哈,,

大神纠结这个啊.

纠结啊,如果编译器不优化处理,
又移5位,岂不是占用5个指令周期。

STM8的手册真乱,用户手册,数据手册,参考手册,MCU编程手册,勘误手册,笔记。关键是同一个型号的两个手册,还前后矛盾。

比如STM8L152,数据手册说,VREF+是1.8V-VDDA,参考手册说是2.5-VDDA,我真不明白该以哪个为准了。

回复

使用道具 举报

 楼主| 发表于 2015-12-10 18:17 | 显示全部楼层
junyee 发表于 2015-12-10 17:06
哈哈,,

大神纠结这个啊.

我在用STM8L152设计一款100KHZ的电桥,有兴趣的话加我QQ,帮我一起写代码吧。我的QQ私信你了。

回复

使用道具 举报

发表于 2015-12-10 19:15 | 显示全部楼层
hotdll 发表于 2015-12-10 18:15
纠结啊,如果编译器不优化处理,
又移5位,岂不是占用5个指令周期。

都说了,这种直接赋值的那是编译器的事儿,不关芯片的事情。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-10-30 08:48 , Processed in 0.033366 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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