关于”__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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一叶知秋,一个 LED 就能入门 Linux 内核「建议收藏」

    一叶知秋,一个 LED 就能入门 Linux 内核「建议收藏」简单点灯最近项目上需要用到LED子系统,在嵌入式Linux里面点个灯还是比较简单的,只要在某个灯对应的目录里,向相应文件写入特定值,就可以让LED亮/灭/闪烁。#echo1>/sys/class/leds/green/brightness//点亮LED#echo0>/sys/class/leds/green/brightness//熄灭LED#echoheartbeat>/sys/class/leds/green/trigger//

    2022年7月16日
    21
  • 业务架构师如何进阶成长[通俗易懂]

    业务架构师如何进阶成长[通俗易懂]一、前言接触业务架构工作之后,除了单位提供的方法论外,为了做好这项工作,认真学习了软件过程、系统分析与设计、架构设计、设计模式、Java语言等内容,并研读了敏捷开发、领域驱动设计、工作流分析等方面的书籍,为了拓展对新技术的理解,在人工智能和区块链两方面也阅读了一些著作,总体而言,不够系统,都是为了能够更好地理解企业级业务架构的方法论及其向技术端的传导。除了恶补基础知识,更重要的当然是实践,珍惜每一个设计任务,珍惜每一次与业务人员、技术人员的沟通机会…

    2022年10月12日
    5
  • PHP fopen/file_get_contents与curl性能比较

    PHP fopen/file_get_contents与curl性能比较

    2022年2月9日
    49
  • JDK下载安装及环境变量配置的图文教程(详解)「建议收藏」

    JDK下载安装及环境变量配置的图文教程(详解)「建议收藏」学习Java,需要下载并安装JDK(JavaDevelopmentKit,Java开发工具包);而为了能够快捷打开java程序,就需要按照操作系统的要求进行环境变量的配置。一、下载并安装JDK(一)下载JDK搜索“jdk官方下载”或是直接进入Sun公司的官网(https://www.oracle.com/)…

    2022年6月1日
    34
  • Vue上传图片_解调的三种方式

    Vue上传图片_解调的三种方式项目中需要上传图片可谓是经常遇到的需求,本文将介绍3种不同的图片上传方式,在这总结分享一下,有什么建议或者意见,请大家踊跃提出来。没有业务场景的功能都是耍流氓,那么我们先来模拟一个需要实现的业务场景。假设我们要做一个后台系统添加商品的页面,有一些商品名称、信息等字段,还有需要上传商品轮播图的需求。我们就以Vue、Element-ui,封装组件为例子聊聊如何实现这个功能。其他框架或者不用框架…

    2022年10月16日
    4
  • 反应java程序并行机制的特点_Java语言具有许多优点和特点,下列选项中能反映Java程序并行机制特点的是()。…[通俗易懂]

    反应java程序并行机制的特点_Java语言具有许多优点和特点,下列选项中能反映Java程序并行机制特点的是()。…[通俗易懂]语言优点与Windows相比Linux在哪个方面应用相对较少?如果要检测是否按下的是方向右键,具有机制此时我们要定义键盘的什么属性?许多下列选项下面的代码是检测【Ctrl】和【V】是否同时按下的是?和特在ActionScript3.0中使用KeyboardEvent类来处理键盘操作事件。它有两种类型的键盘事件:KeyboardEvent.KEY_DOWN和KeyboardEvent.KEY_U…

    2022年7月8日
    21

发表回复

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

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