找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3638|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MSP430F4xxx小RAM堆棧溢出

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:82781 發(fā)表于 2015-6-24 17:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
     前幾天一個(gè)大學(xué)同學(xué)在線問我他最近搞項(xiàng)目開發(fā)時(shí)遇到的一個(gè)問題,跟他聊了聊。他最近在搞水表的計(jì)量開發(fā),采用的平臺(tái)是MSP430F4250(PS:很早之前去濰坊考察過一個(gè)做表的企業(yè),發(fā)現(xiàn)搞表計(jì)量的大多都在用MSP430(貌似也有用STM8的),其中F4系列用的較多,一方面當(dāng)然是考慮到功耗的問題,現(xiàn)在的表多是電池供電,一用就得用個(gè)一兩年是必須的,還有就是F4系列自帶段式液晶的驅(qū)動(dòng),并且支持差分的高分辨率A/D輸入,這點(diǎn)蠻重要的,現(xiàn)在的高精度傳感器貌似一色的差分輸出),他遇到的問題是程序里某個(gè)變量經(jīng)常性的會(huì)被意外改變,造成數(shù)據(jù)混亂,所以產(chǎn)品一直無法出貨。
            看到上面的問題,有經(jīng)驗(yàn)的人很快就會(huì)意識(shí)的問題的所在,無非就是兩種可能,一個(gè)是該變量是全局的,而程序里有bug造成該變量在某個(gè)地方被錯(cuò)誤的操作了,另外一種就是內(nèi)存溢出了,變量地址重疊,造成數(shù)據(jù)混亂。個(gè)人感覺后一種的可能性較大,而事實(shí)也是如此,翻看MSP430F4250的數(shù)據(jù)手冊(cè)詫異的發(fā)現(xiàn)它的RAM竟然只有可憐的256B(是Byte,你沒有看錯(cuò),有木有,趕上當(dāng)年叱咤一時(shí)的51了,看來不是后面的數(shù)越大就代表片子配置越NB),這對(duì)擁有動(dòng)則幾KB、幾十KB甚至上百KB RAM的ARM來說,的確有點(diǎn)大巫見小巫的感覺,RAM這么小倒的確不敢用了(咳咳,都是被慣的,呵呵),這要是在上面寫程序還真得謹(jǐn)慎再謹(jǐn)慎啊。我一直覺著,在高端配置資源豐富的平臺(tái)寫出NB的算法實(shí)現(xiàn)NB的功能不算真正的NB,而在配置低端資源有限的平臺(tái)能實(shí)現(xiàn)同樣的功能那才叫NB,低端搞實(shí)現(xiàn),高端搞優(yōu)化嘛,哈哈。
            回到正題,最后經(jīng)過各種嘗試,解決了問題,主要原因是他使用了中斷嵌套,這就造成了內(nèi)存經(jīng)常會(huì)只入棧不出棧,這對(duì)RAM空間緊缺堆棧大小有限的MCU來說是致命的,也就造成了前面遇到的數(shù)據(jù)混亂問題,所以這里提幾點(diǎn)小RAM空間MCU寫程序時(shí)需要注意的問題:
        (1)變量盡量使用局部變量;
        (2)不要在中斷服務(wù)函數(shù)里進(jìn)行數(shù)據(jù)處理等復(fù)雜操作,將其移到while(1)主線程里,中斷服務(wù)程序里只是置位相應(yīng)標(biāo)志即可;
        (3)不要使用中斷嵌套功能;
        (4)合理安排內(nèi)存空間,尤其是堆棧區(qū)。
        。。。待補(bǔ)充
            好了,不多說了,最近馬上離校,雜事很多,耽誤了不少進(jìn)度,期待下次再聊,未完待續(xù)~

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表