Keil 中的局部变量地址分配有关问题
发布时间:2010-06-14 15:42:03 文章来源:www.iduyao.cn 采编人员:星星草
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会把它的存储分配给其它的函数.
------解决方案--------------------
------解决方案--------------------
keil使用变量覆盖技术,在编译时产一个调用树(表示各个函数的调用与被调用关系),然后根据调用树来分配局部变量(包括函数的参数及函数内义的变量)。只要你不是使用多任务抢占式的系统,调用树一般是不会出错的,那么一般就不会出现变量地址冲突的事
------解决方案--------------------
试试下面的干法
unsigned char RecDequeue(REC_STRUCT *DataRec)
----> unsigned char RecDequeue(REC_STRUCT *DataRec) reentrant
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
c51串口求助!
串口接收程序如下
void rec_gps(void) interrupt 4 {
uchar str;
uint i,k;
k=0;
i=0;...
-
win7运行CodeWarrior IDE出错
我的本安装了CodeWarrior IDE,一运行就会出现提示:
IDE 4.1 Build 0622 已停止工作。
或者提示:
Unha...
-
关于AT指令控制GSM短信猫的问题
C/C++ code
打开串口
BOOL CComm::OpenComm(const char* pPort,
int nBaudRa...
-
关于51中断求教
各位大虾,我现在要做一个GPS授时的小程序,遇到如下困惑,求大虾们解答:
1 线路板上带有时钟芯片,平时显示时间是...
-
atd指令拨号,如何判断电话状态
在网上找了许久,终于找到一位仁心解决方案,这个指令是可以得到手机当时的状态,但是不管是空号、欠费、...
-
知道在哪跑飞,跑飞的详细原因有谁能解释一下。
今天出现这样的问题:
将这个中断函数注释掉:
#pragma vector=USCI_B2_VECTOR
__in...
-
51程序移植到2051
大牛们,我想吧一个51的程序移植到2051中,用NXP的89V51芯片时用到的I/O口只有P1.0 P1.1 P1.2 3三个,我现在移植到AT...
-
一道课程设计题:基于单片机的波形发生器的设计
设计要求:
1.能产生正弦波、方波、三角波、锯齿波等4种周期性波形,并且可通过调节变...
-
解析单片机最小系统及相关电路
原文出自:电子发烧友论坛——单片机论坛[color=#FF0000][/color]
单片机最小系统单片机最小系统介...
-
单片机学习书籍大全推荐
在电子发烧友论坛里看到了单片机学习资料汇总,特地搜罗了过来,不知道大家看过几本,也希望让需要学习的人 都...