<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MDK C++中對內聯的極度優(yōu)化

      先來看看我們SmartIRQ的具體實現

      // 智能IRQ,初始化時備份,銷毀時還原
      class SmartIRQ
      {
      public:
          force_inline SmartIRQ(bool enable = false)
          {
              _state = __get_PRIMASK();
              if(enable)
                  __enable_irq();
              else
                  __disable_irq();
          }
      
          force_inline ~SmartIRQ()
          {
              __set_PRIMASK(_state);
          }
          
      private:
          uint _state;
      };

      在構造的時候備份,然后根據參數決定打開還是關閉中斷。
      在系統內核時鐘里面,關鍵操作需要關閉中斷,最后打開,以免其它中斷影響關鍵操作的原子事務性。

      于是我們有:

      ulong Time::CurrentTicks()
      {
          SmartIRQ irq;
      
          uint value = (SysTick->LOAD - SysTick->VAL);
          if(SysTick->CTRL & SysTick_CTRL_COUNTFLAG)
          {
              Ticks += SysTick->LOAD;
          }
      
          return Ticks + value;
      }

      其中irq在離開作用域時被釋放,自動調用SmartIRQ的析構函數,還原了中斷狀態(tài)

      因為調用極其頻繁,最高可能1us調用一次該函數,于是我們給SmartIRQ的構造和析構都加了force_inline強制使用內聯。
      總所周知,C++的內聯其實就是以空間換時間,把一個函數的代碼全部搬出來直接使用,省去了調用、壓棧、彈棧、返回等操作。
      SmartIRQ的析構函數就罷了,但是構造函數代碼量還是有好幾行的。
      懷著試一試的心態(tài)調試該函數,直接觀察匯編代碼:

      0x08000804 B570      PUSH     {r4-r6,lr}
      0x08000806 F3EF8210  MRS      r2,PRIMASK
      0x0800080A B672      CPSID    I
      0x0800080C 4D0B      LDR      r5,[pc,#44]  ; @0x0800083C
      0x0800080E 6969      LDR      r1,[r5,#0x14]
      0x08000810 69AB      LDR      r3,[r5,#0x18]
      0x08000812 1ACC      SUBS     r4,r1,r3
      0x08000814 6929      LDR      r1,[r5,#0x10]
      0x08000816 2300      MOVS     r3,#0x00
      0x08000818 03C9      LSLS     r1,r1,#15
      0x0800081A 2900      CMP      r1,#0x00
      0x0800081C DA06      BGE      0x0800082C
      0x0800081E 6886      LDR      r6,[r0,#0x08]
      0x08000820 68C1      LDR      r1,[r0,#0x0C]
      0x08000822 696D      LDR      r5,[r5,#0x14]
      0x08000824 1975      ADDS     r5,r6,r5
      0x08000826 4159      ADCS     r1,r1,r3
      0x08000828 6085      STR      r5,[r0,#0x08]
      0x0800082A 60C1      STR      r1,[r0,#0x0C]
      0x0800082C 6885      LDR      r5,[r0,#0x08]
      0x0800082E 68C1      LDR      r1,[r0,#0x0C]
      0x08000830 1928      ADDS     r0,r5,r4
      0x08000832 4159      ADCS     r1,r1,r3
      0x08000834 F3828810  MSR      PRIMASK,r2
      0x08000838 BD70      POP      {r4-r6,pc}

      MDK C++編譯器優(yōu)化到了極度變態(tài)的地步!
      不僅僅內聯了,SmartIRQ里面有兩個分支語句,直接被他省略了其中一個,因為參數true已經確定。
      更加變態(tài)的是,本來采用SmartIRQ內部私有成員_state保存狀態(tài),析構時恢復的,它直接把這個狀態(tài)保存到寄存器r2里面去,連_state的內存都給省了。

       

      posted @ 2017-09-01 13:12  大石頭  閱讀(521)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无码一区二区三区av在线播放| 国产在线精品一区二区三区不卡| 九九热视频精选在线播放| 婷婷五月综合丁香在线| 777奇米四色成人影视色区| 日韩秘 无码一区二区三区| 国产精品 无码专区| 久久亚洲日韩精品一区二区三区| 久久这里只精品国产2| 精品久久久久久中文字幕202| 金堂县| 国产国语毛片在线看国产| 亚洲天堂领先自拍视频网| 亚洲国产日韩伦中文字幕| 人妻伦理在线一二三区| 久久久久国产精品熟女影院| 亚洲男人电影天堂无码| 制服jk白丝h无内视频网站| 国产高清自产拍av在线| 久久99精品久久久久久9| 亚洲自拍偷拍一区二区三区| 久久午夜无码免费| 新邵县| 阿拉善左旗| 缙云县| 国产精品美女一区二区三| 中文丰满岳乱妇在线观看| 亚洲av不卡电影在线网址最新| 亚洲欧美在线一区中文字幕| 国产伦一区二区三区精品| 香蕉在线精品一区二区| 亚洲人成网站18禁止无码| 亚洲一区二区中文字幕| 裸体美女无遮挡免费网站| 亚洲国产精品综合久久网络| 18禁超污无遮挡无码网址| 麻豆国产成人AV在线播放| 国产亚洲久久久久久久| 日韩黄色av一区二区三区 | 亚洲精品久久久久久下一站| 中文字幕av一区二区|