导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→各位高手快進來看一下[guest]

 *第20769篇: 各位高手快進來看一下

  
楼 主:guest 2004年4月6日08:58
 各位高手快進來看一下
我采用AT89C52 用C51編寫一個控制系統軟件,經過KEIL C51編譯過後,實際運行中出現程序跑飛的現象,因為我的系統是逐步增加功能的方式進行調試,每增加一個功能就不斷反復驗證直到OK后,才加入下一功能,但發現後來隨程序不斷的增加,就出現一些怪現象,甚至CPU無法正常復位跑程序,因為程序從理論上是通過的,所以直接懷疑經KEIL C51編譯后出現自動編排的碓棧空間不足造成程序跑飛,分析產生的M51文件,發現很奇怪為什麼 STACK 放在idata 區的0x66,而且從直接跟在前面的data變量後面,所以只有26字節空間,采用軟件仿真有時可看到sp_max:0x7c,所以很容易造成STACK不足,請教各位KEIL C51高手,怎樣才能人為地將STACK放在idata區的ox20
請看下面M51文件的變量分配空間:
 * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0016H     UNIT         ?DT?MAINLOOP
                    001EH     0002H                  *** GAP ***
            DATA    0020H     0006H     BIT_ADDR     ?BA?IRQ
            DATA    0026H     0001H     BIT_ADDR     ?BA?MAINLOOP
            BIT     0027H.0   0002H.0   UNIT         _BIT_GROUP_
            BIT     0029H.0   0001H.0   UNIT         ?BI?DRIVER
            BIT     002AH.0   0000H.5   UNIT         ?BI?IRQ
            BIT     002AH.5   0000H.3   UNIT         ?BI?MAINLOOP
            BIT     002BH.0   0000H.2   UNIT         ?BI?VIIC_C51
                    002BH.2   0000H.6                *** GAP ***
            DATA    002CH     0026H     UNIT         ?DT?IRQ
            DATA    0052H     0011H     UNIT         _DATA_GROUP_
            IDATA   0063H     0003H     UNIT         ?ID?MAINLOOP
            IDATA   0066H     0001H     UNIT         ?STACK

各位高手幫幫忙啊!我已經沒有辦法 了。在下感激不盡!

  
2楼:guest 2004年4月7日12:37
 我已經苦苦等了兩天了,難道就沒有高手會嗎
我已經苦苦等了兩天了,難道就沒有高手會嗎?
請大家伸出援助之手吧。
  
3楼:guest 2004年4月7日20:07
 snowmai@sohu.com
请试试改变编译模式
大模式,中模式,小模式

  
4楼:guest 2004年4月8日11:56
 [quote][b]以下是引用[i]gu
[quote]以下是引用guest在2004-4-7 20:07:22的发言:
snowmai@sohu.com请试试改变编译模式
 大模式,中模式,小模式

 
[/quote]

非常感謝你的回復。
但這樣編譯后它會將一些變量編排到pdata,xdata區,可是我的硬件並沒有外部ram。
還有沒有亙好的辦法能夠讓STACK區安排在idata區前一點的位置,這樣STACK就有足夠的空間,或是KEIL C編譯時早已考慮到STACK的空間,所以不應該會懷疑STACK空間不夠。

謝謝!

  
5楼:人工智慧 2004年4月9日00:38
 简单方法:
      把函数里的局部

简单方法:
      把函数里的局部变量用全局变量代替,不相冲突的话一个全局变量可用在很多函数里面。因为KEIL51编译器在自动覆盖函数的局部数据段时会浪费很多空间。
复杂方法:
      用KEIL51的连接定位控制命令。
  
6楼:smithli1210 2004年4月9日08:54
 最简单的办法就是换用一个RAM比AT89
最简单的办法就是换用一个RAM比AT89C52大,功能又能和AT89C52兼容的芯片试一下,不仅可以确定你的分析是否正确?而且还可以排除KELL C51可能存在的潜在的BUG,等 把问题解决了再分析不迟,否则怎么保证进度呢?
  
7楼:guest 2004年4月9日16:11
 非常感謝各位的幫忙!
看來我只有走這條

非常感謝各位的幫忙!
看來我只有走這條路了,但是不知道有什麼芯片RAM又大,又能兼容AT89C51,聽說STC增強性C8051就可以,但不知道價格如何?因為我要考慮到系統整體的性價比。
  
8楼:pigedong 2004年4月9日21:24
 W78E54

>>>>>>对该主题发表你的看法

本主题贴数8,分页: [第1页]


[上一篇主题]:RTL8019批量特价15元

[下一篇主题]:诚聘硬件工程师