打印

这个真牛X

[复制链接]
22009|73
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dudongdao|  楼主 | 2009-4-7 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
KEIL里怎么实现全局变量地址连续分配:
请教大家一个问题,我定义全局变量,能否让全局变量的地址分配连续。如:
HeatWireType1 idata m_st_Heat1;
HeatWireType2 idata m_st_Heat2;
U8 idata m_u8BuzzOnTime1;
 U8 idata m_u8BuzzOnTime2;
 U8 idata m_u8TmepOver1;
 U8 idata m_u8TmepOver2;

怎么能让学些变量用连续的一段空间呢,我看。MP文件分配是按变量名字分配的,不是按定义位置,很头疼~  很多编译软件都是按变量定义顺序分配

相关帖子

沙发
hotpower| | 2009-4-7 10:40 | 只看该作者

struct

使用特权

评论回复
板凳
computer00| | 2009-4-7 10:41 | 只看该作者

把它们放在一起,弄成一个结构体啊。而不要依赖编译器。

使用特权

评论回复
地板
yewuyi| | 2009-4-7 10:41 | 只看该作者

用结构体不行吗?

使用特权

评论回复
5
hotpower| | 2009-4-7 10:42 | 只看该作者

哈哈~~~还是菜农手快~~~

使用特权

评论回复
6
andychan13| | 2009-4-7 10:44 | 只看该作者

很多方法!

1.如果是C51,采用绝对地址定义,如: int temp _at_ 0x88;
  将变量temp定义在0x88地址开始处
2.最通用的,不管是C51还是ARM的,将需要定义成连续地址的变量采用结构体放在一起,地址就是连续的

使用特权

评论回复
7
dudongdao|  楼主 | 2009-4-7 11:08 | 只看该作者

噢噢噢噢

定义结构体我知道,可能是我没说明白,定义结构体,那我的程序可读性下降,我不想牺牲这个。
用绝对地址我也试过~~~  指定以后会报溢出错误,说和堆栈冲突,所以我就不敢用觉得地址了,我用过其他的编译器,给全局变量的地址都是那你定义的连续下来,自己看了51的,是按变量名字母先后顺序来定义的。
 

有没有这个一个关键系,从下面开始。地址连续定义全局变量

使用特权

评论回复
8
HWM| | 2009-4-7 11:08 | 只看该作者

若这些变量没有什么内在关系的话,别太刻意去让它连续存

反之若其真有内在联系,自然会联想到结构的使用。

使用特权

评论回复
9
yewuyi| | 2009-4-7 11:20 | 只看该作者

热电源手太快。。。

使用结构体+宏定义的方式也不会降低可读性。


使用特权

评论回复
10
dudongdao|  楼主 | 2009-4-7 11:22 | 只看该作者

连续操作,节省空间啊

我是想对他连续操作,比如加减,我只写了一段加减函数。如果单个分开,我程序里要分14次操作。

如果能连续分配一个地址就好,我从第一个地址开始进行加减操作,然后地址加1找到第二个,还是同样的操作语句。   如果把14个都放一个结构体里面,程序没有可读性了,这些是没有联系的变量,但是我设置的时候都要加减。

我是这么操作的,如果分开就要找14次~~  程序量增大,现在已经有4044字节了,一共4K


*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1) = 
*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1)-1;

if(*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1) 
< u8fMaxMin[m_st_LedDisp.u8TwinklePos1][1])
{
*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1) = u8fMaxMin[m_st_LedDisp.u8TwinklePos1][0];
}



使用特权

评论回复
11
dudongdao|  楼主 | 2009-4-7 11:34 | 只看该作者

我再补充一点,怎么看全局变量分配的地址,具体地址

高手回答下~~ 多谢~~  好迷糊~~

使用特权

评论回复
12
computer00| | 2009-4-7 11:37 | 只看该作者

你这个可以定义个结构体,然后用结构体数组啊。有联系的

使用特权

评论回复
13
dudongdao|  楼主 | 2009-4-7 11:47 | 只看该作者

不降低程序可读性~~ 不降低~ 不降低~~~

都定义到一起降低程序可读性,维护性,改起来麻烦,容易出错。

 有没有不降低程序可读性的方法,大家一直说的都是结构体,你把一些不相关的数据放结构体有意义吗~~  解决了一个问题,带来了另一个问题,不是解决问题的办法。

使用特权

评论回复
14
wlq_9| | 2009-4-7 11:58 | 只看该作者

可读性?

分开反而有可读性了?
一个程序里面一大堆孤立的变量,这个程序的可读性本来就够X的.
再加上你为了效率,代码写成这样,不用结构,还好意思谈可读性吗?

实话,虽然难听.

使用特权

评论回复
15
dudongdao|  楼主 | 2009-4-7 12:05 | 只看该作者

看来我还是没有说清楚~~

我是定义了三个结构,相关的已经放一起的。控制电热丝1的是一个结构体,控制电热丝2的是一个结构体,3又是一个。这种情况下,怎么能让这三个连续分配呢?    把控制三个电热丝的所有变量,都放在一个结构体,你觉得可读性会不会差些?  

我为什么要他们连续,因为三个结构体里的参数都要修改,我修改是用下面一句
*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1) = 
*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1)-1;

if(*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1) 
< u8fMaxMin[m_st_LedDisp.u8TwinklePos1][1])
{
*((S8 idata *)(&m_st_HeatTemp1)+m_st_LedDisp.u8TwinklePos1) = u8fMaxMin[m_st_LedDisp.u8TwinklePos1][0];
}

我先取电热丝1的地址,然后进行减法操作设置,如果按键设置下一个,m_st_LedDisp.u8TwinklePos1++; 这样我的加减程序是通用的。但这要求三个地址连续,也就是用的是C,里面是用汇编的细想。
你觉得这样做是否能省略一些程序?

使用特权

评论回复
16
computer00| | 2009-4-7 12:10 | 只看该作者

都说了,数组啊……数组是连续的。数组的每个元素是结构

每个结构体负责一个东西,多个相同的结构就可以构成一个结构体数组了啊。

使用特权

评论回复
17
HWM| | 2009-4-7 12:12 | 只看该作者

既然有“1,2,3”为何不用单元为结构的数组呢?

使用特权

评论回复
18
dudongdao|  楼主 | 2009-4-7 12:12 | 只看该作者

你也说了,多个相同的结构

三个电热丝有些里有风机,有些有水泵,控制时间都不同,变量类型也不同,你说这种情况,能否放到一个数组里?

使用特权

评论回复
19
dudongdao|  楼主 | 2009-4-7 12:15 | 只看该作者

其实我想知道的是

其实我想知道的是,KEIL里有没有这么一个关键字  
#PRAGMA 。。。。。。 
这样之后,下面的变量我给你连续分配地址。  

使用特权

评论回复
20
dudongdao|  楼主 | 2009-4-7 12:17 | 只看该作者

。。。

三星8位,AVR,松翰的,都是按变量定义位置,来分配地址的,就这个鸟KEIL,我看了MP文件,按变量名字母顺序分。

使用特权

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

本版积分规则

90

主题

413

帖子

1

粉丝