汇编写多了,c语言不知咋写了?请看:

[复制链接]
3003|15
 楼主| doob 发表于 2007-7-2 21:41 | 显示全部楼层 |阅读模式
  用一款51内核的单片机,单片机带usb sie等。。很多资源!
但是有些控制寄存器地址都是固定的, 好比:usb tx0 fifo=0x50 0x51.。。
c语言怎么从固定地址里面取数据啊,呵呵。。。c不熟,别见笑!
wjy1107 发表于 2007-7-2 21:52 | 显示全部楼层

经常使用的单片机

在程序开始的时候会有一个头文件
在这个文件里就会把整个单片机上的特殊寄存器进行宏定义,然后你按宏定义进行操作就行了。
gyt 发表于 2007-7-3 07:49 | 显示全部楼层
ayb_ice 发表于 2007-7-3 07:57 | 显示全部楼层

随便说说

汇编写多了吗?
SFR不知道吗?
 楼主| doob 发表于 2007-7-4 23:01 | 显示全部楼层

hehe,c语言寄存器

hehe,c语言寄存器不是编译器自己分配的吗?
     如果我没用到的特殊寄存器,c语言会自动避开吗?
  呵呵,假设,,,一个寄存器作用是uart buffer
        头文件有定义假设在 0x80吧,我没用到,
        c语言就不会再定义的头文件范围进行分配地址吧。。
     呵呵,估计是这样。。
        
tjsheep 发表于 2007-7-4 23:13 | 显示全部楼层

很多人都问过了,帖子也很多,我就再打一遍吧

#define    REG   (*(int *)0x0000)

REG = xxx;
xxx = REG;
就可以用了
 楼主| doob 发表于 2007-7-5 21:24 | 显示全部楼层

我是奇怪c语言自动分配寄存器地址为什么

我是奇怪c语言不是自动分配寄存器地址吗?
为什么能避开我没没用到的特殊寄存器呢?
   这些东西在哪里有讲呢?
dreambird 发表于 2007-7-5 21:31 | 显示全部楼层

不是c自动分配,是编译器分配,但每种编译器的做法是不一

winds 发表于 2007-7-6 00:00 | 显示全部楼层

如果是单片机内部

特殊寄存器,用 sfr beep=P3^3 之类定义
如果是Ram 最好不要指定,否则程序容易崩溃
如果是外部 RAM 用 
#define  XBYTE ((unsigned char volatile xdata *) 0)
#define         R8155               0x5f00
#define ReadIO(addr)          XBYTE[R8155 + (addr)]
#define WriteIO(addr,value)   XBYTE[R8155 + addr] = value
来访问
gyt 发表于 2007-7-6 06:42 | 显示全部楼层

LS说的是

尽量不要自己指定RAM地址
 楼主| doob 发表于 2007-7-7 14:01 | 显示全部楼层

ls

  但是单片机内部一部分寄存器,如fifo,地址都是固定的!
不指定不行的!
一朝成名 发表于 2007-7-7 14:33 | 显示全部楼层

特殊&非特殊分开

不知道俺说的对不
感觉不错 发表于 2007-7-7 15:04 | 显示全部楼层

地址的概念,指针的概念。

gyt 发表于 2007-7-8 12:06 | 显示全部楼层

特殊寄存器确实要指定

应该在头文件或者最前面一起先设定好
 楼主| doob 发表于 2007-7-8 18:24 | 显示全部楼层

呵呵

  是啊,用到的特殊寄存器要指定,
        没用到的还要指定吗?
        如不指定,c编译器分配给其他c寄存器用了,系统不就崩溃了??
starlite_jason 发表于 2007-7-9 09:47 | 显示全部楼层

特殊功能寄存器要在头文件中定义好

即使是没有用到的,一样也要定义好,不然编译器会把它当作普通RAM使用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

165

主题

1113

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部