前天晚上修改調(diào)試程序,出錯(cuò): The stack pointer for stack‘stack’ (currently Memory:0x252) is outside the stack range(Memory:02B0 toMemory:0x300)錯(cuò)誤,見圖1。 此時(shí)程序指針跑飛,不能再繼續(xù)運(yùn)行下行,再運(yùn)行也是可樣出錯(cuò)。見圖2。 接好同樣兩塊水表板,先懷疑硬件問題,換板下載同樣程序。1#的F413換成F415,1#不會(huì)outside(選用device沒改,還是F413)。2#板會(huì)outside,且只能運(yùn)行一次程序即停止(指針跑飛)。 當(dāng)時(shí)立即問dog 太陽(yáng)的度婆,找到兩文章說此事,一是《IAR MSP430設(shè)置合理堆棧大小(the stack pointer for stack isoutside the stack range)》被轉(zhuǎn)了n多次。文章最后是沒有解決,用文章說的改Stack/heap設(shè)置,一點(diǎn)用都沒有。 另外有討論說“此時(shí),唯一的辦法就是重新設(shè)計(jì)程序了。在單片機(jī)上跑uC/OS,可以通過以下方法來減少內(nèi)存使用” 后找到了問題原因及解決辦法。 問題原因:Init_Timer_A();打開了中斷,但是TA中斷程序#pragma vector=TIMERA0_VECTOR __interrupt void TimerA0()全注釋掉(怕影響長(zhǎng)定時(shí)發(fā)示波器信號(hào))。 原因明確了,因?yàn)槌跏蓟?strong>打開了TA中斷,但是沒有中斷響應(yīng)程序,導(dǎo)致的堆棧溢出。 解決方法: 1 、開啟#pragma vector=TIMERA0_VECTOR中斷程序響應(yīng),OK。BasicTimer中的長(zhǎng)定時(shí)發(fā)IO口電平信號(hào)給示波器,不受TA中斷影響。 2、不執(zhí)行Init_Timer_A();此方法可以不用注釋中斷響應(yīng)程序。
驗(yàn)證:再次開TA中斷,不響應(yīng)中斷(注釋掉),問題再次出現(xiàn),證明錯(cuò)誤的來源是對(duì)的。
|