|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
路過的高手,進來幫忙救救火! |
| 作者:z41992929 欄目:單片機 |
小弟是才入這個行當(dāng)不久,最近寫了個程序,可就是調(diào)試不過去,錯誤信息如下: linking... *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: IDATA SEGMENT: ?STACK LENGTH: 0001H *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: IDATA SEGMENT: ?STACK LENGTH: 0001H *** ERROR L119: REFERENCE MADE TO ERRONEOUS SEGMENT SEGMENT: ?C_C51STARTUP MODULE: D:\KEIL\C51\LIB\C51S.LIB (?C_STARTUP) ADDRESS: 23B7H Program Size: data=242.3 xdata=0 code=9210 Target not created 這個程序只使用了定時器0和串行口中斷(低優(yōu)先級),函數(shù)嵌套最大4層,定義的外部變量占用4DH--FFH空間(太多了?),留給stack和局部變量的有36bytes,在局部變量里用的多的就是一個25byte的數(shù)組。。。。 小弟有幾點疑問,望高手指點哈 1. 象第1和2個錯誤是不是堆棧出錯,比如溢出或是修改了堆棧指針(我在main函數(shù)里改過)?然后為什么長度就只有1H。。。? 2.第3個是不是說調(diào)用了沒定義的段?但是startup早被我刪掉了,怎么會憑空蹦出來呢?還有那個地址23B7H是指的是出錯的地方? 小弟先拜過各位了。。 |
| 2樓: | >>參與討論 |
| 作者: 劍寒情暖 于 2005/9/5 17:48:00 發(fā)布:
用的什么CPU? |
|
| 3樓: | >>參與討論 |
| 作者: cxd731 于 2005/9/5 18:00:00 發(fā)布:
80H~FFH 的空間是單片機自己用了,你不能用 IDATA就是指這部分地址空間 |
|
| 4樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/5 18:00:00 發(fā)布:
AT89C51RC2 8051 controller with PCA, DUAL DPTR, WDT 40 MHz High-Speed Architecture, X2 function, 32 I/O lines 3 Timers/Counters, 9 Interrupts/4 priority levels, SPI, UART 32K FLASH, 256 Bytes on-chip RAM, additional 1K XRAM 資源應(yīng)該還是比較夠的。。。以后會不會換型號就要看老板的了,不過不管換不換對程序影響應(yīng)該不是很大 呵呵,敬侯樓上的高手reply。。。。 |
|
| 5樓: | >>參與討論 |
| 作者: 劍寒情暖 于 2005/9/5 18:07:00 發(fā)布:
把至少一半的變量和數(shù)組定義成idata |
|
| 6樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/5 18:08:00 發(fā)布:
不會吧! 我查了規(guī)格書,那高128 byte與SFR是不沖突的,雖然地址一樣,但是在單片機訪問機制上決定了不會沖突的,再說了,廠家干嘛要放256RAM進來,我想應(yīng)該是別的原因吧。。。。還是謝謝你!呵 |
|
| 7樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/5 18:12:00 發(fā)布:
劍寒情暖,IDATA里全是外部變量和數(shù)組 RAM里很擠啦,在data區(qū) 50--7F也定義了外部變量,但是不定義成外部變量不行,要用的。。。 |
|
| 8樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/6 11:55:00 發(fā)布:
幫幫忙啊,小弟先拜過各位高手了!! |
|
| 9樓: | >>參與討論 |
| 作者: sharks 于 2005/9/6 14:32:00 發(fā)布:
你的RAM不夠了! |
|
| 10樓: | >>參與討論 |
| 作者: xb 于 2005/9/6 16:06:00 發(fā)布:
試試換個模式 你看看你的編譯選項里編譯模式尸什么模式。如果是小模式,改成大模式試試。 |
|
| 11樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/6 17:09:00 發(fā)布:
換了模式4了。。。有點問題。。。 換了COMPACT模式后,變量從data區(qū)跳了29個到xdata區(qū),但是錯誤還是和上面的一樣,不解啊。。。 補充:我定義的外部變量全是用“_at_”定位了的,不曉得這有沒有影響,但是影響應(yīng)該是不大的 堆棧指針是不是由編譯系統(tǒng)來定,編程不用管的,那可重入函數(shù)的指針是怎么運行的?? 小弟還不行啊,還請各位多多提攜! |
|
| 12樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/7 10:00:00 發(fā)布:
謝謝樓上各位,搞定了 我說出來給大家共享一下,不知道是不是這個原因,總之是ok了 我定義的外部變量全用“_at_”定位,那么在編譯的時侯編譯器不會去優(yōu)化變量的存儲,但是又存在有些外部變量未使用,白白占用了寶貴的RAM空間;后來我試著刪掉了所有的“at”,讓編譯器自己定位,結(jié)果就ok了 我估計是優(yōu)化掉了未使用的變量,并發(fā)現(xiàn)堆棧指針SP定位在IDATA區(qū)的頂部,驗證了那句:堆棧永遠處在數(shù)據(jù)區(qū)的上方。(原先我自己還初始化了SP,自作聰明??哎。。) 不知道我的理解是否正確,如有錯誤,請各位高手及時指點! |
|
| 13樓: | >>參與討論 |
| 作者: szzfq61 于 2005/9/8 9:05:00 發(fā)布:
就是你不該去‘指定‘IDATA的啦!只管申請就好,但別溢出 |
|
| 14樓: | >>參與討論 |
| 作者: 不熔玉石 于 2005/9/8 9:40:00 發(fā)布:
小結(jié) 不必指定地址,防止遞歸調(diào)用等RAM大量使用的情況(除非你能確定RAM夠用), 就很少出現(xiàn)SP溢出,即使出現(xiàn),查看匯編代碼,也可以很快解決問題。 |
|
| 15樓: | >>參與討論 |
| 作者: z41992929 于 2005/9/8 19:35:00 發(fā)布:
可能RAM不夠用列 現(xiàn)在程序也改得差不多了,大大小小有20幾個函數(shù),調(diào)用深度有4層,定義了一個可重入函數(shù),后來看匯編代碼,發(fā)現(xiàn)sp已在0XF3,空間不夠啊,估計還是要用內(nèi)部XDATA的,就是不懂用它,不會和用外部XDATA一樣吧??高手指點哈,小弟謝了! |
|
| 16樓: | >>參與討論 |
| 作者: jackf125 于 2005/9/11 23:49:00 發(fā)布:
data,idata,xdata(MOVX) |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |