找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

如何在KEIL软件中将变量定义在特定的RAM空间中?

[复制链接]
跳转到指定楼层
楼主
fan168668 发表于 2014-1-8 09:08:05 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我指的是某一个变量,而不是整体的区域。就是说整型变量a放在0x2000 0001中,整型变量b放在0x2000 0100中。就是所有变量有自己指定存储区域,而不是由系统自由分配。哪位牛友指点一下,万分感谢!
还有为什么论坛升级后我原来的账号登不上去了,输验证码一直有错误!这是新注册的号










老系统上,没有邮件验证激活或者没有发过贴的 用户没有导入进来。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

推荐
 楼主| fan168668 发表于 2014-1-8 09:55:31 | 只看该作者
admin 发表于 2014-1-8 09:40
是的,16为这么写 u16  c __attribute__((at(0x2000 0x00)))
u8     shuzhu[5]   __attribute__((at(0x2000 ...

可是我在.c文件中定义u8 ksdflag_attribute_((at(0x20000601)));  //ksdflag是口设定主次调标志,是8位无符号整型,但是编译后出现如下错误ASC RE BUILD 14-01-06.c(46): error:  #20: identifier "u8" is undefined
ASC RE BUILD 14-01-06.c(46): error:  #79: expected a type specifier
ASC RE BUILD 14-01-06.c(256): error:  #20: identifier "ksdflag" is undefined。
我的.h文件时在网上找的内容如下
#ifndef __ABSACC_H__
#define __ABSACC_H__
#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0)
#ifdef __CX51__
#define FVAR(object, addr) (*((object volatile far *) (addr)))
#define FARRAY(object, base) ((object volatile far *) (base))
#define FCVAR(object, addr) (*((object const far *) (addr)))
#define FCARRAY(object, base) ((object const far *) (base))
#else
#define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L)))
#define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
#define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
#endif
#endif

回复 支持 0 反对 1

使用道具 举报

12#
通宵敲代码 发表于 2014-3-1 13:01:19 | 只看该作者
变量定位,还是用汇编吧。

C语言很容易被优化掉。
回复 支持 反对

使用道具 举报

11#
 楼主| fan168668 发表于 2014-1-8 15:59:23 | 只看该作者
admin 发表于 2014-1-8 15:10
程序运行中未实现功能,原因就多了。是不是数组溢出、变量被覆写,
怀疑变量 可以一步步Debug看看。
...

这些方法我们肯定都试过,但是两台并联运行时,debug时,一旦接上次调机,就会出现ICE:cmd error:ERROR_GET_REG的错误。不过我还是想按老师的要求尝试一下吧,毕竟我也没有别的办法了。
回复 支持 反对

使用道具 举报

10#
admin 发表于 2014-1-8 15:10:47 | 只看该作者
程序运行中未实现功能,原因就多了。RAM 数据是不是数组溢出、变量被覆写,
怀疑变量 可以一步步Debug看看。

牛卧堂
回复 支持 反对

使用道具 举报

9#
 楼主| fan168668 发表于 2014-1-8 14:57:39 | 只看该作者
admin 发表于 2014-1-8 11:42
变量 RAM直接定义。如果要在FLASH,得用const。如果要绝对定位。
要用 const unsigned char DATAF[10] __at ...

你好,这里的DATAF[10]是你定义的含10个元素的数组吗?系统默认从0x2000 0000开始存,因为我们的程序运行中未实现功能,老师怀疑是RAM中变量的地址被更改,或者跑飞了,让我把变量的地址隔开,离得远一点。所以我在这里咨询一下怎么定义到具体的地址。但是我觉得不是这个原因
回复 支持 反对

使用道具 举报

8#
admin 发表于 2014-1-8 11:42:51 | 只看该作者
变量 RAM直接定义。如果要在FLASH,得用const。如果要绝对定位。
要用 const unsigned char DATAF[10] __attribute__((at(0x20000601))) ={1,2,3,4,5} ;
牛卧堂
回复 支持 反对

使用道具 举报

7#
 楼主| fan168668 发表于 2014-1-8 10:55:27 | 只看该作者
admin 发表于 2014-1-8 10:17
u8  不是标准的8bit  看你代码里面 有没有定义 u8
可以直接定义 unsigned char   ; unsigned int  ...

嗯,你好,我也尝试了如何解决这些问题。比如uint8_t (ksdflag)_attribute_((at(0x20000601)));  //口设定主次调标志。这样第一个错误就没了,给ksdflag加上括号就只剩小一个错误了ASC RE BUILD 14-01-06.c(46): error:  #65: expected a ";"我怀疑还不是很完善。
回复 支持 反对

使用道具 举报

6#
admin 发表于 2014-1-8 10:17:07 | 只看该作者
u8  不是标准的8bit  看你代码里面 有没有定义 u8
可以直接定义 unsigned char   ; unsigned int
牛卧堂
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU