先说说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)的理解相关推荐

  1. RealView MDK 使用

    1.分散加载文件(链接脚本文件)的格式 问题描述: 在链接的时候,要在不同的地址处添加链接文件,暨分散加载文件,这个分散加载文件有什么样的格式呢? 问题解答:         程序正确编译生成目标文件 ...

  2. RealView MDK使用

    作者:蓝色星宇 转自:http://www.cnblogs.com/glguan/archive/2011/05/04/2036138.html 来源:http://hi.baidu.com/hqy5 ...

  3. keil MDK中如何生成*.bin格式的文件

    在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...

  4. RealView MDK的指定位置

    u8 a[10] __attribute__ ((at(0x2000002c))); RealView MDK中如何指定子程序入口地址 http://blog.csdn.net/zyboy2000/a ...

  5. 从ADS到RealView MDK

    从ADS到RealView MDK 2010年11月25日 Keil是业界最受欢迎的51单片机开发工具之一,它拥有流畅的用户界面与强大的仿真功能.而ARM微控制器的开发工具RealView Micro ...

  6. MDK中hex转BIN文件生成

    MDK开发的技巧: 1.使用fromelf.exe程序,将.hex或者.axf转化为.bin文件. 2.利用.bat批处理文件,将.bin和.hex拷贝到需要的文件夹下. 例如:E685工装中 Run ...

  7. 关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释

    初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...

  8. ADS与RealView MDK

    在 ARM + Linux 培训班学习,讲师一般首先讲解用 ADS 或 RealView MDK 去调试 ARM 开发板.原因在于: 1.掌握 ARM 体系结构.ARM 是一种计算机,掌握其体系结构也 ...

  9. RealView MDK在链接时提示空间不够的解决方案总结

    RealView MDK具有强大的编译.链接功能.嵌入式设备拥有的资源往往有限,如果一个程序编译.链接之后的可执行文件大小略大于存储大小时,则不能生成可执行文件进行调试或固化到Flash中.在这种情况 ...

最新文章

  1. 王者齐聚!Unite 2017 Shanghai 日程讲师全揭晓
  2. AngularJS小结
  3. python自动化_Python 实现Excel自动化办公上
  4. Acrobat Pro DC 2021 for Mac(pdf编辑器)中文版
  5. ad18 bell封装,AD元件库中常用元件
  6. 路由汇聚特点及环路避免
  7. 强烈推荐这款刷题小程序
  8. 最全MacWin软件分享
  9. 感动世界的50首歌和他们背后的故事3
  10. 安卓手机游戏《英雄迷宫冒险》存档修改
  11. 前序中序出后序——二叉树
  12. H3C路由技术笔记——Policy-Based-Route
  13. JAVA 基本语法 Scanner类的使用 实现步骤 三步走(Scanner)
  14. NDK开发之JNI基础
  15. 【我的新学期】学习季
  16. 信修修:安全省心!U盘安装纯净原版Win10系统教程!
  17. 北航操作系统课程-20200302课堂小测-操作系统引论
  18. 大龄宝妈上岸谷歌——竟“抛夫弃子”
  19. 8086如何计算物理地址
  20. 基于WP7开发的Silverlight常用控件详解

热门文章

  1. 为什么Google优化排名前期要做长尾关键词?谷歌seo怎么做?
  2. LeetCode刷题7--Nim游戏
  3. Android开发技术周报 Issue#27
  4. c语言微信小程序编程,微信小程序实现类似微信点击语音播放效果
  5. javaScript 美化上传文件框(加预览移除效果)
  6. python如何调用谷歌搜图api_python爬虫——selenium+chrome使用代理
  7. scrapy爬取京东笔记本电脑数据并进行简单处理和分析
  8. 代码不朽笔记: 编写简单的代码单元
  9. PHP实现简易的MVC框架
  10. 极光IM系列之java后台集成