日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] option -> c/c++ -> language/code genderation -> optimization選項(xiàng)下的優(yōu)化等級(jí)優(yōu)化級(jí)別說明(僅供參考):則其中的 Code Optimization 欄就是用來設(shè)置C51的優(yōu)化級(jí)別。共有9個(gè)優(yōu)化級(jí)別(書上這么寫的

 

option -> c/c++ -> language/code genderation -> optimization選項(xiàng)下的優(yōu)化等級(jí)

優(yōu)化級(jí)別說明(僅供參考):
則其中的 Code Optimization 欄就是用來設(shè)置C51的優(yōu)化級(jí)別。共有9個(gè)優(yōu)化級(jí)別(書上這么寫的),高優(yōu)化級(jí)別中包含了前面所有的優(yōu)化級(jí)別?,F(xiàn)將各個(gè)級(jí)別說明如下:

0級(jí)優(yōu)化:
1、常數(shù)折疊:只要有可能,編譯器就執(zhí)行將表達(dá)式化為常數(shù)數(shù)字的計(jì)算,其中包括運(yùn)行地址的計(jì)算。
2、簡(jiǎn)單訪問優(yōu)化:對(duì)8051系統(tǒng)的內(nèi)部數(shù)據(jù)和位地址進(jìn)行訪問優(yōu)化。
3、跳轉(zhuǎn)優(yōu)化:編譯器總是將跳轉(zhuǎn)延至最終目標(biāo)上,因此跳轉(zhuǎn)到跳轉(zhuǎn)之間的命令被刪除。
1級(jí)優(yōu)化:
1、死碼消除:無用的代碼段被消除。
2、跳轉(zhuǎn)否決:根據(jù)一個(gè)測(cè)試回溯,條件跳轉(zhuǎn)被仔細(xì)檢查,以決定是否能夠簡(jiǎn)化或刪除。
2級(jí)優(yōu)化:
1、數(shù)據(jù)覆蓋:適于靜態(tài)覆蓋的數(shù)據(jù)和位段被鑒別并標(biāo)記出來。連接定位器BL51通過對(duì)全局?jǐn)?shù)據(jù)流的分析,選擇可靜態(tài)覆蓋的段。
3級(jí)優(yōu)化:
1、“窺孔”優(yōu)化:將冗余的MOV命令去掉,包括不必要的從存儲(chǔ)器裝入對(duì)象及裝入常數(shù)的操作。另外如果能節(jié)省存儲(chǔ)空間或者程序執(zhí)行時(shí)間,復(fù)雜操作將由簡(jiǎn)單操作所代替。
4級(jí)優(yōu)化:
1、寄存器變量:使自動(dòng)變量和函數(shù)參數(shù)盡可能位于工作寄存器中,只要有可能,將不為這些變量保留數(shù)據(jù)存儲(chǔ)器空間。
2、擴(kuò)展訪問優(yōu)化:來自IDATA、XDATA、PDATA和CODE區(qū)域的變量直接包含在操作之中,因此大多數(shù)時(shí)候沒有必要將其裝入中間寄存器。
3、局部公共子式消除:如果表達(dá)式中有一個(gè)重復(fù)執(zhí)行的計(jì)算,第一次計(jì)算的結(jié)果被保存,只要有可能,將被用作后續(xù)的計(jì)算,因此可從代碼中消除繁雜的計(jì)算。
4、CASE/SWITCH語(yǔ)句優(yōu)化:將CASE/SWITCH語(yǔ)句作為跳轉(zhuǎn)表或跳轉(zhuǎn)串優(yōu)化。
5級(jí)優(yōu)化:
1、全局公共子式消除:只要有可能,函數(shù)內(nèi)部相同的子表達(dá)式只計(jì)算一次。中間結(jié)果存入一個(gè)寄存器以代替新的計(jì)算。
2、簡(jiǎn)單循環(huán)優(yōu)化:以常量占據(jù)一段內(nèi)存的循環(huán)再運(yùn)行時(shí)被優(yōu)化。
6級(jí)優(yōu)化:
1、回路循環(huán):如果程序代碼能更快更有效地執(zhí)行,程序回路將進(jìn)行循環(huán)。
7級(jí)優(yōu)化:
1、擴(kuò)展入口優(yōu)化:在適合時(shí)對(duì)寄存器變量使用DPTR數(shù)據(jù)指針,指針和數(shù)組訪問被優(yōu)化以減小程序代碼和提高執(zhí)行速度。
8級(jí)優(yōu)化:
1、公共尾部合并:對(duì)同一個(gè)函數(shù)有多處調(diào)用時(shí),一些設(shè)置代碼可被重復(fù)使用,從而減小程序代碼長(zhǎng)度。
9級(jí)優(yōu)化:
1、公共子程序塊:檢測(cè)重復(fù)使用的指令序列,并將它們轉(zhuǎn)換為子程序。C51甚至?xí)匦掳才糯a以獲得更多的重復(fù)使用指令序列。
當(dāng)然,優(yōu)化級(jí)別并非越高越好,應(yīng)該根據(jù)具體要求適當(dāng)選擇。


