全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4203
推到 Plurk!
推到 Facebook!

關於c51管理變數的一個疑惑

缺席
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-12-16 02:28:55 IP:120.105.xxx.xxx 訂閱
你好,我在前個月開始學習用C51在keil上寫程式
我看網路上說C51會幫忙管理記憶體,可是在實際編寫時我有個疑問...

我看了一下書,他說局域變數在副程式結束時會失去作用並釋放
但我每次給副程式增加傳遞參數或是局域變數時data就會上升

目前我是:
Program Size: data=67.1 xdata=0 code=4765

C51真的會幫我們管理嗎?
還是說其實是我哪裡會錯意了?

可以給我一點意見嗎?
harrypp
中階會員


發表:7
回覆:124
積分:61
註冊:2006-08-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-12-17 11:20:36 IP:218.210.xxx.xxx 訂閱
沒貼原始碼實在有點難回答你的問題,
不過你也可以看編譯後的m51檔,
裡面有詳細的記憶體配置方式。
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-12-17 12:42:45 IP:120.105.xxx.xxx 訂閱
感謝回應
我不貼程式碼的原因,是因為我不方便將內容放出,另外程式碼也很長。
如果問題真的是在於我編寫c51方式的話我會把他貼出來
(我變數宣告都是沒必要用全域就不用)

至於提到的m51檔我目前正在網路上找資料來弄懂他的意思


peter90307.myweb.hinet.net/MAIN.M51
編輯記錄
inlem2000 重新編輯於 2009-12-17 12:51:28, 註解 無‧
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-17 15:05:58 IP:114.38.xxx.xxx 未訂閱
大大:
keil c51在定義local variables 時會吃您的內部RAM ,您可用register來定義,不過要將堆疊放大,詳
http://www.keil.com/support/man/docs/c51/c51_le_register.htm
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-17 15:21:52 IP:120.105.xxx.xxx 訂閱
感謝回應

>foreman
你貼的連結我去看了一下
他是說將變數宣告成一個"暫存器變數"

我稍微看了一下我手邊的書,他是說宣告成暫存器變數可以增加程式執行效率。

可以解釋一下為什麼要用這個方法來宣告、以及為什麼要將堆疊放大嗎?
因為我對這個有些不明白...
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-17 16:33:15 IP:114.38.xxx.xxx 未訂閱
通常函數參數會使用暫存器詳
http://www.keil.com/support/man/docs/c51/c51_le_passingparmsinregs.htm
而函數局部變數也用暫存器若用多了勢必靠推疊來解決故要放大.
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-12-17 17:40:02 IP:120.105.xxx.xxx 訂閱
>foreman
我看了一下,這個是指說各型別的傳遞參數在暫存器上所使用的空間?
也就是說,如果我在副程式中宣告一個暫存器變數他就會使用那些沒用到的暫存器空間?

不知道我有沒有弄錯你的意思...


其實我以前曾看過一個文他有提到說因為c51使用data overlaying技術來克服區域變數浪費的問題。
(我完全感覺不出來他有在克服...|||)

在回覆文章時我去查了一下有關data overlaying文章,他有提到...

的選項
換句話說,只讓
compiler以下的最佳化動作,
雖然機械碼變的沒那麼棒,檔案大小也變大了,速度也沒那麼快,
....略


所以我在keil中找到code optimization的選項並將等級調到9(原先是0)
結果組譯後發現data從55掉到22了!
我只能感嘆好神奇....

難道我會有這問題是因為我調成0的緣故嗎?(因為我模擬器的說明書要我調得...)
可以的話能向我說明這是什麼選項嗎?
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-12-17 21:05:22 IP:114.27.xxx.xxx 未訂閱
大大:
您要的說明詳
http://www.keil.com/support/man/docs/c51/c51_optimize.htm
雖然寫了不少c51程式, 但我硬體工程師給我外部RAM 2K以上我程式只要定成#pragma la局部變數就會佔用xdata
其實我不喜歡用8051及pic因為它們用RAM很兇
我喜歡用renesas的r8c及h8tiny系列它們會將局部變數使用堆疊所以不太佔用的空間
再者8051及pic很容易招拷貝
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-12-17 21:27:26 IP:120.105.xxx.xxx 訂閱
那我還有一個疑問喔

