1. 程式人生 > >IAR中優化等級對Kinetis FGPIO執行速度的影響

IAR中優化等級對Kinetis FGPIO執行速度的影響

在燈光控制、IO模擬Flex Bus等很多應用中,對GPIO的翻轉速度有很高的要求,M0+核心中集成了一個特定的single-cycle I/O port,Kinetis中我們稱之為Fast GPIO(FGPIO)。它可以完成對IO口的單週期load和store,主要的區別在於FGPIO的埠可以被核心零等待的訪問,於是可以達到Core Clock的速度,而普通GPIO需要核心通過內部的crossbar/AIPS來訪問,從而增加了時間上的延遲,使GPIO輸出頻率被限制。

        在客戶應用中發現,Codewarrior和KEIL IDE下只需要在程式碼中直接操作FGPIO的暫存器即可完成GPIO口48Mhz的翻轉速度,然而在IAR預設環境中使用同樣的起始程式碼和時鐘配置卻未能達到48M的翻轉速度,而僅有普通GPIO的速度8M左右。通常我們會從時鐘上找原因,http://tiyubisai.com/video_news/news_135616.html 

但是究其原因,發現原來IAR的優化等級對FGPIO的速度產生了影響,這點很容易被忽略,所以下面截圖詳細的做一對比:

         如下圖1,在IAR的優化選項“Optimizations Tab” 中,優化等級為“Low”,每一句FGPIO翻轉的語句 “FGPIOB_PTOR=0x02 ” 反彙編後的程式碼如圖2中紅色方框部分為三句,所以這也就大致解釋了GPIO輸出頻率只有8M左右(相當於翻轉速度16M,此處忽略程式while(1)的影響)。當更改IAR中“Optimizations Tab” 優化選項如下圖3為High(Speed優先)時,每一句FGPIO翻轉的語句 “FGPIOB_PTOR=0x02 ” 反彙編後的程式碼如圖4中紅色方框部分為一句,於是得到的GPIO輸出頻率為24M左右(相當於翻轉速度48M,同樣此處忽略程式while(1)的影響),剛好是未設定高優化等級之前的三倍,最終在硬體裝置上完成了對GPIO的單週期訪問和更改。

        總之,FGPIO的實際輸出速度出來和程式程式碼有關係之外,還和優化等級的設定有關係,需要使用者在實際應用中多加註意。有興趣的讀者可以拿未優化之前的程式碼和普通GPIO操作的程式碼做一對比,檢視反彙編程式碼長度、反彙編程式碼訪問的GPIO暫存器地址以及GPIO執行速度之間的關係,可以發現即便反彙編出來的程式碼長度一樣,由於訪問的暫存器地址不同也會導致GPIO輸出頻率的不同和差異。

圖1 . IAR中優化等級的預設設定 

圖2 . 在IAR預設的優化等級條件下,FGPIO翻轉語句反彙編程式碼

圖3. 更改IAR中預設優化等級設定

圖4. 更改IAR中預設優化等級設定後,FGPIO翻轉語句反彙編後代碼

http://blog.csdn.net/xiaoxiongli/article/details/49637973

http://blog.csdn.net/xiaoxiongli/

相關推薦

IAR優化等級Kinetis FGPIO執行速度影響

在燈光控制、IO模擬Flex Bus等很多應用中,對GPIO的翻轉速度有很高的要求,M0+核心中集成了一個特定的single-cycle I/O port,Kinetis中我們稱之為Fast GPIO(FGPIO)。它可以完成對IO口的單週期load和store,主要的區別

互補PWM關於死區佔空比的影響

1 今天在做專案的時候遇到一個很奇怪的問題,我的PWM頻率設定為28K 定時器佔空比設定為一個定值比如400,但是遇到一個很奇怪的問題,第一個佔空比會大一些,以後的佔空比都是同樣大的但是會比第一個佔空比小一些,這時候我設定的佔空比為3us。 2 當我把佔空比設定為1us佔空比都是一樣大。這是

優化提高VMware虛擬機器執行速度的技巧(詳細圖文教程)

vmware虛擬機器如何設定不當的話會造成執行速度慢,並影響主機執行,甚至會出現宕機。以下是提高vmware虛擬機器執行速度的幾個技巧,1        修改preference中的選項(全域性設定)a         進入設定介面的方法如下圖所示:這步也是關鍵步驟之一,否則

c++與Java繼承關係成員訪問許可權的影響之比較

c++中繼承關係對成員訪問許可權的影響: c++中父類定義的public成員,在子類中可以被覆寫為private;同樣的,父類中的private成員,在子類中可以是public。程式判斷一個例項對 成員是否有訪問許可權時,根據該例項在形式上是父類還是子類,所謂形式上,是說由於

Gitlab管理之二–Gitab創建項目並項目執行基本操作

