RealView MDK中(volatitle unsigned *)(0x40005c00)的理解

来源:互联网 发布:怎么做淘宝模特 编辑:程序博客网 时间:2024/05/21 22:48

  先说说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--之类的运算对于指向函数的指针变量是无意义的。

 

原创粉丝点击