娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月14日(星期六)

2019年06月14日 | STM32-基于匯編來分析延時

發布者:qpb1234 來源: eefocus關鍵字:STM32  匯編  延時 手機看文章 掃描二維碼
隨時隨地手機看文章

上一篇文章寫了一個延時函數,是這樣的:

void Delay(uint32_t nCount) 

{

     for(; nCount != 0; nCount--);

}

為了延時1秒,設置了一個值:1600000。

為什么取這樣一個值,這是我實測出來的一個值,是通過多次累計閃燈次數,對應電腦時間,計算出來的。

看見這個值之后,我有一個推測:

1.6M=8M/5

我沒有使用外部晶振HSE,使用了默認的內部晶振HSI,主頻為8M。

所以,可能這個延時函數循環一次所需要的機器周期數就是5!

怎么驗證?

可以看下匯編代碼來進行分析。


具體操作步驟:

在成功編譯程序后,點擊工具欄上一個紅色的"D",進入調試狀態,再把鼠標點到c代碼處,右鍵查看匯編代碼,就可以看到所有c代碼編譯后的匯編代碼了。

延時函數的匯編是這樣的:


    53:      for(; nCount != 0; nCount--); 

0x08000206 E000      B        0x0800020A

0x08000208 1E40      SUBS     r0,r0,#1

0x0800020A 2800      CMP      r0,#0x00

0x0800020C D1FC      BNE      0x08000208    


可以看到有4條匯編指令:

B,跳轉

SUBS,減

CMP,比較

BNE,根據標志跳轉


大體理解,就是這樣:進入循環后,先跳轉去進行比較。比較后,查看比較結果,若不相等,則跳轉去執行減操作。

對于循環次數很多的情況,可以忽略第一次的跳轉,所以一般情況下的循環一次,就是執行3條指令:

0x08000208 1E40      SUBS     r0,r0,#1

0x0800020A 2800      CMP      r0,#0x00

0x0800020C D1FC      BNE      0x08000208    


3條指令,5個機器周期,能對應上么?

我上網查了一下,大概的結論是:


stm32 屬于ARM ,ARM都是精簡指令集,大部分的指令(除STM、LDM、BNE等外)都是單周期指令。

對于跳轉指令,需要增加兩個指令周期


按這種方式來估算:

SUBS,1

CMP,1

BNE,3

則 1+1+3=5 ,應該是符合的。


但是我心里不太踏實,畢竟沒有誰明確說哪個指令是幾個周期,這中間還是有部分猜測的。是否有更靠譜的方式呢?


然后又找到一個好方法:

具體步驟參見:

https://blog.csdn.net/qq_41092963/article/details/82759097


大概說下步驟:

進keil的調試模式,單步調試,記錄時間。

查看時間:Logic Analyzer窗口

匯編代碼:Disassembly窗口

另外,還可以開一個Watch窗口,查看我們關心的變量值。


其樣式見下圖:

通過幾次單步操作,記錄下時間,然后我們可以列出一個表來:


  累計(ns) 指令耗時(ns)

初始 247750  

CMP 247875 125

BNE 248250 375

SUBS 248375 125

125ns,一個機器周期,即頻率的倒數:1/8M,完全吻合。

這樣,就確實驗證了之前的猜測:

SUBS,1個機器周期(125ns)

CMP,1個機器周期(125ns)

BNE,3個機器周期(375ns)

這樣,我們就可以從微觀的循環周期向宏觀的時間進行計算了:

循環一次所需機器周期數: 1+1+3=5 。

5個機器周期,耗時就是125ns*5=625ns

循環1.6M次的耗時:625ns*1600000=625*1.6ms=1000ms=1s


如此,心里就踏實了。



如果試試不同的延時函數的寫法呢?


寫成while循環,結果會怎樣呢?

看看匯編,基本上是一樣的:


0x080012D8 E000      B        0x080012DC

0x080012DA 1E40      SUBS     r0,r0,#1

   368:         while(TimeDelay > 0){ 

   369:                 TimeDelay--; 

   370:         } 

0x080012DC 2800      CMP      r0,#0x00

0x080012DE D1FC      BNE      0x080012DA


也是這樣3個指令:SUBS,CMP,BNE。還是5個機器周期,沒有問題。



如果選擇不一樣的編譯方式呢?

