代码中出现如下问题:
主程序函数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会把它的存储分配给其它的函数.
------解决方案--------------------
------解决方案--------------------
keil使用变量覆盖技术,在编译时产一个调用树(表示各个函数的调用与被调用关系),然后根据调用树来分配局部变量(包括函数的参数及函数内义的变量)。只要你不是使用多任务抢占式的系统,调用树一般是不会出错的,那么一般就不会出现变量地址冲突的事
------解决方案--------------------
试试下面的干法
unsigned char RecDequeue(REC_STRUCT *DataRec)
----> unsigned char RecDequeue(REC_STRUCT *DataRec) reentrant