Keil C51總線外設(shè)操作問題的深入分析

閱讀了《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》2005年第10期雜志《經(jīng)驗(yàn)交流》欄目的一篇文章《Keil C51對(duì)同一端口的連續(xù)讀取方法》(原文)后,筆者認(rèn)為該文并未就此問題進(jìn)行深入準(zhǔn)確的分析 文章中提到的兩種解決方法并不直接和簡(jiǎn)單。筆者認(rèn)為這并非是Keil C51中不能處理對(duì)一個(gè)端口進(jìn)行連續(xù)讀寫的問題,而是對(duì)Kei1 C51的使用不夠熟悉和設(shè)計(jì)不夠細(xì)致的問題,因此特撰寫本文。
本文中對(duì)原文提到的問題,提出了三種不同于原文的解決方法。每種方法都比原文中提到的方法更直接和簡(jiǎn)單,設(shè)計(jì)也更規(guī)范。(無意批評(píng),請(qǐng)?jiān)淖髡咭娬?

1 問題回顧和分析
 

原文中提到:在實(shí)際工作中遇到對(duì)同一端口反復(fù)連續(xù)讀取,Keil C51編譯并未達(dá)到預(yù)期的結(jié)果。原文作者對(duì)C編譯出來的匯編程序進(jìn)行分析發(fā)現(xiàn),對(duì)同一端口的第二次讀取語(yǔ)句并未被編譯。但可惜原文作者并未分析沒有被編譯的原因,而是匆忙地采用一些不太規(guī)范的方法試驗(yàn)出了兩種解決辦法。


對(duì)此問題,翻閱Keil C51的手冊(cè)很容易發(fā)現(xiàn):KeilC51的編譯器有一個(gè)優(yōu)化設(shè)置,不同的優(yōu)化設(shè)置,會(huì)產(chǎn)生不同的編譯結(jié)果。一般情況缺省編譯優(yōu)化設(shè)置被設(shè)定為8級(jí)優(yōu)化,實(shí)際最高可設(shè)定為9級(jí)優(yōu)化:

1. Dead code elimination。
2.Data overlaying。
3.Peephole optimization。
4.Register variables。
5.Common subexpression elimination。
6.Loop rotation。
7.Extended Index Access Optimizing。
8.Reuse Common Entry Code。
9.Common Block Subroutines。
 

而以上的問題,正是由于Keil C51編譯優(yōu)化產(chǎn)生的。因?yàn)樵谠某绦蛑袑⑼庠O(shè)地址直接按如下定義:


unsigned char xdata MAX197 _at_ 0x8000


采用_at_將變量MAX197定義到外部擴(kuò)展RAM 指定地址0x8000。因此,Keil C51優(yōu)化編譯理所當(dāng)然認(rèn)為重復(fù)讀第二次是沒有用的,直接用第一次讀取的結(jié)果就可以了,因此編譯器跳過了第二條讀取語(yǔ)句。至此,問題就一目了然了。

