請教一個有關51 記憶體與宣告問題~ |
答題得分者是:handystudio
|
dogcandoit
一般會員 發表:9 回覆:5 積分:2 註冊:2011-09-14 發送簡訊給我 |
請教一個有關51 記憶體與宣告問題~
目前採用AT89S52的晶片 在規格上為 內部具有8kByte的程式記憶體(Flash Rom) 內部具有256Byte的資料記憶體(Data RAM) 採用Keil C 根據以上的規格~ 1.上述所說的程式記憶體指的是程式行數的大小嗎!!? 2.上述所說的資料記憶體指的是在執行程式時,需要給晶片記憶的資料量大小嗎!!?宣告的變數名稱大小是否涵蓋在此資料記憶體內。 3.那如何觀察或程式可以得知目前程式記憶體&&資料記憶體 各已使用了多少!? 4.如果現在我要寫一個程式~記錄一個地圖的資訊~先不管宣告多少變數所佔用掉的資料記憶體 如果如上所述只有256Byte的資料記憶體~而我又需要記錄257個點,採用陣列1個點宣告1Byte 等於無法編譯過~?除了再外接資料記憶體外無解嗎!!?那這又跟編譯軟體(Keil C )有關嗎? 5.上網蒐尋過宣告變數除了像一般的int外,還有像是 int data 、int idata、int xdata 會對資料記憶體產生什麼影響嗎~到現在還是不懂實際用法~與何時該採用哪種~ 謝~ |
kib72377
高階會員 發表:1 回覆:217 積分:238 註冊:2004-11-12 發送簡訊給我 |
|
handystudio
高階會員 發表:1 回覆:81 積分:106 註冊:2005-03-26 發送簡訊給我 |
1.上述所說的程式記憶體指的是程式行數的大小嗎!!?
=> 不是,是原始程式碼組譯後,產生機械碼的大小,Keil C 組譯後,會顯示大小. 2.上述所說的資料記憶體指的是在執行程式時,需要給晶片記憶的資料量大小嗎!!?宣告的變數名稱大小是否涵蓋在此資料記憶體內。 => 不是,是被你程式使用的變數、堆疊或緩衝區等總合最大數量,宣告的變數大小也含在裡面 3.那如何觀察或程式可以得知目前程式記憶體&&資料記憶體 各已使用了多少!? => Keil C 組譯後,會顯示資訊, Program Size : data=60.5 xdata=0 code=1470 4.如果現在我要寫一個程式~記錄一個地圖的資訊~先不管宣告多少變數所佔用掉的資料記憶體 如果如上所述只有256Byte的資料記憶體~而我又需要記錄257個點,採用陣列1個點宣告1Byte 等於無法編譯過~?除了再外接資料記憶體外無解嗎!!?那這又跟編譯軟體(Keil C )有關嗎? => Keil compiler 在組譯時,會檢查你程式用的資料記憶體是否超過,包含堆疊記憶體,堆疊記憶體是必需要的, 所以程式能用的,一定小於256,編譯軟體是在檢查你程式的合法性,當然與編譯軟體有關. 5.上網蒐尋過宣告變數除了像一般的int外,還有像是 int data 、int idata、int xdata 會對資料記憶體產生什麼影響嗎~到現在還是不懂實際用法~與何時該採用哪種~ => 256 的資料記憶體 分前128 與 後 128, data 是前128, idata是後128, xdata 是外部記憶體,存取速度以前128 的定址時間最快,何時該採用哪種是看你要處理的資料性質為何,寫程式是要整體性的考慮,要有實際的程式用途敘述,才決定該採用哪種,比方只使用幾十個memory,當然就不考慮 xdata ===================引 用 dogcandoit 文 章=================== 請教一個有關51 記憶體與宣告問題~ 目前採用AT89S52的晶片 在規格上為 內部具有8kByte的程式記憶體(Flash Rom) 內部具有256Byte的資料記憶體(Data RAM) 採用Keil C 根據以上的規格~ 1.上述所說的程式記憶體指的是程式行數的大小嗎!!? 2.上述所說的資料記憶體指的是在執行程式時,需要給晶片記憶的資料量大小嗎!!?宣告的變數名稱大小是否涵蓋在此資料記憶體內。 3.那如何觀察或程式可以得知目前程式記憶體&&資料記憶體 各已使用了多少!? 4.如果現在我要寫一個程式~記錄一個地圖的資訊~先不管宣告多少變數所佔用掉的資料記憶體 如果如上所述只有256Byte的資料記憶體~而我又需要記錄257個點,採用陣列1個點宣告1Byte 等於無法編譯過~?除了再外接資料記憶體外無解嗎!!?那這又跟編譯軟體(Keil C )有關嗎? 5.上網蒐尋過宣告變數除了像一般的int外,還有像是 int data 、int idata、int xdata 會對資料記憶體產生什麼影響嗎~到現在還是不懂實際用法~與何時該採用哪種~ 謝~
------
歡迎光臨 輕巧工作室 網站 http://www.handystudio.tw 控制電路板客製設計、製作交貨 8051專題製作/專題客製 |
dogcandoit
一般會員 發表:9 回覆:5 積分:2 註冊:2011-09-14 發送簡訊給我 |
多謝前面2位的解答~大致上都了解了~
只是根據上面的回答中提到~ 的資料記憶體分前與後是前是後128 1.忽然想到那code呢~code是佔用程式記憶體嗎~還是一樣是資料記憶體~~? 因為似乎有書上某處有提到code有64K!!!? 那是不是也可能拿來宣告變數使用??可以變成儲存很多資料 2.普通所宣告的 像是int char 等等 也是占用在資料記憶體嗎??可是..不是前述前後128分別為data與idata? 因為在寫程式測試過後~發現似乎將程式記憶體寫到臨界值後~忽然砍掉一個變數的int宣告就可編譯過了 才覺得怪怪的~是不是是所宣告的變數屬於同時計算在程式與資料記憶體內? 因為初學~若有哪邊觀念不正確 所以產生很多疑問 還望指正~謝~~
編輯記錄
dogcandoit 重新編輯於 2011-10-21 08:41:44, 註解 無‧
|
kib72377
高階會員 發表:1 回覆:217 積分:238 註冊:2004-11-12 發送簡訊給我 |
|
handystudio
高階會員 發表:1 回覆:81 積分:106 註冊:2005-03-26 發送簡訊給我 |
首先對"變數"下個定義:變數故名思義, 是內容可被改變
所以定義變數時,需放置於可改變值的地方,擺錯地方,就失去變數的功能 而 code, data, idata, xdata.... 決定了資料擺放位置 data unsigned int var; => var 擺放在前128 byte 資料記憶體,(data 可省略),內容可被改變 idata unsigned int var => var 擺放在後128 byte 資料記憶體,內容可被改變 code unsigned int var => var 擺放在程式記憶體,內容不可被改變 xdata unsigned int var => var 擺放在8051外部記憶體,如果外部記憶體是RAM,則內容可被改變,如果外部記憶體是ROM,內容不可被改變 ===================引 用 dogcandoit 文 章=================== 多謝前面2位的解答~大致上都了解了~ 只是根據上面的回答中提到~ 的資料記憶體分前與後是前是後128 1.忽然想到那code呢~code是佔用程式記憶體嗎~還是一樣是資料記憶體~~? 因為似乎有書上某處有提到code有64K!!!? 那是不是也可能拿來宣告變數使用??可以變成儲存很多資料 2.普通所宣告的 像是int char 等等 也是占用在資料記憶體嗎??可是..不是前述前後128分別為data與idata? 因為在寫程式測試過後~發現似乎將程式記憶體寫到臨界值後~忽然砍掉一個變數的int宣告就可編譯過了 才覺得怪怪的~是不是是所宣告的變數屬於同時計算在程式與資料記憶體內? 因為初學~若有哪邊觀念不正確 所以產生很多疑問 還望指正~謝~~
------
歡迎光臨 輕巧工作室 網站 http://www.handystudio.tw 控制電路板客製設計、製作交貨 8051專題製作/專題客製 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |