项目场景:
在TI公司CCS10,编译器版本V20.2.2.LTS,未开优化等级,出现使用for循环时,临时变量i,被优化,
导致在for主体中,使用i不正常;
问题描述:
在TI公司CCS10,编译器版本V20.2.2.LTS,未开优化等级,出现使用for循环时,临时变量i,被优化,
导致在for主体中,使用i不正常;
SCOPE_SAMPLE_STATUS_ENUM_TAG ScopeSampleNormFunc(SCOPE_STRUCT_TAG* pScopeVar,tScopInstancInfo_tag* pInstance)
{
SCOPE_SAMPLE_STATUS_ENUM_TAG ret = SCOPE_SAMPLE_STATUS_BUSY;
Uint16 i;
SCOPE_SAMPLE_CHANNEL_SRC_TAG * m_pChnScr;
Uint32 * pDataBufBase = (Uint32*)(pScopeVar->scopeOp.popCycBuf.pDataBuf);
pScopeVar->scopeOp.sampPhaseCnt = 0;
for(i=0;i<pInstance->scopeChannelNum;i++)
{
***m_pChnScr = &(((pInstance->pScopeSrcMap)++)->chnSrc);*** //语句1
//m_pChnScr = &(((pInstance->pScopeSrcMap)+i)->chnSrc); //语句2
*(Uint32*)(pDataBufBase + pScopeVar->scopeOp.popCycBuf.opPoint) = m_pChnScr->m_fpCallback(&(m_pChnScr->m_scr));
pDataBufBase += pScopeVar->scopeOp.popCycBuf.num;
}
if((pScopeVar->scopeOp.popCycBuf.opPoint+1)>=pScopeVar->scopeOp.popCycBuf.num)
{
pScopeVar->scopeOp.popCycBuf.opPoint = 0;
}
else
{
pScopeVar->scopeOp.popCycBuf.opPoint++;
}
if((pScopeVar->scopeOp.popCycBuf.cnt+1)>=pScopeVar->scopeOp.popCycBuf.num)
{
pScopeVar->scopeOp.popCycBuf.cnt = 0;
ret = SCOPE_SAMPLE_STATUS_FINISH;
}
else
{
pScopeVar->scopeOp.popCycBuf.cnt++;
}
return ret;
}
使用语句1,运行正常;
使用语句2,运行不正常;
原因分析:
分析问题可能被编译器异常优化掉了
解决方案:
软件可以通过Uint16 i变更为静态临时变量类型,如static;
或者将i++,写在for主体中,即大括号内;