CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  硬件/嵌入开发 >  单片机/工控

一个菜鸟问题??帮帮忙

楼主ghost_yuyi(幽灵)2005-11-03 22:20:35 在 硬件/嵌入开发 / 单片机/工控 提问

我在一个程序里看到一个这样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

相关问题

  • 菜鸟
  • 菜鸟
  • 菜鸟
  • 菜鸟菜问!
  • 菜鸟菜问
  • 菜菜鸟问!
  • 菜鸟问题 (菜鸟问)
  • 菜鸟中菜鸟提问
  • 菜菜菜菜菜菜鸟问题
  • 菜鸟菜问题

关键词

  • 单片机
  • 内存
  • 指针
  • 编译器
  • 代码
  • 转换
  • 数据
  • x5f
  • sreg
  • 寄存器

得分解答快速导航

  • 帖主:ghost_yuyi

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo