首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[分享]不能设置断点问题

[分享]不能设置断点问题

各位好:
strongchen好,问题已经解决。
在用codewarrior3.1版本调试时候,出现了不能设置断点的问题,按照strongchen的建议查看lst文件,发现不能设置断点的语句,其汇编代码当中也没有其相应的汇编指令,在程序运行的时候,不能设置断点的语句是不会执行的。这个问题我花了我两天的时间,百思不得其解。后来跟同学讨论了一下,同学建议将不能设置断点的语句顺序调换一下,竟然好了,但是在同一个函数当中还是有其它的语句不能设置断点,该函数里面主要是由if..else if..if else ..else.条件判断语句组成。后来就如法炮制,将其他的不能设置断点的语句调换一下顺序,在调换的时候发现:凡是在该函数里面的不同的if条件语句段当中,如果前面一个if语句段里面最后一句和接下来的if或者if else语句段里面的最后一句相同的话,那么前面的if语句最后一句不能设置断点,而接下来的最后一个if或者if else语句段里面的最后一句能执行!
我在其他函数里面与次类似的情况也改了顺序,都能执行了。我举例说明。
void function(void)
{
if(.....)
asm(nop);
else
{
语句1;
if(......)
{
.........
语句2;
}
else if(.....)
{
.........
if(......)
{
.........
.........

语句2;
}
}
else if(.........)
{
.........
.........
if(.........)
{
.........
语句2;
}
}
}
}

在上面这个函数当中,不同的if 或者if else里面在语句段在最后一句都有一个
“语句2;”在实际调试当中,前两个红色的“语句2;”就不能设置断点,而最后一个蓝色的“语句2;”就能设置断点且被执行。出现这种问题只要不将相同的语句放在最后一句就行,实在不行的话就在最后一句加上空指令。
我有点肯定是软件的bug,我什么都没有修改,仅仅将各个判断语句最后一句相同的语句换成不一样的就可以了。希望能给大家带来一些参考。另外,不知新版本的codewarrior有此类bug或者现象出现。

这应该不是BUG,还是优化的问题。编译器肯定是将相同的语句变成了一个子程序或宏,或者转到同一个地方去执行。如果你愿意可以将你这个例子贴出来,我帮你分析一下看看。
海纳百川  有容乃大
我的那个函数优化了3次了,而且我觉得要实现我的功能,必须这么写
/***************正反补偿转换函数***************/
void PNSwitch(void)
{
if(NormAdjFlag==0xaa) //如果输出电压已经稳定,则不做任何赋值
asm(nop); //依然是上次的控制信号
else
{
PNAdjflag = (OnAsignal&0x18)>>3; //先将上次的补偿性质转换回来,=1,2,3
if(Curtriac.PN==PNAdjflag) //(11 11)||(01 01)||(10 10)
{
OnAsignal=Curtriac.Qsignal; //该句相同的话不能都放在每个if或者
//if else语句的最后一句
PNcount = 0;
PNnum = 0;
}
else if((PNAdjflag & Curtriac.PN)==0) //如果前后两次的补偿类型不一样,
//正反不 同 (01 10)||(10 01)
{
PNnum++; //正反补偿不同短接条件累计
PNcount = 0; //次数未到依然送上次控制信号
if(PNnum>=Kpn) //满足短接条件
{
PNnum = 0;
Curtriac.Qsignal = 0x9c; //正负转换前须先晶闸管短接,
//再在中断里面短接继电器
OnAsignal = Curtriac.Qsignal;
PNflag = 0xaa;//置继电器短接条件标志,继电器短接由中断实现
asm(nop); //加了这句话,PNflag = 0xaa便可以执行,
}
}
else if((Curtriac.PN==3)&&(PNAdjflag //不短接,则短接条件计数, (01 11)||(10 11)
{
PNcount++; //直接短接条件累计
PNnum=0; //次数未到依然送上次控制信号
if(PNcount>=Kpn) //满足短接条件
{
PNcount=0;
Curtriac.Qsignal = 0x9c; //直接短接也须先晶闸管短接,
//再在中断里面短接继电器
OnAsignal = Curtriac.Qsignal;
PNflag =0xaa; //置继电器短接条件标志,继电器短接由中断实现
} //该段到可以和上面的合并
}
else //if((PNAdjflag==3)&&(PNAdjflag>Curtriac.PN))
{ //如果已是短接态但本次是非短接态,则需要先打开
//继电器再给新的控制信号 (11 01)||(11 10)
if(PN0flag==0xaa)
{ //收到中断确认的短路到继电器切换完毕标志
PN0flag=0x55;
PN0toflag=0x55;
OnAsignal=Curtriac.Qsignal; //送新的控制信号
}
else
{
if(Curtriac.PN==1) //如果本次是正 (11 01)
{
Nnum=0; //为正,清负累计值,正累计
Pnum++;
if(Pnum>=Kpn0) //如果正补偿条件满足
{
Pnum=0;
KB5A=0;
DelayXms(20); //充分延时使得继电器确保释放
KB4A=1; //先将继电器切换到正补偿态
DelayXms(5); //充分延时再次给继电器开通信号
KB4A=1; //为了充分开通继电器,两次给出其开通信号
PN0toflag=0xaa; //置继电器已经切换完毕标志
asm(nop);
}
}
else //如果本次是负(11 10)
{ //为负,清正累计值,负累计
Pnum=0;
Nnum++;
if(Nnum>=Kpn0) //如果负补偿条件满足
{
Nnum=0;
KB4A=0;
DelayXms(20); //充分延时使得继电器确保释放
KB5A=1; //先将继电器切换到负补偿态
DelayXms(5); //充分延时再次给继电器开通信号
KB5A=1; //为了充分开通继电器,两次给出其开通信号
PN0toflag=0xaa; //置继电器已经切换完毕标志
}
}
}
}
}
TIE_C0I=1; //开IC0中断
}
该函数主要是对一个变量PNAdjflag 和Curtriac.PN的值做比较判断,其值都只取1,2,3;判断完毕后再执行不同的语句。PNAdjflag 是Curtriac.PN(结构体成员引用)在上一个循环周期的值,都是全局变量。

OnAsignal=Curtriac.Qsignal;该语句绝对不能在编译的时候被优化成一个子程序或者宏,因为他们虽然相同,可是值不同,如果到最后到同一个地方,将会带来灾难性的后果。
其他相同的是互相清零或者标志置位之类的标志,若在执行时合并为一句,勉强可以接受。

我试了,我的程序当中还有一个函数里面有两居一样的话,出现了前一句不能被执行的现象,我在前一句后面价格空指令就好了。
我觉得,即使我写的很罗嗦,编译器不应该将我的语句不编译,更何况我在编译设置的时候没有设置优化编译选项。
我也碰到了类似的问题,一直没有解决,明天去试一试这种方法
返回列表