关于”__IO uint32_t” 中的__IO 表达的意思

关于”__IO uint32_t” 中的__IO 表达的意思这个_IO是指静态volatileuint32_t是指32位的无符号整形变量

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

    这个_IO 是指静态 这个 _IO 是指静态 volatile uint32_t 是指32位的无符号整形变量uint32_t 是指32位的无符号整形变量;

    搞stm32这么久了,经常看到stm32里面库文件里面有用“_IO”定义的变量,查过一下当时记住了,过段时间又给忘记了。所以才特意的写一个博文来记住。

volatile

volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:

1. volatile变量可变允许除了程序之外的比如硬件来修改他的内容 
2. 
访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消 

对于((volatile unsigned long *) 0xE0028000)为随硬件需要定义的一种地址,前面加上“*”指针,为直接指向该地址,整个定义约定符号IOPIN代替,调用的时候直接对指向的地址寄存器写内容既可。这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。上述表达式拆开来分析,首先(volatile unsigned long *) 0xE0028000的意思是把0xE0028000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作。

对于(volatile 

unsigned 

char 

*)0x20我们再分析一下,它是由两部分组成:
1)(unsigned 


char 

*)0x20,0x20只是个值,前面加(unsigned 

char 

*)表示0x20是个地址,而且这个地址类型是unsigned 

char 

,意思是说读写这个地址时,要写进unsigned 

char 

的值,读出也是unsigned 

char 


2)volatile,关键字volatile 


确保本条指令不会因C 

编译器的优化而被省略,且要求每次直接读值。例如用while((unsigned 

char 

*)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 

则要求每次都去读0x20的实际值。

那么(volatile 

unsigned 

char 

*)0x20是一个固定的指针,是不可变的,不是变量。而char 

*u则是个指针变量。
再在前面加”*”:*(volatile 


unsigned 

char 

*)0x20则变成了变量(普通的unsigned 

char变量,不是指针变量),如果#define 



(*(volatile 

unsigned 

char 

*)0x20),那么与unsigned 

char 

i是一样了,只不过前面的i的地址是固定的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197376.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是java常量「建议收藏」

    什么是java常量「建议收藏」  相信很多在学java技术的同学,对java常量这个并不陌生,什么是java常量呢?java常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。  下面我们就一起来看看java中的这些常量:  1.整型常量  整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制4种表示形式具体表示形式如下。  二进制:由数字0和1组成的数字序列。在JDK7.0中允许使用字面值来表示二进制数,前面

    2022年7月8日
    26
  • C++的后端框架从头开发[通俗易懂]

    C++的后端框架从头开发[通俗易懂]基于C++的后端框架Ratel简介:从开发到现在已经半个月了,我会进行长期地开发、维护和优化,直到它变得完善。各种建议和错误读者都可以和我联系,从公众号中就可以找到我的联系方式~Ratel后端框架目前采用C++作为开发语言,理想的效果是实现一个通用的、灵活的、高效的后端开发框架,可以自由选择不同的I/O复用机制,可以自由选择采用多线程、多进程或协程方式实现,并且可以跨平台Linux和Window平台编译和运行。目前已有功能:Linux和Windows跨平台运行

    2022年6月9日
    134
  • G1 收集器介绍「建议收藏」

    G1 收集器介绍「建议收藏」G1收集器一.名词解释MetaSpace在Java8之后取代永久代方法区的内存部分,NativeMemoryMixedGCEvent所有YoungRegion和一部分OldRegion的混合GC时间。ReclaimableG1为了能够回收,创建了一系列专门用于对象回收的Region,存放在链表中,只包含存活率小于-XX:G1MixedGCLIveThr…

    2022年6月7日
    47
  • pcAnywhere IP 端口的使用及更改「建议收藏」

    pcAnywhere IP 端口的使用及更改「建议收藏」为了安全服务器的很多端口都关闭,但有时为了管理方便,开启远程控制,pcanywhere是一款不错的软件。要配置防火墙以便可以进行pcAnywhere连接,并且需要了解pcAnywhere使用哪

    2022年7月2日
    21
  • goland 2021.5 激活码(最新序列号破解)

    goland 2021.5 激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
    151
  • 公共NTP服务器地址大全

    公共NTP服务器地址大全NTP是NetworkTimeProtocol的简称,也就是网络时间协议。而NTP服务器是可以通过网络来同步时间的服务器。Linux下使用ntpdate命令进行校时:ntpdatentp.sjtu.edu.cn· 地区 NTP服务 NTP地址 国内知名公共NTP服务器地址 ChinesePublicNTPServer 国家授时中心NTP服务器 NTSCNTPServer ntp.ntsc.ac.cn

    2022年6月12日
    61

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号