那平常在副程式中宣告變數,是要用你所說得暫存器變數?
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-12-20 14:17:17 IP:219.70.xxx.xxx 訂閱
我已經去其他論壇詢問了
感謝之前有回覆的人
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-12-20 22:59:34 IP:114.37.xxx.xxx 訂閱
以[缺席]結案?
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-12-21 06:53:01 IP:120.105.xxx.xxx 訂閱
因為我的問題並沒有被解決阿?
還是說不管有沒有獲得答案都應該點結案?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-12-21 10:23:10 IP:122.116.xxx.xxx 訂閱
您是指原本問的問題沒有解決,還是您提的新問題沒有解決?

===================引 用 inlem2000 文 章===================
因為我的問題並沒有被解決阿?
還是說不管有沒有獲得答案都應該點結案?
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-12-21 12:15:16 IP:120.105.xxx.xxx 訂閱
都沒有解決,optimization的那個對我來說只是治標但沒有根除我的疑惑
我也想過可能問題就是出在這裡,但沒人對此表示是或否...

還有...
>我看了一下,這個是指說各型別的傳遞參數在暫存器上所使用的空間?
>也就是說,如果我在副程式中宣告一個暫存器變數他就會使用那些沒用到的暫存器空間?
>不知道我有沒有弄錯你的意思...

這是我根據
foreman他所提到的看法進行回答,但他最後沒告訴我是否誤解他的意思
他只回答我optimization的選項每個級別的公用,所以我覺得我的疑惑並沒有被根除...
harrypp
中階會員


發表:7
回覆:124
積分:61
註冊:2006-08-31

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-12-21 16:02:48 IP:210.202.xxx.xxx 訂閱
這個問題說來話長,尤其對初學者。
姑且跳離Keil-C的編譯方式,
你先回答我一個問題。

請問8051的變數可以放在哪些地方?或可宣告在哪些地方?
這個應該書上就找的到!
inlem2000
一般會員


發表:8
回覆:21
積分:5
註冊:2008-12-29

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-12-21 17:19:27 IP:120.105.xxx.xxx 訂閱
說真的,這討論是否已經得到解答主要還是由發文的人決定吧?
從上一個回覆的人語氣中我能感覺出來一點火藥味...
所以這是我最後一次回文...

如果管理員認為這個討論早已獲得解答的話想設定成結案我不反對,
但我以我個人得角度來說...

我,並沒有得到滿意的解答 所以我選擇不結案


而且說實在的,那種明明得到解答但卻故意不結案的惡趣味心態對我來說沒有好處...
當然,明明沒得解但卻故意結案 這我就無法理解了...
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-12-21 17:31:49 IP:122.116.xxx.xxx 訂閱
基於我是管理者的關係,我會站在答題者的立場著想
看到太多無故[缺席]例子,例如
http://delphi.ktop.com.tw/board.php?cid=168&fid=1499&tid=100041
所以我會希望發問者解釋為何選擇[缺席]結案
你有解釋[缺席]的原因,且前輩們的回應有參考價值,固保留此文章^^



===================引 用 inlem2000 文 章===================
說真的,這討論是否已經得到解答主要還是由發文的人決定吧?
從上一個回覆的人語氣中我能感覺出來一點火藥味...
所以這是我最後一次回文...

如果管理員認為這個討論早已獲得解答的話想設定成結案我不反對,
但我以我個人得角度來說...

我,並沒有得到滿意的解答 所以我選擇不結案


而且說實在的,那種明明得到解答但卻故意不結案的惡趣味心態對我來說沒有好處...
當然,明明沒得解但卻故意結案 這我就無法理解了...
harrypp
中階會員


發表:7
回覆:124
積分:61
註冊:2006-08-31

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-12-21 19:07:33 IP:218.210.xxx.xxx 訂閱
該不會是指我吧!
多打點字,以免被誤會...........

其實答案很簡單,
我只是提醒你回歸到原來8051的架構。
C51編譯只是把C轉譯原來的8051,
所以當你知道8051的變數有哪幾種方式存放的話,
你就會知道那些編譯參數只是去調整這些放法。
想更深入的話,常按Diassembly window對照看看。
===================引 用 inlem2000 文 章===================
從上一個回覆的人語氣中我能感覺出來一點火藥味...
編輯記錄
harrypp 重新編輯於 2009-12-21 19:10:52, 註解 無‧
系統時間:2024-04-27 4:05:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!