完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用了不少芯片,就只有51有位操作,这个特性很喜欢,赋值简单、效率又高且节省内存,不必为了一个bool去分配一个uint8. 发现STM32有Bit-Banding,就试了一下,用MDK-ARM环境下的汇编代码做了一些比较。 操作,清零USART1的SR寄存器的TC位: 方法一: //利用USART_TypeDef这个结构寻到SR的地址,再赋值USART1->SR &= ~(1<<6);其汇编代码(-level 0)如下: 用了7条指令。 方法二: 直接用SR的地址操作: *(__IO uint32_t *) 0x40013800 &= ~(1<<6);汇编如下: 可以看到代码跟方法一是一样的,所以以后没有必要用这个方法了,一点效率提升都没有,代码还难读。 方法三: 位域 //下面两个宏的汇编代码是一样的#define USART1_TC_ResetBit_BB() (*(__IO uint32_t *) (PERIPH_BB_BASE | ((USART1_BASE + 0x00 - PERIPH_BASE) << 5) | ((6) << 2)) = 0)#define USART1_TC_ResetBit_BB2() (*(__IO uint32_t *) 0x42270018 = 0)这个位域的代码只需要3个指令,而且可定义看到,这个位域不像51那样是位寻址,有专业的位操作指令。上面这3条还是通用的指令,也是在4G空间线性寻址。 执行完之后的效果,可以看到TC被清除了: 综上所述,Bit-Banding确实可以提高代码效率,但是说到写程序的方便程度,如果用C语言的话,还是一样的,因为那些代码都可以用宏定义或者函数来封装。 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 04:51 , Processed in 0.591015 second(s), Total 70, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号