2 解決方法
由以上分析很容易就能提出很好的解決辦法。
2.1 最簡(jiǎn)單最直接的辦法
程序一點(diǎn)都不用修改,將Keil C51的編譯優(yōu)化選擇設(shè)置為0(不優(yōu)化)就可以了。選擇project窗口的Target,然后打開“Options for Target”設(shè)置對(duì)話框,選擇“C51”選項(xiàng)卡,將“Code Optimiztaion”中的“Level”選擇為“0:Costant folding”。再次編譯后,大家會(huì)發(fā)現(xiàn)編譯結(jié)果為:
CLR MAXHBEN
MOV DPTR,#MAX197
MOVX A,@DPTR
MOV R7,A
MOV down8,R7
SETB MAXHBEN
MOV DPTR,#MAX197
MOVX A,@DPTR
MOV R7,A
MOV up4,R7
兩次讀取操作都被編譯出來了。

2.2 最好的方法


告訴Keil C51,這個(gè)地址不是一般的擴(kuò)展RAM,而是連接的設(shè)備,具有“揮發(fā)”特性,每次讀取都是有意義的??梢孕薷淖兞慷x,增加“volatile”關(guān)鍵字說明其特征:
unsigned char volatile xdata MAX197 _at_ 0x8000;


也可以在程序中包含系統(tǒng)頭文件;“#include”,然后在程序中修改變量,定義為直接地址:
#define MAX197 XBYTE


這樣,Keil C51的設(shè)置仍然可以保留高級(jí)優(yōu)化,且編譯結(jié)果中,同樣兩次讀取并不會(huì)被優(yōu)化跳過。
 

附表:Keil C51中的優(yōu)化級(jí)別及優(yōu)化作用 級(jí)別 說明
0 常數(shù)合并:編譯器預(yù)先計(jì)算結(jié)果,盡可能用常數(shù)代替表達(dá)式。包括運(yùn)行地址計(jì)算。
優(yōu)化簡(jiǎn)單訪問:編譯器優(yōu)化訪問8051系統(tǒng)的內(nèi)部數(shù)據(jù)和位地址。
跳轉(zhuǎn)優(yōu)化:編譯器總是擴(kuò)展跳轉(zhuǎn)到最終目標(biāo),多級(jí)跳轉(zhuǎn)指令被刪除。
1 死代碼刪除:沒用的代碼段被刪除。
拒絕跳轉(zhuǎn):嚴(yán)密的檢查條件跳轉(zhuǎn),以確定是否可以倒置測(cè)試邏輯來改進(jìn)或刪除。
2 數(shù)據(jù)覆蓋:適合靜態(tài)覆蓋的數(shù)據(jù)和位段被確定,并內(nèi)部標(biāo)識(shí)。BL51連接/定位器可以通過全局?jǐn)?shù)據(jù)流分析,選擇可被覆蓋的段。
3 窺孔優(yōu)化:清除多余的MOV指令。這包括不必要的從存儲(chǔ)區(qū)加載和常數(shù)加載操作。當(dāng)存儲(chǔ)空間或執(zhí)行時(shí)間可節(jié)省時(shí),用簡(jiǎn)單操作代替復(fù)雜操作。
4 寄存器變量:如有可能,自動(dòng)變量和函數(shù)參數(shù)分配到寄存器上。為這些變量保留的存儲(chǔ)區(qū)就省略了。
優(yōu)化擴(kuò)展訪問:IDATA、XDATA、PDATA和CODE的變量直接包含在操作中。在多數(shù)時(shí)間沒必要使用中間寄存器。
局部公共子表達(dá)式刪除:如果用一個(gè)表達(dá)式重復(fù)進(jìn)行相同的計(jì)算,則保存第一次計(jì)算結(jié)果,后面有可能就用這結(jié)果。多余的計(jì)算就被刪除。
Case/Switch優(yōu)化:包含SWITCH和CASE的代碼優(yōu)化為跳轉(zhuǎn)表或跳轉(zhuǎn)隊(duì)列。
5 全局公共子表達(dá)式刪除:一個(gè)函數(shù)內(nèi)相同的子表達(dá)式有可能就只計(jì)算一次。中間結(jié)果保存在寄存器中,在一個(gè)新的計(jì)算中使用。
簡(jiǎn)單循環(huán)優(yōu)化:用一個(gè)常數(shù)填充存儲(chǔ)區(qū)的循環(huán)程序被修改和優(yōu)化。
6 循環(huán)優(yōu)化:如果結(jié)果程序代碼更快和有效則程序?qū)ρh(huán)進(jìn)行優(yōu)化。
7 擴(kuò)展索引訪問優(yōu)化:適當(dāng)時(shí)對(duì)寄存器變量用DPTR。對(duì)指針和數(shù)組訪問進(jìn)行執(zhí)行速度和代碼大小優(yōu)化。
8 公共尾部合并:當(dāng)一個(gè)函數(shù)有多個(gè)調(diào)用,一些設(shè)置代碼可以復(fù)用,因此減少程序大小。
9 公共塊子程序:檢測(cè)循環(huán)指令序列,并轉(zhuǎn)換成子程序。Cx51甚至重排代碼以得到更大的循環(huán)序列。

 

 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

