TI论坛
直播中

王丹丹

8年用户 231经验值
私信 关注
[问答]

IAR9202编译优化导致代码流程出错

遇到一个IAR编译优化的问题:
本想在profile中write callback中做特征值的有效性检查,却发现编译优化“high”和"medium"导致代码流程错误,如下:
#define CONST_DEF 16
//printf("xxxxn");
if (pValue[0] > CONST_DEF) [
 // do sth
] else [
 // do sth
]
其中pValue[0]为channel数据,当优化选项为"high"时,pValue[0]为17时走的却是else分支,优化选项改为"medium",代码流程就没问题了。
另外在if之前添加一行printf,即便优化选项为"high"也没问题。通过C代码看不出问题。(IAR is cracked,stack is 1.4.1)

还想请问INIT_HEAD_LEN最小设为多大能够保证协议栈稳定运行,因为我需要1.5KB左右的buffer。

回帖(8)

凌云志

2020-3-5 08:29:33
你使用的是协议栈,包含Lib,代码是看不到的, 而在编译lib时,我们只能假设他用的优化等级就是high.
我认为是完全没必要去尝试改成另一个优化等级可能存在的问题的。
你的 pvalue是全局变量吗?
我不确定你是在什么代码里实验的,我把你的代码copy到例子代码里,判断完全没有问题。 
pValue[0]=15;
while(pValue[0]++)
[
if (pValue[0] > CONST_DEF) [
                    PRINTF("pValue[0] > 16");
] else [
                  PRINTF("pValue[0] < 16");
]
]


                                                                          
举报

凌云志

2020-3-5 08:38:27
另外,对应的stack用指定的IAR. 我碰到过使用新版本IAR编译没问题,但运行出未知问题的情况。
                                                                          
举报

凌云志

2020-3-5 09:37:32
老实讲,没有所谓的快速修复方法,我之前碰到过类似的问题,这个是协议栈和IAR的版本有一定的关联。你只能认为,1.4.1的版本TI只在IAR的9.10.3上做过测试。
最快的方法反而是,你使用IAR9.10.3, 使用STACK的例子,然后把你的程序仔细的挪过来。
                                                                          
举报

凌云志

2020-3-5 09:55:04
INIT_HEAP_LEN是堆,可以动态分配和释放的,你可以考虑改小. 同样要注意的是,协议栈底层也使用了这个堆的(我们也看不到代码,不能确定是怎么使用?用了多少),既然你减小了这个,你的应用就尽量少用或者及时释放。
                                                                          
举报

更多回帖

发帖
×
20
完善资料,
赚取积分