bee dsw sam byte 密碼 rep posit -m rand 創建項目 (1)Gitlab項目的可見類型有三種級別。 Private project: 該級別是只有項目擁有者或者已經得到授權的人可以訪問該項目,或者這些人是該項目組的成員。Internal p

jsp嵌入的java代碼執行html的影響方式

就是 java代碼 align 嵌入 int 變量 ava 位置 作用 1 直接輸出html標簽嵌入到html中 <body> <h1>顯示當前時間和日期</h1> <% Date date = new Date();

java的Executors簡介與多執行緒在網站上逐步優化的運用案例

提供Executor的工廠類 忽略了自定義的ThreadFactory、callable和unconfigurable相關的方法 newFixedxxx:在任意時刻,最多有nThreads個執行緒在處理task;如果所有執行緒都在執行時來了新的任務,它會被扔

hadoop map、reduce數量mapreduce執行速度影響

增加task的數量,一方面增加了系統的開銷,另一方面增加了負載平衡和減小了任務失敗的代價;map task的數量即mapred.map.tasks的引數值,使用者不能直接設定這個引數。Input Split的大小,決定了一個Job擁有多少個map。預設input spli

IAR使用struct強制齊時的一個問題及解決

最近在用IAR開發MSP430程式過程中發現了一個問題,具體描述是這樣的 首先定義了一個struct並強制1個位元組對齊 #pragma pack(push) //儲存對齊狀態 #pragma pack(1)//設定為4位元組對齊 typedef struct { ui

KeilC/C++優化等級選幾?

拿到別人的一份程式碼,他選的是Level 3,如果選成 Level 0,連結會出錯。 這意味著什麼?如果需要優化後代碼才能執行,那是不是意味著,程式碼設計有問題(RAM的使用)? (1)3是最高優化,省了很多空間,0是

執行sh指令碼的export終端無效

當在一個終端shell中執行一個sh指令碼,本質是建立一個子程序來執行sh指令碼中的命令,當執行export時,變數加入子程序的環境變數(而非父程序shell). 當指令碼執行結束,子程序銷燬. 返回父程序,父程序的環境變數沒有任何變化. 應該執行: source na

MySql資料庫的優化-MySqlis NULL、ISNULL()和IFNULL()執行速度的比較

在查詢過程中,我們經常用到非空和is null的查詢,為了更高效的查詢,我們應該知道那種方法更快。在上一篇中,我們已經添加了一些資料。根據這些資料我們就可以來做一些驗證。第一步,is NULL要比ISNULL()的比較SELECT * from 表名 where 欄位名 is

Linux下ACL權限控制以及用sudo設置用戶命令的執行權限

以及 執行 nopasswd 設置 userdel file 指定 tool 必須 ACL權限分配 1.setfacl命令設置文件權限 setfacl -m u:user1:rw root.txt setfacl -m u:user2:rwx root.txt 2.getf

javascript的Date

日期 本地 接受 表示 new 設置 ear get 標準 Date是什麽? Date是日期類的構造函數 也是個對象,用於構造日期對象的實例。 有一個 now()方法,返回截止目前的時間戳(1970.1.1日始)。 Date.parse()接受 一定格式的日期字符串,返回

java等待所有線程都執行結束

main 線程池 靈活 問題 method timeunit 自動調用 trac block 轉自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是關於java中如何等待所有線程都執

JavaScript 的面向象編程

ron cti 面向 rip clas 使用 script pre func 使用JSON 來定義一個對象: <script type="text/javascript">var xiaoming = { name : ‘xiaoming‘, ag

JavaScript數組象詳解

稀疏數組 nsh isa 學習過程 bnf value 明顯 global sci Array對象即數組對象用於在單個變量中存儲多個值,JS的數組是弱類型的,所以允許數組中含有不同類型的元素,數組元素甚至可以是對象或者其他數組。 創建數組的語法 1、Array構造器 1

response.getWriter()和jsp的out象的區別

抽象 執行 resp 屬於 依賴 需要 int bsp write (1) out和response.getWriter屬於的類不同,前者是JspWriter,後者是java.io.PrintWriter。而JspWriter是一個抽象類, PrintWriter是一個繼承

PHP的面向象OOP的魔術方法

function 魔術 public 一、什麽是魔術方法:PHP為我們提供了一系列用__開頭的函數,這些函數無需自己手動調用,會在合適的時機自動調用,這類函數稱為魔術函數。例如:1function __construct(){} 在new一個新對象時自動調用此函數二、PHP中都有那些魔術方法,以及

函數內置

con 工作 調用 被人 實參 code fine src ole 函數的3大內置對象,在這裏只寫了2個,其中一個比較重要,而且在工作中很多人搞不懂,this到底代表誰。所以我單獨寫出來了 函數中內置的三大對象 1、arguments對象 2、環境變量對象 3、this對