嵌入式開發(fā)作為一種專業(yè)且技術(shù)密集型的領(lǐng)域,涵蓋了從硬件底層驅(qū)動(dòng)、中間件到應(yīng)用層軟件開發(fā)等多個(gè)層面的工作,其所需的工具種類繁多,各有針對(duì)性,旨在提升開發(fā)效率、保證代碼質(zhì)量以及簡(jiǎn)化調(diào)試過程。

關(guān)鍵字: 嵌入式開發(fā) keil

大家好,我是肖遙,最近真真真的是太忙了,差不多幾個(gè)月的時(shí)間都是只能趕上最后幾班的地鐵,尤其是前面半個(gè)月,很多時(shí)候都是凌晨倆三點(diǎn)打車回家,自己的時(shí)間很少,一直在為項(xiàng)目做準(zhǔn)備。這幾天來北京就是搞這個(gè)項(xiàng)目,來到現(xiàn)場(chǎng)的實(shí)驗(yàn)室調(diào)試...

關(guān)鍵字: 地鐵 實(shí)驗(yàn)室 環(huán)境

之后新建新的工程,添加.a文件就可以使用了,當(dāng)然也可以使用keil來添加,但是keil默認(rèn)的是用.lab,需要自己配置一下文件屬性,改為lib文件即可。一半release sdk的時(shí)候用這種方式很關(guān)鍵的,畢竟自己的核心代...

關(guān)鍵字: keil 文件屬性 lib文件

2022年1-6月,在國(guó)際嚴(yán)峻的環(huán)境和疫情波動(dòng)性影響下,杭州市經(jīng)濟(jì)運(yùn)行呈現(xiàn)企穩(wěn)回升態(tài)勢(shì)。從杭州各區(qū)域工業(yè)經(jīng)濟(jì)發(fā)展?fàn)顩r來看,濱江區(qū)規(guī)模以上工業(yè)總產(chǎn)值、人均工業(yè)產(chǎn)值、工業(yè)產(chǎn)值地集約度均領(lǐng)先于全市其他地區(qū);從固定資產(chǎn)投資角度,...

關(guān)鍵字: 總產(chǎn)值 社會(huì)消費(fèi) 環(huán)境

摘要:從灌裝間懸浮粒子監(jiān)測(cè)系統(tǒng)工作原理著手,分析了懸浮粒子監(jiān)測(cè)數(shù)據(jù)發(fā)生異常的原因,針對(duì)灌裝間懸浮粒子監(jiān)測(cè)數(shù)據(jù)異常的問題,提出了相應(yīng)的解決方法。

關(guān)鍵字: 灌裝間 懸浮粒子計(jì)數(shù)器 環(huán)境

ESP32環(huán)境搭建(arduino)

關(guān)鍵字: esp32 Arduino 環(huán)境

DSP28335與AD7606通過SPI的串行數(shù)據(jù)交互

關(guān)鍵字: keil C

為幫助大家更好使用單片機(jī)編程軟件,本文將對(duì)keil單片機(jī)編程軟件仿真、調(diào)劑技巧予以講解,并對(duì)該單片機(jī)編程軟件的常見錯(cuò)誤提示予以闡述。

關(guān)鍵字: 單片機(jī)編程軟件 指數(shù) keil

本文對(duì)于單片機(jī)編程軟件的介紹將基于如何采用keil單片機(jī)編程軟件調(diào)試stm32,如果你對(duì)單片機(jī)編程軟件抑或本文內(nèi)容具有興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: 單片機(jī)編程軟件 指數(shù) keil
關(guān)閉