关于“#define REG_MEM_BASE (*(volatile unsigend long *)(PA_BAES + 0x00000050))”语句的解析
对于嵌入式开发中经常遇到类似上述文件的定义,尤其在内存映射部分;为方便今后理解特举一个例子进行分析:
#define REG_MEM_BASE (*(volatile unsigend long *)(PA_BAES + 0x00000050))
(1)PA_BASE是一个宏定义
#define PA_BASE 0x40000000 ----一般定义一个内存映射之后某一区域(如IO口映射)的首地址
(2)00000050h
这个是一个内存的偏移地址,实际为0x40000000+0x00000050=0x40000050
(3)volatile
这个是C中的一个关键字,经常在嵌入式开发中使用(尤其是在涉及存储器操作的时候),目的是告诉编译器不要对这个变量进行优化,这样实际代码中访问此变量时都会从外部存储器直接读取,防止变量值在读取操作过程中发生变化,而程序却无法察觉,导致异常错误
(4)(volatile unsigend long *)(PA_BAES + 0x00000050)
这表示一个地址,通过unsigned long进行强制转化;
(5) (*(volatile unsigend long *)(PA_BAES + 0x00000050))
这个表示指针变量,可以看做一个普通变量,这个变量有固定地址,指向PA_BAES + 0x00000050,并且可以进行读写操作
(6)为方便进行读写操作,使用#define预定义,将 (*(volatile unsigend long *)(PA_BAES + 0x00000050)) 重新命名为 REG_MEM_BASE。
注:
关于volatile关键字:
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。这个关键字是用来设定某个对象的存储位置在内存中,而不是寄存器中。因为一般的对象编译器可能会将其的拷贝放在寄存器中用以加快指令的执行速度。
一般说来,volatile用在如下的几个地方:
(1)中断服务程序中修改的供其它程序检测的变量需要加 volatile;
(2) 多任务环境下各任务间共享的标志应该加 volatile;
(3) 存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义;
关于“#define REG_MEM_BASE (*(volatile unsigend long *)(PA_BAES + 0x00000050))”语句的解析相关推荐
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- 【嵌入式】——对#define GPBCON (*(volatile unsigned long*)0x56000010)的理解
#define GPBCON (*(volatile unsigned long*)0x56000010) 1:volatile 当计算机需要一个数值的时候,会先把内存中的值读取到寄存器,然后下次在使 ...
- #define GPBCON (*(volatile unsigned *)0x56000010) 的理解
2019独角兽企业重金招聘Python工程师标准>>> 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使 ...
- c语言不通类型指针转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- C语言里 指针变量强制类型转换,C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)...
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- #define rXXX (*(volatile unsigned long *)0xxxxxx)
一句简答的#define rGPFCON (*(volatile unsigned long *)0x56000050)的意思是什么就可以看看下面的内容. (volatile unsigne ...
- C和指针之const、#define、volatile
1.const 定义const 只读变量,具有不可变形 const int a = 100; 编译器通常不为普通Const只读变量分配存储空间, 而是将它们保存在符号表中, 这使得它成为一个编 ...
- 韦东山 Linux开发板,从零开始构建bootloader(基于韦东山JZ2440V3开发板)
从零开始构建bootloader 项目步骤: 第一阶段: 1.关看门狗: 2.时钟初始化: 3.内存初始化: 4.NandFlash初始化: 5.代码重定位(将flash中的代码复 ...
- 嵌入式系统开发过程中遇到的——volatile
嵌入式 系统开发过程中遇到的-- volatile 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的 .如果系统结构支持独立的 I/O 地址空间,并且是端口映射,就必须使用汇编语言完成 ...
最新文章
- 面试题:mysql 数据类型
- 当前被频频提及的企业数字化转型是什么?
- c# ef报错_C#中Entity Framework常见报错汇总
- 分布式离线计算—MapReduce—基础介绍
- MySQL----示例知识点整理
- 看看80万程序员怎么评论:前端程序员会不会失业?
- [人工智能]隔墙有眼,吓屎了
- NodeJs 实现 WebSocket 即时通讯(简单版)
- css选择器思维导图
- 19年Q2了,运维的你有啥计划吗?
- Ubuntu 18.04安装: failed to load ldlinux.c32
- 部署calico网络的k8s集群
- 快闪类企业校园招聘H5,这么设计才够炫!
- SQL学习笔记(06)_SELECT INTO
- 齐齐哈尔大学计算机考研资料汇总
- 计算机考研基本信息,复旦大学计算机考研基本信息
- win10下的edge如何打开ie的兼容性视图?
- OSChina 周五乱弹 ——程序员的爱情观
- 云主机如何保证信息安全?
- angular2后台管理系统