Linux开发讲课32---宏定义与volatile有何功能

宏定义-地址内容
eg:SOC中内部物理地址0xC000A001;其中[9:8]位域表示GPIO口的功能选择.
版本1
在C语言中,
0xC000A001:表示数值
(unsigned int *)0xC000A001:数值0xC000A001经过(unsigned int *)强制转换成:表示地址。
*(unsigned int *)0xC000A001:表示取出地址(unsigned int *)0xC000A001指向的内存空间里的内容。
*(unsigned int *)0xC000A001 = *(unsigned int *)0xC000A001;
等号右边:表示取出地址(unsigned int *)0xC000A001里面的值(数据)
赋值给
等号左边:地址(unsigned int *)0xC000A001指向的内存空间
操作[9:8]功能选择位域:
*(unsigned int *)0xC000A001 = *(unsigned int *)0xC000A001 & (~(0x3 << 8));
版本2
#define GPIOALT (*(volatile unsigned int *)0xC000A001)
*(unsigned int *)0xC000A001 = *(unsigned int *)0xC000A001 & (~(0x3 << 8));
可简写成:
GPIOALT = GPIOALT & (~(0x3 << 8));或 GPIOALT &= (~(0x3 << 8));

版本3
#define NUM 保留的地址个数
typedef unsigned int uint;
typedef strcut{
uint OUT;
uint ALT;
uint resd[NUM];
uint ENABL;
}gpio;
#define GPIOA (*(* volatile gpio)0xC000A000)
#define GPIOB (*(* volatile gpio)0xC000B000)
#define GPIOC (*(* volatile gpio)0xC000C000)
#define GPIOD (*(* volatile gpio)0xC000D000)
#define GPIOE (*(* volatile gpio)0xC000E000)
//使用方法:
GPIOA.OUT &= (~(0x3 << 10));
...
volatile-关键字功能
volatile防止编译器对代码进行优化:因为编译器为了提高带代码的执行效率,会将经常访问的变量放在高速缓存cache中,每次读数据都是从cache里读取数据,不是从内存中读,当内存数据变化时,cache的值来不及改变,会造成取值错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/41885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因&#xff1a;在matlab中运行Offset surface of triangle mesh in matlab的时候报错&#xff1a; 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

获取随机数

随机数&#xff1a;Java帮我们写好一个类叫Random&#xff0c;这个类就可以生成一个随机数。 使用步骤&#xff1a; 1.导包&#xff1a;Random这个类在那里 2.创建对象&#xff1a;表示我要开始用Random这个类 Random r new Random(); 3.生成随机数 判断技巧&#xff1a…

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

HDF4文件转TIF格式

HDF4 HDF4&#xff08;Hierarchical Data Format version 4&#xff09;是一种用于存储和管理机器间数据的库和多功能文件格式。它是一种自描述的文件格式&#xff0c;用于存档和管理数据。 HDF4与HDF5是两种截然不同的技术&#xff0c;HDF5解决了HDF4的一些重要缺陷。因此&am…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

Python中解决os.listdir命令读取文件乱序问题方法

Python中使用对话框批量打开文件时出现乱序问题的解决方法 一、问题描述二、os.listdir读取文件乱序问题解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 有时候为了方便&#xff0c;我们在进…

Docker-基础

一&#xff0c;Docker简介&#xff0c;功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化&#xff0c;容器…

机器学习 - 模型性能评估

F1度量 F1度量是用于评估分类模型性能的一个综合指标&#xff0c;它同时考虑了查准率&#xff08;Precision, P&#xff09;和查全率&#xff08;Recall, R&#xff09;。F1度量的公式如下&#xff1a; F 1 2 P R P R F1 \frac{2 \times P \times R}{P R} F1PR2PR​ 其…

java-linkedlist 源码分析 2

### 5. 迭代器支持 LinkedList 实 现了 Iterable 接口&#xff0c;提供了支持迭代的功能&#xff1a; java public Iterator<E> iterator() { return new ListItr(0); } public ListIterator<E> listIterator(int index) { checkPositionIndex(index);…

vue计算属性 computed

计算属性 computed 模板语法的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 模板语法&#xff1a;模板语法链接 <template…

表单自定义组件 - 可选择卡片SelectCard

import React from react; import styles from ./index.module.less;type OptionsType {/*** 每个item渲染一行&#xff0c;第0项为标题*/labels?: any[];/*** 自定义渲染内容*/label?: string | React.ReactNode;value: any; }; interface IProps {value?: any;onChange?…

【C++】B树及其实现

写目录 一、B树的基本概念1.引入2.B树的概念 二、B树的实现1.B树的定义2.B树的查找3.B树的插入操作4.B树的删除5.B树的遍历6.B树的高度7.整体代码 三、B树和B*树1.B树2.B*树3.总结 一、B树的基本概念 1.引入 我们已经学习过二叉排序树、AVL树和红黑树三种树形查找结构&#x…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…

关于HTTP的攻击实验

实验原理&#xff1a;1. 根据ARP中间人攻击&#xff0c;获取 用户和服务器之间的数据2. 将获取到的数据 通过一定的技术来复原&#xff0c;进而获取用户的信息或者 相关权限实验拓扑图 将 kali 的网卡改为桥接模式&#xff0c;查看Kali和本机的ip 启动ettercap&#xff0c;…

【Python学习】流程控制、函数与类详解

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言&#xff0c;提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

uniapp video视频铺满容器,不显示控件

1、video标签的属性 参考video | uni-app官网 enable-progress-gesture&#xff1a;是否开启控制进度的手势&#xff0c;bool值 show-center-play-btn&#xff1a;是否显示视频中间的播放按钮&#xff0c;bool值 object-fit&#xff1a;当视频大小与 video 容器大小不一致时&…

阿里云OSS文件上传不配置环境变量使用显式AccessKey验证

问题背景 在中阿里云官方文档中介绍文件上传时&#xff0c;推荐配置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。这里用简单的方法&#xff0c;直接在Demo.java中显式指定accessKeyId和accessKeySecret&#xff0c;同时修改OSSClientBuilder()的入参。 解决方法 首先…

C语言 -- 深入理解指针(一)

C语言 -- 深入理解指针&#xff08;一&#xff09; 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;​2.2 指针变量和解引用操作符&#xff08;*&#xff09;​​2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权&#xff0c;当最后⼀个指涉到该对象的shared_ptr不再指向他时&#xff0c;shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个&#xff1f;《引⽤计数》 shared_ptr构造函数&#xff0c;使引⽤计数析构函数&…