关于CM3/CM4位带操作的总结

news/2024/11/15 5:15:06/

1.位带操作定义

        STM32的存储器映射中的内存区域和外设区域有一段地址空间(都是最低1MB)是位带区域,跟这个区域相对应的有一段位带别名区域,位带别名区的大小是位带区的32倍,位带别名区的每一个地址都对应位带区域的一个位,如位带别名区的0x42000000~0x42000007代表的是位带区的0x40000000的0-7位,给0x42000000赋值就相当于给0x40000000的最低位赋值。

2.位带操作的范围:内存和外设的最低1MB,对于内存小于1MB的MCU来说整个内存空间都是可以进行位带操作的;外设的话只要外设寄存器的地址没有超出1MB的范围(0x40100000)都是可以进行位带操作的,如GPIO寄存器,事实上绝大部分的外设寄存器都落在这个区域。

3.如何计算一个位带地址对应的位带别名地址(如一个内存地址中的某一个位的位带别名地址)

 在C中使用位带操作:配合宏定义

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

当然由于这个宏定义表达式比较复杂,涉及很多次逻辑运算和算术运算(宏定义在编译的时候只是进行简单的替换,并不计算),所以这样用的话无法完全体现出位操作对程序执行效率的提升,因此如果追求极致速率的话那就直接把需要位操作的地址的位带别名地址计算好再用宏定义定义起来,这样使用的时候就直接对该宏定义赋值或取值就行。(后面自己实际试了下好像不是这样,两者的执行时间是一样的,就好像宏定义并不是只是简单的替换,还把所有运算都算完了一样,但是网上说宏定义的确只是执行简单替换操作,搞不懂)。

4.位带操作的优越性/好处

        1.位带操作执行效率更高,无论是位带写还是读,编译到汇编指令时,位带操作对于直接操作寄存器都会少一个指令:

        2.可以把一系列bool型变量封装到一个整形变量里去,然后还像操作内存地址一样读写某个bool值

        3.这点是最重要的,位带操作的读写动作是硬件级别支持的原子操作,不能被打断;常规的写某个寄存器或者内存的值都有“读-改-写”三个步骤,在这之间是可以被打断的,有的时候就会因为这个打断而导致数据异常从而导致程序异常,如下图:

 因此,在程序中对于一些关键变量的读写操作最好使用位带操作。

4.使用注意事项:当你使用位带功能时,要访问的变量必须用 volatile 来修饰,因为 C 编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的 虑 在中途使用寄存器来操作数据的复本,直到最后才把复本写会(这和cache的原理是一样的)

5.使用

        1.使用位带操作读写变量:

        2.使用位带操作整合bool变量

         3.位带操作和常规操作速度对比

         


http://www.ppmy.cn/news/625375.html

相关文章

树莓派CM4官方底板的双路摄像头使用

关键词&#xff1a;树莓派&#xff0c;核心板&#xff0c;Compute Module4 IO Board&#xff0c;CM4 概述&#xff1a;树莓派CM4官方底板上提供双MIPI CSI-2摄像头接口&#xff0c;本帖演示如何使用双路摄像头 操作系统&#xff1a;Raspberry Pi OS with desktop and recommen…

树莓派cm4安装ax200驱动-wifi6

操作过程 0. 准备 树莓派CM4-CMIO套装&#xff08;目前只有这套装有PCIE接口&#xff09; AX200-WIFI6网卡 一台win10电脑用于我的主电脑用来烧写树莓派固件以及修改boot中的config.txt 一台ubuntu20电脑编译树莓派内核 1. 树莓派cm4基本操作 1.1 烧写最新固件到emmc 请看这…

CM4 空格替换

空格替换 解题思路 String是不可变的 但是StringBuffer是可变的 并且StringBuffer的append(index,element)方法可以添加元素.toString()方法可以转换成字符串。 import java.util.*;public class Replacement {public String replaceSpace(String iniString, int length) {// …

【构建基于树莓派cm4的机器人控制系统的运行环境】

概述&#xff1a;以前的机器人控制系统使用的是X86硬件平台&#xff0c;x86平台的运算性能高&#xff0c;但是成本也较高。近些年arm平台的应用越来越广泛&#xff0c;而且其运算性能与x86的差距越来越小。以cm4对比J1900cpu&#xff0c;进行机器人控制器常用算法效率对比测试.…

在树莓派计算模块CM4 eMMC上安装Ubuntu Desktop 21.04

陈拓 2021/09/29-2021/11/27 在不需要桌面的情况下可以安装Server版&#xff0c;节省空间&#xff0c;速度快。 在树莓派计算模块CM4 eMMC上安装Ubuntu Server 21.04_晨之清风-CSDN博客陈拓 2021/10/05-2021/10/051. 概述在《在树莓派计算模块CM4 eMMC上安装Ubuntu Desktop 21…

树莓派CM4平台超级电容UPS解决方案

关键词&#xff1a;树莓派 CM4 超级电容 UPS 不间断电源 掉电保护 SuperCap MCU电源管理 来电重启 概述&#xff1a;树莓派CM4平台已经被广泛应用于各行各业&#xff0c;在一些高可靠性应用场合需要有完善的电源管理系统来确保数据被完整保存&#xff0c;系统被安全…

树莓派CM4六路串口设置及使用

最近在做公司项目的时候使用了CM4核心板&#xff0c;与底板相对应的是野芯科技的5G底板。有一个需求是调用串口接收GPS模块信息&#xff0c;在配置串口时候绕了好大一圈&#xff0c;现在准备总结下。 树莓派包含两个串口 1.硬件串口&#xff08;/dev/ttyAMA0&#xff09;,硬件…

树莓派CM4 USB不能使用

最近烧录了树莓派CM4系统&#xff0c;发现usb设备&#xff08;鼠标、键盘&#xff09;不能使用 一查才知道CM4为了减少功耗默认关闭了USB功能 想要使用就在 config.txt文件里 里把下面语句前面的#取消掉&#xff1a; #dtoverlaydwc2,dr_modehost很奇怪&#xff0c;我取消了注…