找回密码
 立即注册

QQ登录

只需一步,快速开始

开启左侧

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

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










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

回复

使用道具 举报

 楼主| 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

使用道具 举报

admin 发表于 2014-1-8 09:15:35 | 显示全部楼层

u8     a  __attribute__((at(0x20000001)));
u8    b  __attribute__((at(0x20000100)));
牛卧堂
回复 支持 反对

使用道具 举报

 楼主| fan168668 发表于 2014-1-8 09:23:32 | 显示全部楼层
admin 发表于 2014-1-8 09:15
u8     a  __attribute__((at(0x20000001)));
u8    b  __attribute__((at(0x20000100)));

万分感谢,那么16位无符号整型c是不是可以这样写u16  c__attribute__((at(0x2000 0x00)))呢?浮点型的数据d,还有整型数组shuzhu[5]={};怎么表示呢!
还有是不是要添加上头文件absacc.h呢,这些定义是写在自己的代码区,不是写在absacc.h中的吧?
菜鸟一个,问题低级,任务紧急,没时间自己看了,还请管理员见谅!帮忙解答一下,谢谢
回复 支持 反对

使用道具 举报

admin 发表于 2014-1-8 09:40:11 | 显示全部楼层
是的,16为这么写 u16  c __attribute__((at(0x2000 0x00)))
u8     shuzhu[5]   __attribute__((at(0x20000x00)));

写在.c文件 还是.h 都可以。在你引用前 定义就可以。有些喜欢 统一写到.h中
牛卧堂
回复 支持 反对

使用道具 举报

admin 发表于 2014-1-8 10:17:07 | 显示全部楼层
u8  不是标准的8bit  看你代码里面 有没有定义 u8
可以直接定义 unsigned char   ; unsigned int
牛卧堂
回复 支持 反对

使用道具 举报

 楼主| 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 ";"我怀疑还不是很完善。
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 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中变量的地址被更改,或者跑飞了,让我把变量的地址隔开,离得远一点。所以我在这里咨询一下怎么定义到具体的地址。但是我觉得不是这个原因
回复 支持 反对

使用道具 举报

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

牛卧堂
回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU