环境为主控芯片: STM8SF103F3,编译器 COSMIC8,IDE环境为STVD。 大概代码如下:
<font face="新宋体" size="4" color="#000000"> u8 ret;
ret=rf_get_addr_len();
ret=rf_get_trint_level();
ret=rf_get_drssi_level();
ret=rf_get_dest_provider();
ret=rf_get_addr_len();</font>
使用STLINK进行调试时发现,ret的值根本就不是正确的,我跟踪到具体的函数里面去,检测值是正确的,但为什么赋值给ret后,这个值就不对了呢?
后来google搜后发现一个贴上有说明,内容如下:
一段很简单的代码,跑在ST-DISCOVERY的板子上(实际芯片是STM8S105C6),环境是STVD + COSMIC 4.3.4
float f1 = 3.90, f2 = 2.78, f3 = 0.0; unsigned int i1 = 3, i2 = 12, i3 = 0;
initMCU(115200);
f3 = f1 * f2; i3 = i1 * i2;
这样用ST-LINK/SWIM调试下来,结果完全不对:
貌似i3和f3的值仍然是之前的内存保存的值,感觉像完全没有做乘法一样。
而加上volatile后, volatile float f1 = 3.90, f2 = 2.78, f3 = 0.0; volatile unsigned int i1 = 3, i2 = 12, i3 = 0;
initMCU(115200);
f3 = f1 * f2; i3 = i1 * i2; 再运行,结果就都对了:
难道COSMIC/STM8S一定要在局部变量上加上volatile?
看了一下编译器设置,好像DEBUG模式下没有任何的优化啊。 |