当前位置: 代码迷 >> 单片机 >> Keil 中的局部变量地址分配有关问题
  详细解决方案

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

热度:372   发布时间:2016-04-28 16:00:18.0
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 

  相关解决方案