<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    Rss & SiteMap

    曙海教育集團論壇 http://www.bjzhda.cn

    曙海教育集團論壇
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
    [瀏覽完整版]

    標題:單片機代碼優化深入討論

    1樓
    wangxinxin 發表于:2010-12-7 13:56:33
    本人在優化定時器和計數器的中斷處理函數中總結了一下經驗,才有自言自語格式:圖片點擊可在新窗口打開查看
    1、優化代碼采用匯編就是啦,何必在用C語言呢?
    答:代碼的優化是建立在于程序結構最優化之上的,好的程序結構,代碼優化才有價值,是優中優;反之糟糕的程序結構,代碼優化只能在最差的程序結構中得到最好代碼,是差中優。所以優中優>差中優。C語言是一種高級語言(有的叫中級語言)在描述程序結構的與匯編沒有區別,更直觀。
    2、現在單片機速度很快,為什么要優化的程序結構呢?
    答:比如我在編寫定時器和計數器的程序的時候,由于這個函數使用頻繁,這個中斷以后還要加入類似PLC的IO數據刷新程序(把PLC程序的結果送入單片機的IO端口,或從IO端口中讀入數據)和系統變量數據函數(如秒脈沖,100ms秒脈沖,等),所以這個中斷函數負擔很重。所以每個算法必須最優化。現在單片機速度很快,但是具體某一個固定功能的函數優化一下,可以把單片機資源更多的用于用戶程序。比如PLC的單片機必須解釋用戶程序。必須在定期完成。比如PLC周期是100ms,比如12M的8051,1/10的振蕩周期內完成。1.2M/12=100kHZ,平均下來,10萬指令條不到,還是比較緊張的。稍微好一點的PLC,周期數可以達到10ms。即使采用AVR這種RISC的,在10ms完成一個PLC掃描周期,也是很吃緊的。
    3、怎么才能得到最優的程序結構?
    答:這個問題很廣,算法=程序+數據結構。數據結構優化,可以學習數據結構的書籍,里面全是最優的結構,依賴于計算機。程序的優化,一般獨立于計算機,要自己有一個好的思路。
    比如我在處理定時器和計數器函數是,畫了狀態圖,根據狀態圖,編程序一目了然,基本是最優結構了。除非開發專用硬件或查表法。請參看我的另一個帖子:http://www.stmfans.com/bbs/viewt ... &extra=page%3D1
    4、你的那個帖子,首先發的效率不是還可以嗎?
    C語言精簡不等于編譯出來的東西會精簡。
    5、為什么呀?
    我首先貼出來的的C程序,沒有跟我畫出來的狀態圖一一對應。沒有充分利用各bit量的信息。
    比如,定時器從S1轉到S2,只需判斷T_EN=1;維持狀態:T_EN=0
    S2轉到S1,只需判斷T_EN=0。S2維持,須判斷T_ACC<T_SET=1。S2轉到S3,須判斷T_ACC<T_SET=0;
    S3轉到S1,T_EN=0;S3維持,T_EN=1;這個時候T_ACC<T_SET是個無關量,不需要重復運算了。

    我還設置tmp中間量,其實T_OUT的狀態已經表明T_ACC<T_SET=0,tmp是畫蛇添足的,浪費空間。
    6、條件表達式不是比if else要好嗎?
    在大多情況下,進行簡單的運算,要好一點(微弱),語句復雜的話,編譯出來的東西不一定高效。況且條件表達式中,
    無法加入break等語句。
    7、我看了關于編程優化的書籍,要減少跳轉的,你后面的程序跳轉很多呀?尤其是那個計數器,嵌套了好幾層呀?
    由于很多編程優化的書籍是針對PC機的:減少跳轉,可以提高CPU緩存的命中率。由于緩存速度很快,與CPU同步的。如intel的扣肉
    分一級緩存,二級緩存。當跳轉的時候如果跳出了二級緩存的范圍,會到內存中讀取數據,由于內存的速度比CPU慢一個數量級。
    所以效率不高。

    而我們的單片機編程的時候,flash與RAM都是與CPU同步的。單片機的RAM全部是SRAM(緩存也是SRAM),跳轉只能在單片機的資源以內,相當于PC的CPU中只能在緩存空間內跳。所以單片機的命中率是100%,除非出錯。圖片點擊可在新窗口打開查看OL所以跳轉語句只是單片機的一個普通指令,處理周期數不是最高的,比如51的跳轉都是2個機器周期。比如ADD,SUB,MOV等指令都要2個周期。
    8、你后面發的程序,為什么是最優呢?
    我把后面的程序由編譯器編譯出來的指令貼出來:
    ;        d:\MYDOCU~1\51_proj\timer.c:28: if(T0_EN)
            jnb        _T0_EN,00105$   ;對應狀態圖S2   t2
    ;        d:\MYDOCU~1\51_proj\timer.c:30: if(T0_OUT);
            jb        _T0_OUT,00106$        ;對應狀態圖S2   t2
    ;        d:\MYDOCU~1\51_proj\timer.c:32: {T0_OUT=++T0_ACC>=T0_SET;}
            inc        _T0_ACC           ;對應狀態圖S2 t1
            clr        c                                t1
            mov        a,_T0_ACC                        t2
            subb        a,#0x14                                t2
            mov  b0,c                                t2
            cpl        c                                t1
            mov        _T0_OUT,c        ;對應狀態圖S3  t2
            sjmp        00106$                                t2
    00105$:
    ;        d:\MYDOCU~1\51_proj\timer.c:36: T0_OUT=0;T0_ACC=0;
            clr        _T0_OUT                ;對應狀態圖S1  t1
            mov        _T0_ACC,#0x00                   t2
    00106$:

    即使沒采用匯編語言,C編譯器已經為我們產生出來很精簡的語句,當然32至36之間的代碼還可以采用匯編優化。
    所以首先程序優化,然后在進行匯編,難度降低了很多。因為程序優化后,C編譯出來的匯編,在進行優化工作量很小了。
    其中計數器的代碼變化最大,優化了10行之多。給我可以自己用編譯器試驗一下。

    9、這個是最快的嗎?
    不是,最快的應該是查表法。對這個定時器來說:
    方案一:
    輸入:T_EN,T_ACC,T_SET
    輸出:T_OUT,T_ACC
    建立一個數據表格,然后在中斷函數中用查表法,大概兩條指令搞定。不過占用的空間也是嚇人。圖片點擊可在新窗口打開查看OL

    10、在使用if else語句注意什么?
    采用if else語句避免()中進行多目運算。也不要進行取反運算,因為這樣代碼會增加好幾行。
    如果直接用bit量,這樣編譯器會用 jnb或jb,

    由于本人水平有限,舉例采用的是8051(因為我的電腦是P3 800,運行proteus正好)。希望對大家有參考作用
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

    Copyright © 2000 - 2009 曙海教育集團
    Powered By 曙海教育集團 Version 2.2
    Processed in .01563 s, 2 queries.
    主站蜘蛛池模板: 欧美不卡视频在线观看| 黄网站色视频免费看无下截| 日本免费一区二区三区最新| 亚洲精品线在线观看| 网友自拍区一区二区三区| 国产精品国产精品偷麻豆| 中文字幕一区日韩精品| 日韩人妻一区二区三区蜜桃视频| 亚洲综合色视频在线观看| 精品国产一区二区三区久久狼 | 国产美女免费观看| 中文字幕一区二区三区视频在线| 日韩一区二区三区无码影院 | 777米奇影视盒| 天天干天天草天天| 久久久久国色av免费观看| 曰本视频网络www色| 亚洲精品蜜桃久久久久久| 精品一区二区三区免费视频| 国产偷久久久精品专区| 124du在线观看| 国产视频手机在线观看| 一本色道久久综合亚洲精品高清 | 88av免费观看| 在线观看jizz| 两个人看的www免费| 无码任你躁久久久久久久| 亚洲一区二区三区不卡在线播放 | 中文japanese在线播放| 无遮挡全彩口工h全彩| 亚洲aⅴ无码专区在线观看q| 欧美成人看片黄a免费看| 免费人成视频x8x8入口| 精品国产免费一区二区三区| 国产做无码视频在线观看| 高清一级做a爱免费视| 国产精品成人va在线播放| a级精品国产片在线观看| 女人张开腿无遮无挡图| 中文字幕日韩视频| 无遮挡1000部拍拍拍免费凤凰|