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

本文深入解析了C语言中volatile关键字的作用及其在嵌入式开发中的重要应用,强调了其防止编译器优化以确保数据正确性的必要性。通过实例解释了如何在访问特定内存地址时使用volatile关键字,以及它与unsigned类型转换结合时的特殊行为,旨在帮助开发者更好地理解和运用这一关键特性。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值