|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
奇怪的C51簡(jiǎn)化結(jié)果: |
| 作者:圣域天子 欄目:單片機(jī) |
把一個(gè)長(zhǎng)函數(shù)拆成若干段子函數(shù)順序調(diào)用, 且都只調(diào)用了一次, 編譯后代碼總量卻減小了. 把以下這段代碼: if ( 0x80 == (BCD & 0x80) ) _RXD = 1; else _RXD = 0; 改寫為 _RXD = BCD >> 7; 代碼量居然增加了 ??? |
| 2樓: | >>參與討論 |
| 作者: yos 于 2006/1/23 10:34:00 發(fā)布:
也許是這樣 第一種情況,可能是因?yàn)殚L(zhǎng)函數(shù)里面用了很多局部變量,寄存器放不下,就放到內(nèi)存去了,如果使用large模式,則在xdata(不知keil是否把堆棧也放到xdata)中,由于51的先天結(jié)構(gòu),處理xdata里的數(shù)據(jù)是非常費(fèi)時(shí)費(fèi)力的。拆開后,可能剛好事每個(gè)函數(shù)的局部變量都可以放在寄存器里,當(dāng)然又快又省了。 第二種情況,51只有移一位的指令,所以BCD>>7要么翻譯成7條移位指令,要么翻譯成一個(gè)循環(huán),兩種情況代碼都比一個(gè)判斷語句長(zhǎng)。 * - 本貼最后修改時(shí)間:2006-1-23 10:47:31 修改者:yos |
|
| 3樓: | >>參與討論 |
| 作者: 圣域天子 于 2006/1/23 11:28:00 發(fā)布:
答樓上: 樓上第一種情況的解釋是不存在的, 為了節(jié)約內(nèi)存,也因?yàn)槲沂荂++的習(xí)慣:在使用前才定義 所以我盡可能的用花括號(hào)把一段代碼完整的放在一起了. 而且我的多段代碼中,除了一兩個(gè)循環(huán)變量外,幾乎沒有使用到局部變量. 另外我沒有用程序的擴(kuò)展內(nèi)容,所以不存在XDATA型吧. 第二種情況我明白了,受教,謝謝! |
|
| 4樓: | >>參與討論 |
| 作者: 12864 于 2006/1/23 21:04:00 發(fā)布:
_RXD = (bit)(BCD & 0x80) 這個(gè)呢? |
|
| 5樓: | >>參與討論 |
| 作者: AIRWILL 于 2006/1/23 22:09:00 發(fā)布:
看看編譯結(jié)果不就全明白了 |
|
| 6樓: | >>參與討論 |
| 作者: yos 于 2006/1/24 8:57:00 發(fā)布:
那會(huì)不會(huì)是長(zhǎng)跳轉(zhuǎn)造成的呢? 長(zhǎng)函數(shù)有多長(zhǎng),會(huì)不會(huì)里面充滿長(zhǎng)跳轉(zhuǎn),拆分以后就沒有長(zhǎng)跳轉(zhuǎn)了? 樓主把問題弄明白后一定要分享一下喲! |
|
| 7樓: | >>參與討論 |
| 作者: 圣域天子 于 2006/1/24 12:45:00 發(fā)布:
沒有長(zhǎng)跳轉(zhuǎn),是個(gè)時(shí)間事件,都是順序執(zhí)行的。 只有局部的for,有多個(gè),內(nèi)部的語句最少一行,最多的6行。 另外因習(xí)慣原因,沒有非常理由,不存在 goto 語句。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |