当前位置:首页 >> 信息与通信 >>

(volatile unsigned char )0x20


对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独 立的 IO 地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为 C 语言 并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。 以 #define IOPIN (*((volatile unsigned long *) 0xE0028000)) 为例:作为一个宏定

义语句, define 是定义一个变量或常量的伪指令。首先( volatile unsigned long * )的意思是将后面的那 个地址强制转换成 volatile unsigned long * , unsigned long * 是无符号长整形, volatile 是一个类 型限定符,如 const 一样,当使用 volatile 限定时,表示这个变量是依赖系统实现的,意味着这 个变量会被其他程序或者计算机硬件修改,由于地址依赖于硬件,

volatile 就表示他

的值会依赖于硬件。
volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端 更改了它, 现在硬件设备往往也有自己的私有内存地址, 比如显存, 他们一般是通过映象的方式, 反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。 另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被 改变了。如果不加这个 voliatile 修饰,程序是利用 catch 当中的数据,那个可能是过时的了,加 了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下: 1. volatile 变量可变 允许除了程序之外的比如硬件来修改他的内容 2. 访问该数据任何时候都会直接访问该地址处内容,即通过 cache 提高访问速度的优化被取消 对于((volatile unsigned long *) 0xE0028000)为随硬件需要定义的一种地址, 前面加上“*”指针, 为直接指向该地址,整个定义约定符号 IOPIN 代替,调用的时候直接对指向的地址寄存器写内 容既可。这实际上就是内存映射机制的方便性了。其中 volatile 关键字是嵌入式系统开发的一个 重要特点。上述表达式拆开来分析,首先(volatile unsigned long *) 0xE0028000 的意思是把 0xE0028000 强制转换成 volatile unsigned long 类型的指针,暂记为 p,那么就是#define A *p,即 A 为 P 指针指向位置的内容了。

这里就是通过内存寻址访问到寄存器 A, ,

可以读/写操作 可以读 写操作。

对于(volatile unsigned char *)0x20 我们再分析一下,它是由两部分组成: 1)(unsigned char *)0x20,0x20 只是个值,前面加(unsigned char *)表示 0x20 是个地址,而且 这个地址类型是 unsigned char ,意思是说读写这个地址时,要写进 unsigned char 的值,读出也 是 unsigned char 。 2)volatile,关键字 volatile 确保本条指令不会因 C 编译器的优化而被省略,且要求每次直接读 值。例如用 while((unsigned char *)0x20)时,有时系统可能不真正去读 0x20 的值,而是用第一次 读出的值,如果这样,那这个循环可能是个死循环。用了 volatile 则要求每次都去读 0x20 的实 际值。 那么(volatile unsigned char *)0x20 是一个固定的指针,是不可变的,不是变量。而 char *u 则是 个指针变量。 再在前面加"*":*(volatile unsigned char *)0x20 则变成了变量(普通的 unsigned char 变量,不是

指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与 unsigned char i 是一样了,只 不过前面的 i 的地址是固定的。 那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有 固定的地址,指向 0x20。而 0x20 只是个常量,不是指针更不是变量。

请问#define SREG (*(volatile unsigned char *)0x5F)?

直接写成#define SREG
最佳答案

(*(volatile unsigned char )0x5F)有什么问题吗?

(volatile unsigned char *)0x5F 这个意思是将 0x5F 这个值强行转换成(volatile unsigned char *)类型的一个指针, *((volatile unsigned char *)0x5F)代表将这个 指针所指向的内存空间的内容取出来...

(volatile unsigned char )0x5F 是指将 0x5F 强行转成(volatile unsigned char ) 类型的,(*(volatile unsigned char )0x5F)又拿着这个 volatile unsigned char 的值 当地址去取内容, 而 0X5F 本身是十六进制的, 把它当做一个地址还是一个 char 值去取这个值对应的内存内容是一样的(这个说法我拿不准)... 这两种写法都可以编译通过, 但是确是很危险的, 0X5F 这个地址是否可读写 不得而知...


相关文章:
(volatile unsigned char )0x20
对于(volatile unsigned char *)0x20 我们再分析一下,它是由两部分组成: 1)(unsigned char *)0x20,0x20 只是个值,前面加(unsigned char *)表示 0x20 是个...
volatile unsigned char详解
再在前面加"*":*(volatile unsigned char *)0x20 则变成了变量 (普通的 unsigned char 变量,不是指针变量) ,如果#define i (*(volatile unsigned char *)...
LK #define((volatile unsigned ) ) 的理解
LK130829R1 #define(*(volatile unsigned *) ) 的理解 对于(volatile unsigned char *)0x20 我们再分析一下,它是由两部分组成: 1)(unsigned char *)0x20,...
指针其实是个内存地址
0x20 是个整数,这里用(volatile unsigned char *)表示对它进行强制类型转化,这样 转化后表示 0x20 是个内存地址,或者是某个寄存器的地址,CPU 可以寻址得到,(/*...
单片机大作业整理文档
[定时器 1] #define T1SC *(volatile unsigned char *)0x20 //定时器 1 状态和控制寄存器 5 #define T1CNTH *(volatile unsigned char *)0x21 //定时器...
嵌入式实验报告,各实验答案
((volatile unsigned char *)(0x10500000))) #define LED_VALUE (0xff) int...0x8F8F; LED_CS4 = 0x3F; break; //key-press 3 case 0x20: //key-...
ARM定义特殊寄存器((volatile unsigned long ))的理解
再在前面加"*":*(volatile unsigned char *)0x20 则变成了变量(普通的 unsigned char 变量, 不是指针变量) , 如果#define i (*(volatile unsigned char *)...
单片机 C语言编程 概览
(bitno))) 2●Volatile unsigned char tmpData @ 0x20; //tmpData 定位在地址 0x20 Volatile bit tmpBit0 @ tmpData*8+0; //tmpBit0 对应于 tmpData ...
嵌入式实验 中断实验报告
((volatile unsigned char *)(0x41500008))) //Direct Keypad #define KPMK_...case 0x04: LED_CS2 = 0x8030; break; case 0x20: LED_CS2 =0x8019; bre...
嵌入式实验报告
0x20) { old = *((volatile U16 *)0x0); flashStatus = *((volatile ...2、程序如下: #define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020...
更多相关标签:
volatile unsigned | volatile char | unsigned char | unsigned char 长度 | c unsigned char | unsigned char 范围 | const unsigned char | unsigned char code |