1. 程式人生 > >STM32彙編指令(一)WFI 和 WFE

STM32彙編指令(一)WFI 和 WFE

ARM彙編的呼叫

嵌入式開發,尤其是編寫BSP的時候,非常接近底層,這個時候有可能用一些彙編指令來保證程式的簡潔和高效,但是平常編寫程式碼用到的都是C/C++,那麼如何使用匯編指令呢?
其實這個問題也很簡單,在C/C++中提供了關鍵字asm或者ASM來內嵌彙編,使用如下:

asm("WFI");

但是這種方法問題比較大,在Cortex-M平臺上,這個語句有很大機率編譯不通過,因為各家編譯器又實現了自己的巨集,具體可以在core_cmx.h中看到,如果我們的專案要在不同的編譯器上通過,可以考慮使用條件編譯來達標,不過這樣付出的成本就很大。

另外一種簡單的方法是使用intrinsic.h這個標頭檔案,這個標頭檔案把所有的彙編指令都封裝成了諸如__Commnad()

的函式形式,並且預編譯為二進位制包,故不必使用條件編譯也能達到相同效果

WFI和WFE

這兩條指令的作用都是令MCU進入休眠/待機狀態以便降低功耗,但是略有區別:

WFI: wait for Interrupt 等待中斷,即下一次中斷髮生前都在此hold住不幹活

WFE: wait for Events 等待事件,即下一次事件發生前都在此hold住不幹活

所以使用前要掂量好到底是什麼會觸發MCU喚醒事件

相關推薦

STM32彙編指令WFI WFE

ARM彙編的呼叫 嵌入式開發,尤其是編寫BSP的時候,非常接近底層,這個時候有可能用一些彙編指令來保證程式的簡潔和高效,但是平常編寫程式碼用到的都是C/C++,那麼如何使用匯編指令呢? 其實這個問題也很簡單,在C/C++中提供了關鍵字asm或者ASM來內嵌彙

ARM aarch64彙編學習筆記:使用Neon指令

NEON是一種基於SIMD思想的ARM技術。 SIMD, Single Instruction Multiple Data,是一種單條指令處理多個數據的並行處理技術,相比於一條指令處理一個數據,運算速度將會大大提高。 ARMv8 有31 個64位暫存器,1個不同

STM32 HAL庫學習 STM32CubeMXTRUEStudio的使用

最近開始學習STM32的HAL庫,之前有用過std庫函式做STM32開發的基礎,因此學習HAL庫會更容易上手一些,但對於新的程式設計、下載工具以及HAL庫仍有許多不清晰的地方。經過初步的實驗實現點亮LED燈和串列埠的傳送資料之後,對所用到的幾個工具以及HAL庫進行一個總結。

[轉]設計模式--單例模式懶漢式餓漢式

打印 是否 調用構造 餓漢 一段 tools 會有 輸出結果 java 單例模式是設計模式中比較簡單的一種。適合於一個類只有一個實例的情況,比如窗口管理器,打印緩沖池和文件系統, 它們都是原型的例子。典型的情況是,那些對象的類型被遍及一個軟件系統的不同對象訪問,因此需要一個

Android內存優化DVMART原理初探

java虛擬機 劃分 cimage beef 靜態 由於 jar blank 查找 要學習Android的內存優化,首先要了解Java虛擬機,此前我用了多篇文章來介紹Java虛擬機的知識,就是為了這個系列做鋪墊。在Android開發中我們接觸的是與Java虛擬機類似的Dal

常用指令

chmod fse 結構 inf 詳細信息 job scribe 目錄 whatis Kafka常用命令: Consumer##控制臺發送消息./kafka-console-producer.sh --broker-list 集群IP:Port --topic t

vue.js實戰學習——內置指令

name 初始 節點 刪除 html元素 data post 編譯 16px 註:此內容摘抄自:梁灝的《Vue.js實戰》 註:記得要引入vue.js才能運行哦,文章中貼出的代碼直接復制是不行的,html css js 都放在了一起,而且也沒有引用vue.js。 1.v

