完善资料让更多小伙伴认识你,还能领取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语言的话,还是一样的,因为那些代码都可以用宏定义或者函数来封装。 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2810 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2420 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2288 浏览 0 评论
2404 浏览 1 评论
1643 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 12:35 , Processed in 0.454115 second(s), Total 41, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
414