首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

Keil 中的局部变量地址分配有关问题

2012-04-28 
Keil 中的局部变量地址分配问题代码中出现如下问题:主程序函数void SampleProcess(SAMPLE_SET *Sample)定

Keil 中的局部变量地址分配问题
代码中出现如下问题:

主程序函数void SampleProcess(SAMPLE_SET *Sample)定义了一个局部变量Sample(指针),当程序执行到串口中断调用的另一个程序unsigned char RecDequeue(REC_STRUCT *DataRec)时发现,DataRec与Sample的地址一样,直接导致,中断返回后Sample的值被改变了。


在此受教了,,,,,,期待!

程序如下

void SampleProcess(SAMPLE_SET *Sample)
{
unsigned int xdata i;

unsigned char xdata SentType; //数据发送类型

unsigned long xdata SampleNumCount = 0;//采样个数计数

CONTINUE_SENT xdata SentControl;//采样控制

static SAMPLE_SET xdata SampleSet;

SampleSet = *Sample;

SentControl.Data.SentInfor.BufState = BufInvalid;

SentControl.Data.SentInfor.ConfirmEn = ENABLE;

SentControl.Data.SentInfor.StateReadEn = DISABLE;

SentControl.DataFill.Destintion = 0;

SentControl.DataFill.Type = 'D';

 SentControl.DataFill.DataType = SampleSet.DataType;

  。。。。。。。。。
  。。。。。。。。。
}


unsigned char RecDequeue(REC_STRUCT *DataRec)

static unsigned char xdata i;

static unsigned char xdata Flag = TRUE;

if(Flag==FALSE) //为防止由于函数重入而导致系统异常
{
return FALSE;
}

Flag = FALSE;

  。。。。。。。。。
  。。。。。。。。。

}


void UART_Int(void) interrupt 4 
{
  。。。。。。。。。
  RecDequeue(DataRec);
  。。。。。。。。。
}

[解决办法]
建议看编译后的汇编,两个局部指针变量在编译后估计会成为寄存器的值或者在堆栈中,你跟踪汇编代码就会得到你想要的结果
[解决办法]
SampleSet = *Sample;
在这条指令之后,如果不再引用该值,就认为它的生存期已经结束,KEIL会把它的存储分配给其它的函数.
[解决办法]

探讨

SampleSet = *Sample;
在这条指令之后,如果不再引用该值,就认为它的生存期已经结束,KEIL会把它的存储分配给其它的函数.

[解决办法]
keil使用变量覆盖技术,在编译时产一个调用树(表示各个函数的调用与被调用关系),然后根据调用树来分配局部变量(包括函数的参数及函数内义的变量)。只要你不是使用多任务抢占式的系统,调用树一般是不会出错的,那么一般就不会出现变量地址冲突的事
[解决办法]
试试下面的干法
unsigned char RecDequeue(REC_STRUCT *DataRec)
----> unsigned char RecDequeue(REC_STRUCT *DataRec) reentrant 

热点排行