牛卧堂MCU技术交流

标题: 如何在KEIL软件中将变量定义在特定的RAM空间中? [打印本页]

作者: fan168668    时间: 2014-1-8 09:08
标题: 如何在KEIL软件中将变量定义在特定的RAM空间中?
我指的是某一个变量,而不是整体的区域。就是说整型变量a放在0x2000 0001中,整型变量b放在0x2000 0100中。就是所有变量有自己指定存储区域,而不是由系统自由分配。哪位牛友指点一下,万分感谢!
还有为什么论坛升级后我原来的账号登不上去了,输验证码一直有错误!这是新注册的号










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


作者: admin    时间: 2014-1-8 09:15

u8     a  __attribute__((at(0x20000001)));
u8    b  __attribute__((at(0x20000100)));
作者: fan168668    时间: 2014-1-8 09:23
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
是的,16为这么写 u16  c __attribute__((at(0x2000 0x00)))
u8     shuzhu[5]   __attribute__((at(0x20000x00)));

写在.c文件 还是.h 都可以。在你引用前 定义就可以。有些喜欢 统一写到.h中

作者: fan168668    时间: 2014-1-8 09:55
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


作者: admin    时间: 2014-1-8 10:17
u8  不是标准的8bit  看你代码里面 有没有定义 u8
可以直接定义 unsigned char   ; unsigned int
作者: fan168668    时间: 2014-1-8 10:55
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
变量 RAM直接定义。如果要在FLASH,得用const。如果要绝对定位。
要用 const unsigned char DATAF[10] __attribute__((at(0x20000601))) ={1,2,3,4,5} ;
作者: fan168668    时间: 2014-1-8 14:57
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
程序运行中未实现功能,原因就多了。RAM 数据是不是数组溢出、变量被覆写,
怀疑变量 可以一步步Debug看看。


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

这些方法我们肯定都试过,但是两台并联运行时,debug时,一旦接上次调机,就会出现ICE:cmd error:ERROR_GET_REG的错误。不过我还是想按老师的要求尝试一下吧,毕竟我也没有别的办法了。
作者: 通宵敲代码    时间: 2014-3-1 13:01
变量定位,还是用汇编吧。

C语言很容易被优化掉。




欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2