音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(chǎng)網(wǎng)
技術(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ī)
奇怪的C51簡(jiǎn)化結(jié)果:
把一個(gè)長(zhǎng)函數(shù)拆成若干段子函數(shù)順序調(diào)用, 且都只調(diào)用了一次, 編譯后代碼總量卻減小了.

把以下這段代碼:
          if ( 0x80 == (BCD & 0x80) )
               _RXD = 1;
          else _RXD = 0;
改寫為
          _RXD = BCD >> 7;

代碼量居然增加了 ???

2樓: >>參與討論
yos
也許是這樣
第一種情況,可能是因?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樓: >>參與討論
圣域天子
答樓上:
樓上第一種情況的解釋是不存在的,
為了節(jié)約內(nèi)存,也因?yàn)槲沂荂++的習(xí)慣:在使用前才定義
所以我盡可能的用花括號(hào)把一段代碼完整的放在一起了.
而且我的多段代碼中,除了一兩個(gè)循環(huán)變量外,幾乎沒有使用到局部變量.
另外我沒有用程序的擴(kuò)展內(nèi)容,所以不存在XDATA型吧.

第二種情況我明白了,受教,謝謝!

4樓: >>參與討論
12864
_RXD = (bit)(BCD & 0x80)
這個(gè)呢?

5樓: >>參與討論
AIRWILL
看看編譯結(jié)果不就全明白了
 
6樓: >>參與討論
yos
那會(huì)不會(huì)是長(zhǎng)跳轉(zhuǎn)造成的呢?
長(zhǎng)函數(shù)有多長(zhǎng),會(huì)不會(huì)里面充滿長(zhǎng)跳轉(zhuǎn),拆分以后就沒有長(zhǎng)跳轉(zhuǎn)了?
樓主把問題弄明白后一定要分享一下喲!

7樓: >>參與討論
圣域天子
沒有長(zhǎng)跳轉(zhuǎn),是個(gè)時(shí)間事件,都是順序執(zhí)行的。
只有局部的for,有多個(gè),內(nèi)部的語句最少一行,最多的6行。
另外因習(xí)慣原因,沒有非常理由,不存在 goto 語句。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
STARTUP.A51究竟是干嗎用的?
麻煩幫我看一個(gè)模擬串行輸出的程序
問一個(gè)問題,關(guān)于STARTUP.A51的問題
請(qǐng)問有個(gè)元件是SOT-23封裝的(3腳貼片),其上文字是
24c64的問題
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)