打印
[ZLG-ARM]

#define VECTOR_RAM ((unsigned char *)0x40000000)是什么意思?

[复制链接]
3191|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjb800zjb|  楼主 | 2007-1-28 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人初学,有问题想问!
程序在《ARM嵌入式系统实验教程一》的P99,程序开头先写了
#define VECTOR_RAM ((unsigned char *)0x40000000)
然后后面用到 
uint8 *addr;
addr=VECTOR_RAM;

我知道uint8 *addr这句定义了一个指针addr,但是后面那句addr=VECTOR_RAM到底是令指针指向了0x40000000,还是指向了0x40000000中的内容所指向的存储空间?
谢谢!!!

相关帖子

沙发
zjb800zjb|  楼主 | 2007-1-28 22:37 | 只看该作者

我又想了一下

我又想了一下,(unsigned char *)0x40000000是不是把0x40000000转换成了一个指针?那么这个指针是指向什么?而且0x40000000是32位(二进制),unsigned char是8位的啊。我把源程序发给大家看:
是《ARM嵌入式系统实验教程一》的P99的一个用于存储器重映射实验的程序
#include "config.h"
#define VECTOR_RAM ((unsigned char *) 0x40000000)

int main(void)
{
 uint8 i;
 uint8 *addr;
 
 MEMMAP=0x02;
 addr=VECTOR_RAM;
 for(i=0;i<64;i++)
 {
  *addr=0x55;
  addr++;
 }
 addr=VECTOR_RAM;
 for(i=0;i<64;i++)
 {
  *addr=0xAA;
  addr++;
 }
 MEMMAP=0x00;
 while(1);
 return(0);
}

使用特权

评论回复
板凳
zjb800zjb|  楼主 | 2007-1-28 22:41 | 只看该作者

是不是这样的

(unsigned char *)0x40000000就是制造出了一个指向地址为0x40000000的存储空间(0x40000000~0x4000003F是片内RAM)的指针?是这样的吗?

使用特权

评论回复
地板
zlgARM| | 2007-1-29 08:24 | 只看该作者

RE

那个语句说明了某内存地址对应的内存单元用来存放无符号字节类型数据。

简单地说,就是规定了某内存单元用来放什么数据,该内存单元用它的地址来指代。

使用特权

评论回复
5
db10| | 2007-1-29 21:32 | 只看该作者

这个是学C最基本的东西了

使用特权

评论回复
6
zjb800zjb|  楼主 | 2007-1-30 00:11 | 只看该作者

谢谢!

以前没见过这样的句子。。。这回记住啦。我加到自己的笔记里去。谢谢回复的朋友

使用特权

评论回复
7
hnmajl| | 2007-1-31 22:55 | 只看该作者

看我的理解,C语言我也没学过,是否正确?也正学习

 /*****************************************************
文件名: REMAP.c
功能:   将存储器重新映射到片内RAM(0x40000000~0x40000003F),然后更改0x40000000~0x4000003F的内容.
说明:   观察 0x40000000~0x40000003F地址上的数据有何变化.
***************************************************************/
#include       "config.h"
#define        VECTOR_RAM     (unsigned char *)0x40000000   //定义一个无符号字符型常量指针(地址)
                              //重点理解如下:因为不能将一个整型量或任何其它非地址类型的数据赋值给
                              //一个指针变量或常量,故用"unsigned char(无符号字符型,其实质也是整数数据)"定义,
                              //为了说明该字符型变量(常量)为指针(地址)用*定义,同 int *ip,该语句意思为定义
                              //一个指针变量,同样(unsigned char *)0x40000000为一个无符号型常量指针(地址),
                              //用"*"来说明该常量为一个指针(地址)型,
/*****************************************************************
**名称:main()
**功能:存储器映射
******************************************************************/

int    main(void)
                                 
 {    uint8     i;               //  定义一个变量
      uint8    *addr ;       // 定义指针类型变量addr
      
      MEMMAP =0X02;          //中断向量从静态RAM重映射(用户RAM模式)
      
      addr=VECTOR_RAM;    //为指针变量赋初值,指向地址为0X40000000.
     
      for(i=0;i<8;i++)
       {  *addr=0x55;      //为指针变量此时所指向的地址处赋值,该值为该地址处的内容 .
           addr++;         //指针(地址)加一.
        }
        
     addr=VECTOR_RAM;
     
     for(i=0;i<8;i++)
       { *addr=0xAA;
         addr++;
         }
         
    MEMMAP =0x00;      //中断向量从Boot Block 重映射(Boot装载程序模式)
    
     while(1);
     return(0);
}             

使用特权

评论回复
8
hnmajl| | 2007-1-31 22:57 | 只看该作者

db10讲的对,我们基本功不行,我用了一天的时间理解

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

36

帖子

0

粉丝