Linux基本指令

linux基本操作指令一、管理虛擬機 [kiosk@foundation20 Desktop]$ rht-vmctl start desktop //開啟虛擬機 [kiosk@foundation20 Desktop]$ rht-vmctl view desktop //顯示虛擬機 [ki

docker安裝必要的配置。

cgroup deb secure expec dex store div post oca Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制

自動化運維工具Ansible實戰簡介部署

Ansible 自動化運維 一、Ansible的介紹 Ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點。實現了批量系統配置、批量程序部署、批量運行命令等功能。Ansible是基於模塊工作的,本身沒

Linux下的基本指令

文章目錄 1.檔案系統層次結構 1.1根目錄下重要的目錄 2. 對目錄進行操作 2.1 樹狀目錄結構的解釋 2.2 目錄的基本命令 1. cp 指令:複製一個或多個檔案

自動化測試-getpost的簡單應用

今天主要介紹兩種測試的介面post和get: get和post是http的兩種基本請求方式,區別在於get把引數包含在url中傳遞;給而post把引數以json或鍵值對的方式利用工具傳遞。 get的傳遞隨便找個遊覽器就可以進行介面測試: 舉個栗子:這是個獲取學生資訊的介面 介面資訊:1:url

作用域閉包上下文提升

上下文: 一段script 或者函式 全域性作用域: 一段script中 函式作用域: 函式中   變數提升 JS 引擎在解析js指令碼時,進入全域性作用域,首先提取變數宣告和函式宣告, 函式宣告在變數宣告之前, 提取到頂部 函式作用域解析過程(執行之前): 提取變數宣告,函式宣告,th

java學習筆記intInteger的區別

int和Integer的區別 1、Integer是int的包裝類,int則是java的一種基本資料型別 2、Integer變數必須例項化後才能使用,而int變數不需要 3、Integer實際是物件的引用,當new一個Integer時,實際上是生成一個指標指向此物件;而int則是直接儲存資料值

ES6學習---letconst用法

1.let用法 (1)存在作用域,即let宣告函式會在花括號中執行 (2)es6規定暫時性死區,暫時性死區通俗的來講就是一個區塊中存在let和const宣告的變數,那麼該區塊會形成封閉作用域,在let和const宣告之前使用該變數都會報錯。 //例子1 { console.lo

手遊客戶端的效能篇----UnityC#版之Foreach GC

          序:昨天去了南京的湯山紫清湖溫泉,安利一下,價格也不貴(不是打廣告。。。不貼怎麼訂票之類的,有興趣可以評論),還去見了多年未見的老友啊~不出意外的話下篇是手遊客戶端的效能篇(二)----Unity和C#版,想寫優化和效能想寫很久了

第七章 檔案管理——檔案檔案系統

**資料項:**描述物件某種屬性的字符集;是資料組織中可以命名的最小邏輯資料單位。 **記錄:**一組相關資料項集合,描述物件某方面的屬性; **關鍵字:**一個記錄中的一個或幾個資料項的集合,用於唯一的標識一個記錄。 檔案:由建立者定義的、具有檔名的一組相關元素的集合。 有結構:由相關記錄

react and reduxpropsstate

安裝 示例 總結 安裝 安裝好node.js和npm之後,命令列執行下面的命令: npm install --global create-react-app 建立應用目錄: create-react-app fi

Spark Streaming狀態管理函式——updateStateByKeymapWithState

updateStateByKey和mapWithState   什麼是狀態管理函式   updateStateByKey   mapWithState   updateStateByKey和mapWithState的區別   適用場景 什麼是狀態管理函

spring事務管理原始碼分析配置事務增強代理的生成流程

在本篇文章中,將會介紹如何在spring中進行事務管理,之後對其內部原理進行分析。主要涉及 @EnableTransactionManagement註解為我們做了什麼? 為什麼標註了@Transactional註解的方法就可以具有事務的特性,保持了資料的ACID特性?spring到底是如何具有這樣