Part Number:TMS320F28379S
你好,
1、首先说明问题:在变量在线监测表中可以看到IqFdb这个变量的值可以出现-65514这个值,而根据我的设计,这是绝对不可能的,此时电流为0,它应该如上面的变量IdFdb所示,在几十–负几十之间波动。
2、给出我观察到的现象:
图中红框内的数据地址为0xd38c,也就是上面提到的那个会出现异常值的变量IqFdb,可以看到它的高16位此时没有更新(显示为黑色),值为0x0000;低16位更新了(显示为红色),值为0xFFF9,所以此时监控框内用了分别用了先后两个数据的高16位和低16位,拼接出的数据是"0x0000 FFF9"也就是“61433”,这绝对超出我的限值范围了!
3、我的推论:由于2中描述的现象,我认为是long型的变量高16位和低16位没有同时更新,导致的显示错误。而此时该变量的值应该是“0xFFFF FFF9”,也就是"-7"。
4、本次提问的目的:想咨询一下这种BUG大家也经常遇到吗?两个字节没有同时更新显示的问题是由什么引起的?应如何避免。毕竟我之前的工程当中没有出现这种情况。
**附加说明:由于操作困难,上面出现的两张截图不是同时截取的,所以变量的值不能对应上。
Susan Yang:
谢谢您的详细说明。请问能否私信一下工程,我们具体看一下?目前我也没有遇到过“两个字节没有同时更新显示的问题”
,
user6407498:
为方便您的查看,我在一个十分简单的例程上复现了上述现象。
首先导入c2000->device_support->f2837xs->examples->cpu1->timed_led_blink
并仅在main.c中做两处修改,修改内容如下:
首先定义变量
int ix = 2,iy = 3,iu = 2,iv = -2;
long rr = 0;
然后添加循环函数
while (1) { if (iv>2) iv = -2; else iv++; rr = (long)ix*iu+(long)iy*iv; if ((rr1 > 600)||(rr1 < – 600)) return;
}
在线运行以后就可以观察到我前面描述的现象
即,rr的结果本应该在-2至10之间变化,但是在观测窗口中可以看到65534之类的数值
,
user6407498:
我的CCS安装包版本是CCS8.3.1.00004_win32,运行平台是LAUNCHXL-F28379S Development Kit
,
Susan Yang:
好的,我在379D的板子上看一下哈。另外您的编译器版本是多少?
,
user6407498:
当前使用的是v20.12.0.sts
另外我还换过20.2,18.1,6.4均如上述结果
,
Susan Yang:
我将代码改为如下进行测试,rr1一直为4,而rr2是偶尔会出现65534的值
while (1) { if (iv>2) iv = -2; else iv++;
rr1=(long)ix*iu; rr2=(long)iy*iv; rr = rr1+rr2; if ((rr > 600)||(rr < – 600)) return;
}
,
user6407498:
因为rr1是不变的啊,而rr2在正负数之间跳变的时候就是会出现65534
,
Susan Yang:
是的,我能复现您的错误。我会在确认后给您回复
,
user6407498:
非常感谢您的关注!!!
期待您的回复
,
Susan Yang:
我认为和负数有关系。我今天用iv为2测试了一下,没有问题。查看iv为2或者-2时的反汇编情况,两者使用的mov语句不同,分别为
mov和movw(w用于16位的字值)