RealView MDK中(volatitle unsigned *)(0x40005c00)的理解
先说说volatitle的含义,在C语言中,volatile关键字是一种类型修饰符,有volatitle声明的变量在使用时要求系统总是从它所在的内存位置读取数据。用volatile是为了防止编译器优化(C编译器在编译的过程中会对程序进行优化,以使生成的汇编代码尽量简练),这种优化有时会导致一些问题。例如:
volatile int var=10;
int a=var;
````````````
int b=var;
(以上在对a,b赋值之间的代码没有对var变量进行操作)。
当int b=var时,编译器生成的汇编代码会重新从变量var的地址处读取数据放在b中。如果不用volatile进行声明,由于编译器发现前后两次从变量var中读数据的过程中没有对var进行过操作,它会自动把上次读到的数据放到b中,而不是重新从var的内存地址中读取。这样如果var是一个寄存器变量或者是一个端口的状态寄存器的话就会容易出错,因为虽然程序没有对变量操作,但是硬件可能会改变该值。
(volatile关键字在嵌入式开发中经常用到,因为嵌入式系统编程,常常要求能够利用C语言访问固定的内存地址)
接下来分析(volatitle unsigned *)(0x40005c00),有人也许会疑问unsigned是怎么回事,因为一般出现都是unsigned int,unsigned char等。一般来说,若unsigned后省略一个关键字,编译器会默认为是unsigned int,在MDK中unsigned int定义的变量是四个字节的变量。此处前一个括号的含义是强制转换0x40005c00为unsigned型变量的地址,且每次使用到该变量都会从0x40005c00处访问。为了便于理解可以假设一个unsigned *p(p为0x40005c00),指针变量p指向unsigned型数据,p就相当于&取地址后赋上了值为0x40005c00。
*p等价于 *((volatile unsigned *)(0x40005c00))
而p+1则等价于 ((volatile unsigned *)(0x40005c00))+1。此处p+1的结果是0x40005c04而不是0x40005c01。
C语言中有规定,如果指针变量已经指向数组中的一个元素,则变量+1不是简单的将变量的值(地址)加上1,而是指向下一个元素,例如,若指向unsigned int,因为unsigned int在MDK中占4个字节,则变量+1意味着变量的值(地址)加上4个字节。所以根据所述以上p+1可以理解为p的值加上4。
此时,也许会有人会问,那若是一个指向函数的指针的话,那么p+1应该怎么算呢?其实,这是无意义的,因为C语言中规定,像p+n,p++,p--之类的运算对于指向函数的指针变量是无意义的。
RealView MDK中(volatitle unsigned *)(0x40005c00)的理解相关推荐
- RealView MDK 使用
1.分散加载文件(链接脚本文件)的格式 问题描述: 在链接的时候,要在不同的地址处添加链接文件,暨分散加载文件,这个分散加载文件有什么样的格式呢? 问题解答: 程序正确编译生成目标文件 ...
- RealView MDK使用
作者:蓝色星宇 转自:http://www.cnblogs.com/glguan/archive/2011/05/04/2036138.html 来源:http://hi.baidu.com/hqy5 ...
- keil MDK中如何生成*.bin格式的文件
在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...
- RealView MDK的指定位置
u8 a[10] __attribute__ ((at(0x2000002c))); RealView MDK中如何指定子程序入口地址 http://blog.csdn.net/zyboy2000/a ...
- 从ADS到RealView MDK
从ADS到RealView MDK 2010年11月25日 Keil是业界最受欢迎的51单片机开发工具之一,它拥有流畅的用户界面与强大的仿真功能.而ARM微控制器的开发工具RealView Micro ...
- MDK中hex转BIN文件生成
MDK开发的技巧: 1.使用fromelf.exe程序,将.hex或者.axf转化为.bin文件. 2.利用.bat批处理文件,将.bin和.hex拷贝到需要的文件夹下. 例如:E685工装中 Run ...
- 关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释
初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...
- ADS与RealView MDK
在 ARM + Linux 培训班学习,讲师一般首先讲解用 ADS 或 RealView MDK 去调试 ARM 开发板.原因在于: 1.掌握 ARM 体系结构.ARM 是一种计算机,掌握其体系结构也 ...
- RealView MDK在链接时提示空间不够的解决方案总结
RealView MDK具有强大的编译.链接功能.嵌入式设备拥有的资源往往有限,如果一个程序编译.链接之后的可执行文件大小略大于存储大小时,则不能生成可执行文件进行调试或固化到Flash中.在这种情况 ...
最新文章
- 王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓
- AngularJS小结
- python自动化_Python 实现Excel自动化办公上
- Acrobat Pro DC 2021 for Mac(pdf编辑器)中文版
- ad18 bell封装,AD元件库中常用元件
- 路由汇聚特点及环路避免
- 强烈推荐这款刷题小程序
- 最全MacWin软件分享
- 感动世界的50首歌和他们背后的故事3
- 安卓手机游戏《英雄迷宫冒险》存档修改
- 前序中序出后序——二叉树
- H3C路由技术笔记——Policy-Based-Route
- JAVA 基本语法 Scanner类的使用 实现步骤 三步走(Scanner)
- NDK开发之JNI基础
- 【我的新学期】学习季
- 信修修:安全省心!U盘安装纯净原版Win10系统教程!
- 北航操作系统课程-20200302课堂小测-操作系统引论
- 大龄宝妈上岸谷歌——竟“抛夫弃子”
- 8086如何计算物理地址
- 基于WP7开发的Silverlight常用控件详解