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会把它的存储分配给其它的函数.
[解决办法]