之前使用的是o0優化,現在使用o3優化(Options for Target --> C/C++ -->Optimization),看看:

    42: void Delay(uint32_t nCount)  

    43: { 

0x0800048C 4C03      LDR      r4,[pc,#12]  ; @0x0800049C

0x0800048E 4620      MOV      r0,r4

0x08000490 1E40      SUBS     r0,r0,#1

    44:      for(; nCount != 0; nCount--); 

0x08000492 D1FD      BNE      0x08000490        

        

主循環中只有2個指令了:SUBS,BNE。居然只有4個機器周期了!


現在來推測一下,需要循環多少次:

4*125*n=1000,000,000ns

n=2000,000

來放心的驗證吧!


對比上面兩種循環的差異,就是少了一個CMP指令。

可是,這樣也有點奇怪吧,難道,cmp指令,是可有可無的嗎?

這里需要理解下BNE指令。


BNE指令,是個條件跳轉,即:是“不相等(或不為0)跳轉指令”。如果不為0就跳轉到后面指定的地址,繼續執行。

而“不相等(或不為0)”,是什么不相等,什么不為0?其實它判斷的是CPSR中的 Z 標記。

具體關于 Z 標記怎么設置的?那就依賴于上一個執行指令了。


再看上一條指令,兩種優化模式下編譯的結果不同,分別是CMP與SUBS。


CMP比較指令,用于把一個寄存器的內容和另一個寄存器的內容或一個立即數進行比較,同時更新CPSR中條件標志位的值。

對于減法,本來有一個SUB。而SUBS的差異,就是多了一個S,它的作用就是會根據執行結果來更新CPSR中的 N、Z、C 和 V 標記。


簡單總結一下,BNE的判斷依賴于Z標志,而CMP與SUBS會影響標志位,具體是如何影響的,我也不想再深入研究了,大體了解到這里,基本能滿足我的好奇心了。



再補充一句,就是關于BNE指令的耗時。

前面我們知道,跳轉時它的耗時是3個機器周期。后面我又測試了一下,若不跳轉,例如是最后一次比較,結果恰好為0,則順序往下執行,此時,BNE指令的耗時是1個機器周期。


可見,匯編里面的內容是很深奧的,所幸,我不需要花太多時間去研究,在此,只是大體了解下,解解幾個小疑惑即可。



關鍵字:STM32  匯編  延時 引用地址:STM32-基于匯編來分析延時

上一篇:STM32-仿真調試時的SystemInit陷阱
下一篇:STM32-點燈程序

推薦閱讀

2018亞洲消費電子展(以下簡稱CES Asia?2018)在上海拉開帷幕,吸引了來自中國、美國、澳大利亞、加拿大、芬蘭、法國、荷蘭等13個國家和地區的500余家企業參展。無人駕駛初創企業Roadstar.ai攜全球首款純國產激光雷達Level4自動駕駛解決方案「Aries·銳」亮相CES Asia,并從100多家初創企業里脫穎而出,獲得最佳初創公司(Best Startup)以及最佳人工...
緩解EMC問題的設計 要使設計擁有良好的抗EMC干擾性能,需要一個關注工廠級(如接地和配電)乃至各集成電路性能的多層次方法。實際上有很多IIoT設備需要改造,這就進一步加劇了工作難度,所以即便能夠完成整體改造(例如為工廠基礎設施重新布線),也是非常困難。 EMC設計:工廠層面 從工廠層面來說,配電系統的設計是獲得良好EMC性能的基本保障。通常情況...
國微集團首席科學家聘請儀式于國實大廈23樓報告廳隆重舉行,中國科學院院士郝躍教授正式受聘成為國微集團首席科學家。西安電子科技大學微電子學院院長張玉明、CAD所副主任初秀琴、西電國微研究院副院長游海龍,國微集團董事長黃學良、總裁帥紅宇以及集團管理層代表一同出席聘請儀式。黃學良董事長代表國微集團對郝躍院士的加盟表示熱烈歡迎,對郝躍院士一...
6 月 14 日消息 根據外媒 theregister 消息,新加坡南洋理工大學教授 Rachid Yazami(拉奇德 雅扎米)近日研發了一種新型快充技術,可以實現 10 分鐘內為鋰電池充滿電。這位教授最知名的成就便是在 1983 年左右發明了具有實用性的鋰電池石墨陽極,成為現代鋰電池的基礎。近日雅扎米教授聲稱,他的公司實現了世界上最快的鋰電池快充技術,是特...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 呈贡县| 德庆县| 务川| 商丘市| 清镇市| 陈巴尔虎旗| 兴宁市| 西青区| 南澳县| 偏关县| 夏津县| 娄底市| 两当县| 永济市| 金华市| 湖北省| 长寿区| 白银市| 惠州市| 阳信县| 盐亭县| 南江县| 漠河县| 新乐市| 利津县| 镇安县| 耿马| 英吉沙县| 三亚市| 玉山县| 铜陵市| 印江| 巫山县| 绩溪县| 盐城市| 延庆县| 定西市| 新兴县| 福建省| 旅游| 神农架林区|