一个菜鸟问题??帮帮忙
我在一个程序里看到一个这样SREG的东西,可是我找不到它的定义,请问这是单片机本身的寄存器还是自己定义的变量?????谢谢 问题点数:20、回复次数:6Top
1 楼yangyzqo(欺世盗名来灌水)回复于 2005-11-04 08:30:02 得分 0
没注意过,UPTop
2 楼sunnysmile(★红☆狐★)回复于 2005-11-04 09:16:39 得分 0
单片机的寄存器Top
3 楼LeeAn(蝎子)回复于 2005-11-04 09:34:28 得分 0
寄存器Top
4 楼nxy825715(DSP_MCU)回复于 2005-11-04 14:56:19 得分 0
你再仔细的找找,如果是寄存器的话,则在头文件中有定义的Top
5 楼ghost_yuyi(幽灵)回复于 2005-11-04 20:31:17 得分 0
我找到了 在iom32v.h中是这么定义的
/* Status REGister */
#define SREG (*(volatile unsigned char *)0x5F)
但是还是不知道它的含义,有谁知道啊,或者提供这方面的资料.谢谢啊??????????????Top
6 楼ghost_yuyi(幽灵)回复于 2005-11-04 20:49:46 得分 0
这里有关于它的定义的解释,我找到的,留在这里希望大家看到,共同进步
另外,0x5f这个地址在单片机中代表什么啊,为什么SREG 要定义到0X5F这个地址呢?????????
terrence 发表于 2005-4-28 20:25 AVR 单片机
以前看到#define SREG (*(volatile unsigned char *)0x5F)
这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~
嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x5F,
第一步是要把它强制转换为指针类型
(unsigned char *)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向
unsigned char类型。
volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
第二步,对指针变量解引用,就能操作指针所指向的地址的内容了
*(volatile unsigned char *)0x5F
第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以#define SREG (*(volatile unsigned char *)0x5F)
类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR (*(volatile unsigned long *)0x0000555F)
然后就可以用C语言对这个内存地址进行读写操作了
读:tmp = RAM_ADDR;
写:RAM_ADDR = 0x55;
zhiwei 发表于 2005-4-30 18:59 AVR 单片机
定义未volatile是因为它的值可能会改变,大家都知道为什么改变了;
如果在一个循环操作中需要不停地判断一个内存数据,例如要等待SREG的I标志位置位,因为SREG也是映射在SRAM空间,为了加快速度,编译器可能会编译出这样的代码:把SREG读取到Register中,然后不停地判断Register相应位。而不会再读取SREG,这样当然是不行了,因为程序或其它事件(中断等)会改变SREG,结果很可能是一个死循环出不来了。如果定义成volatile型变量,编译的代码是这样的:每次要操作一个变量的时候都从内存中读取一次。
#define SREG (*(volatile unsigned char *)0x5F) 之后,可以进行如下基本操作,
unsigned char temp,*ptr;
temp=SREG;把SREG值保存到temp中
SREG=temp;把temp的值赋给SREG
ptr = & SREG; 不知对否,大家试一下。
BitFu 发表于 2005-5-12 09:07 AVR 单片机
1。关键字volatile保证编译器不会因为优化而省略本语句
例如象这样一条代码:
(unsigned char *)0x5F= 0XAA;
由于它与其上下的代码没有关联,编译器在优化时就会把它去掉,volatile
就是为防止这个。
2。由于AVR的寄存器与内部RAM在同一个地址空间,寄存器除了多两个8位地址访问指令外,其他地方与RAM没有区别,
0X5F即是SREG的内存地址,(unsigned char *)0x5f 就是指向SREG的指针(常量)。强制类型unsigned char 是因为SREG是8位的。
楼主的此段话很容易误导人:
“类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR (*(volatile unsigned long *)0x0000555F)
”
在C中指针变量本身的长度是固定的,例如在AVR-GCC中为16位,在于几位的处理器,而指针变量的类型意味着指向什么类型的数据。不论是32位处理器还是8为处理器如果是寄存器的长度为32位都应当定义成:(*(volatile unsigned long *)0x0000555F),也就是说强制类型转换的类型取决于指向多大的内存数据,楼主的话应改成:
“类似的, 在一个32位处理器中,要对一个32位的寄存器进行访问,可以这样定义#define RAM_ADDR (*(volatile unsigned long *)0x0000555F)”.
Top




